Функция LoadFromFile в Delphi.
12049
22
Следующая инструкция вызывает ошибку во время компиляции:
Form1.ListBox.Items.LoadFromFile('d:\profile.dat');
Скриншоты в аттаче.
Вопрос: Я что-то делаю не так, или может просто лыжи не едут?
Deft
Следом выскакивает вот такое окошко. По коду это "Общая ошибка защиты (General protection fault)"
Deft
скорее всего файло некорректно сохранено и программа не может загрузить элементы списка :спок:
craxx
Файл создается функцией FileCreate. Даже если вручную создать этот файл в блокноте, то получается та же фигня. В C++Builder эта инструкция работала вполне корректно.
Deft
Я не большой спец.
Но осмелюсь предположить. Если Delphi5 то могут быть глюки компилятора или еще Бог знает чего.
У меня в одной проге при компиляции в 4 версии одна функция работала (Получить с TChart.Canvas изображение и перекинуть его в TImage) При компиляции в 5 версии упорно выдавала ошибку на эту функцию в 6,7 снова все в норме. Так что может не твои лыжи не едут?
Господин Уэф!
Но осмелюсь предположить. Если Delphi5 то могут быть глюки компилятора или еще Бог знает чего.
Delphi 7. Но я тоже склоняюсь к версии, что это глюк компилятора. Приду домой и попробую 6-ю версию.
Господин Уэф!
Понял в чем проблема. Инструкция у меня прописана в разделе initialization, поэтому выскакивает ошибка. Как убрать ее из этого раздела, если мне нужно, чтобы она выполнялась при запуске программы? (Не бейте за тупые вопросы, я раньше писАл на С++, а Дельфи изучаю недавно :o:улыб::ха-ха!:)
Deft
Извини я сам не силен. Не знаю что за раздел.
Deft
Наверное ручками берешь и переносишь.
Вот что нашел в справке:

Каждый модуль в общем случае имеет структуру:

unit ;

interface // Открытый интерфейс модуля

{Сюда могут помещаться списки подключаемых модулей, объявления типов, констант, переменных, функций и процедур, к которым будет доступ из других модулей }

implementation // Реализация модуля

{Сюда могут помещаться списки подключаемых модулей, объявления типов, констант, переменных, к которым не будет доступа из других модулей. Тут же должны быть реализации всех объявленных в разделе interface функций и процедур, а также могут быть реализации любых дополнительных, не объявленных ранее функций и процедур.}

initialization {не обязательный}



finalization {не обязательный}


end.
Deft
В конструкторе формы прописываешь... и все будет нормально. :спок:
craxx
Вчера подумал малость и сделал так:
procedure TForm1.FormCreate(Sender: TObject);
begin
Newdirname:=GetCurrentDir;
Profile:=(Newdirname+'\profile.dat');
if FileExists(Profile)=false then FileClose(FileCreate(Profile));
Form1.ListBox.Items.LoadFromFile(Newdirname+'\profile.dat');
end;
Deft
Я об этом и писал.
craxx
Я так и понял. :улыб:Спасибо.
Deft
нельзя так делать.
Form1 - глобальная переменная. Она может быть
1. не инициализирована вообще (если отключено автосоздание форм проекта)
2. проинициализирована не тем экземпляром.

И вообще - слишком много действий...

procedure TForm1.FormCreate(Sender: TObject);
var
FileName: String;
begin
FileName := ExtractFileName(Application.Exename) + 'profile.dat';
if FileExists(FileName) then
ListBox.Items.LoadFromFile(FileName);
end;
Ну да, ты прав... просто я не обратил внимание что у автора в коде конструктора обращение к экземпляру объекта.
Deft
Так я не понял заработало или нет.

Я постоянно пользую для считывния текстовых файлов TStringList.LoadFromFile. Правда не проверяю на его наличие, а делаю в теле try ... except

Писал и в 5-й и в 7-й версиях, все работало. Данные ошибки, как мне кажется связаны с системой. Аксес вайлэшн - кто-то еще пользует.

Или я ошибаюсь?!
Юра
Данные ошибки, как мне кажется связаны с системой
Не знаю, пробовал на двух разных машинах с абсолютно разными конфигурациями. Я писАл выше, что ошибка появляется только тогда, когда инструкция прописана в разделе initialization.
Так я не понял заработало или нет.
Да. После перемещения в конструктор формы.
нельзя так делать.
Form1 - глобальная переменная. Она может быть
1. не инициализирована вообще (если отключено автосоздание форм проекта)
2. проинициализирована не тем экземпляром.
Кстати, забыл сказать, эта форма главная и единственная, так что, наверное, можно......
craxx
Блин, только сейчас догнал-- инструкции раздела initialization выполняются в самом начале программы, то есть, видимо, перед обращением к конструктору формы, а так как я пытался обратиться к свойству объекта, размещенного на этой форме, то............
Deft
это просто плохой стиль
так делать в принципе можно, но не рекомендуется
а главная форма может когданибудь перестать быть главной. На все воля божья.
Использование глобальных переменных находится вне парадигмы ООП
Deft
нельзя так делать.
Form1 - глобальная переменная. Она может быть
1. не инициализирована вообще (если отключено автосоздание форм проекта)
2. проинициализирована не тем экземпляром.
Кстати, забыл сказать, эта форма главная и единственная, так что, наверное, можно......
И все равно так нельзя. Удали Form1. и будет нормально!
craxx
Действительно, туплю......:смущ: