Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.12.2015, 22:35
Аватар для Speech
Speech Speech вне форума
Новичок
 
Регистрация: 16.02.2012
Сообщения: 55
Репутация: 10
По умолчанию Проблема с ListBox после использования LoadFromFile

Значит есть компонент ListBox. В него вносятся построчно данные:
Код:
ListBox1.Items.Add('some information');
При клацании мышкой на компонент или же просто переход с помощью клавиш курсора выделенные данные где-то используются:
Код:
      if ListBox1.ItemIndex >= 0 then
        begin
          SomeProcedure(ListBox1.Items[ListBox1.ItemIndex], 1);
          ListBox2.Items.Add(ListBox1.Items[ListBox1.ItemIndex]);
          ListBox1.Items.Delete(ListBox1.ItemIndex);
        end;
SomeProcedure - обрабатывает данные, остальные две строки - просто переносят выделенный Items в другой ListBox.

После таких нехитрых манипуляций - сохраняем наши изменения в файл:
Код:
ListBox1.Items.SaveToFile('info.txt');
А теперь начинаются проблемы. Загружаем вновь данные из файла:
Код:
ListBox1.Items.LoadFromFile('info.txt');
Загружается конечно, но теперь перестает работать вот эта строка:
Код:
SomeProcedure(ListBox1.Items[ListBox1.ItemIndex], 1);
Ошибки не выдает - просто не работает. Две остальные строки кода работают как положено. Вот и ломаю голову в чем может быть причина?
Если есть какой-то нюанс - прошу подметить.
Спасибо
Ответить с цитированием
  #2  
Старый 22.12.2015, 00:31
Аватар для Speech
Speech Speech вне форума
Новичок
 
Регистрация: 16.02.2012
Сообщения: 55
Репутация: 10
По умолчанию

Нет, я точно с ума сойду.
Даже после загрузки элемент ListBox на самом деле выводится:
Код:
ShowMessage(ListBox1.Items[ListBox1.ItemIndex]);
Так показывает все как положено.
Просматривал даже через отладчик - такое впечатление что просто не видит процедуры "SomeProcedure" - шагает просто мимо нее! И там не зарезервированное название процедуры. Ведь до сохранения в файл работает как надо.
Голову почти сломал
Ответить с цитированием
  #3  
Старый 22.12.2015, 01:40
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Иногда, у компилятора Дельфи сносит крышу. Поведение очень схожее. Помогает просто переформатирование кода, добавление нафик не нужных бегинов и т.д. Попробуйте тупо в критическую секцию поместить вызов вашей процедуры.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
Speech (22.12.2015)
  #4  
Старый 22.12.2015, 02:45
Аватар для Speech
Speech Speech вне форума
Новичок
 
Регистрация: 16.02.2012
Сообщения: 55
Репутация: 10
По умолчанию

Ясно спасибо. Теперь хоть знаю что похожие проблемы и у других бывают. Значит действительно такой компилятор.
Пробовал только что и разные begin..end вставлять, и процедуру переименовывать - все тщетно. Будто вообще нету той строки кода с вызовом процедуры.
Что самое примечательное - другие процедуры (написанные мной) запускаются.
А с этой и даже такой вариант не проходит:
Код:
SomeProcedure('some information', 1);
Может просто тупо обойти и сделать загрузку данных из файла вручную?
Но это уже будет завтра. Если что - отпишусь.
Если получится и кто-то это в будущем прочитает - то может сохранит свой ясный разум, и не будет биться головой об монитор
Ответить с цитированием
  #5  
Старый 22.12.2015, 08:28
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Долго и нудно пытался повторить вашу ашипку, но не получилось, да и не должно её быть в принципе, поскольку итемы в ListBox это обычные строки и сохранение\загрузка содержимого происходит средствами класса TStrings, попробуйте скомпилить, будет-ли глюк?
Вложения
Тип файла: zip ListBx.zip (1.8 Кбайт, 2 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Speech (22.12.2015)
  #6  
Старый 22.12.2015, 13:39
Аватар для Speech
Speech Speech вне форума
Новичок
 
Регистрация: 16.02.2012
Сообщения: 55
Репутация: 10
По умолчанию

Alegun, спасибо за потраченное время - этот пример работает.
Сделал загрузку файлов вручную с помощью цикла и последующем добавлении в ListBox - тщетно.
На таком пустяке уже 2-й день сижу. Постараюсь вырезать тот участок кода и полностью выложить сюда.
Ответить с цитированием
  #7  
Старый 22.12.2015, 20:21
Аватар для Speech
Speech Speech вне форума
Новичок
 
Регистрация: 16.02.2012
Сообщения: 55
Репутация: 10
По умолчанию

Проблема решена.

Процедура подгружала файлы из папки в корне программы.
Загрузка данных в ListBox осуществлялась через OpenDialog из соседней папки также в корне программы.
Но при использовании повторно SomeProcedure путь к файлам искажался.

Если для начала достаточно было написать
Код:
If FileExists('Avatars\' + Data1 + '.jpg') then
        Form1.Image1.Picture.LoadFromFile('Avatars\' + Data1 + '.jpg');
То после загрузки данных из папки "Saves" путь к файлам преобразовывался в вид "Saves\Avatars".
Проблема решена вот таким пустяком.
Код:
If FileExists(ExtractFilePath(Application.ExeName) + 'Avatars\' + Data1 + '.jpg') then
        Form1.Image1.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Avatars\' + Data1 + '.jpg');
Но для меня по прежнему осталось загадкой - каким боком где-то в памяти остался путь к папке "Saves", когда он вообще использовался в OpenDialog? И почему в отладчике просто пропускало данную процедуру, даже не пытаясь что-то там обработать?
Ведь если бы отладчик показал изначально неверный путь к файлу - проблему нашел бы сразу, и не пришлось бы создавать тему на форуме.
Ответить с цитированием
  #8  
Старый 22.12.2015, 21:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

по умолчанию, OpenDialog (Save тоже) меняет текущую папку. Что бы он этого не делал, надо у диалога в Options отключить эту фичу.
А вот почему отладчик глючит... да фих его знает, но отладчик крайних версий замечен за такой фигней...
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Speech (22.12.2015)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:49.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter