Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

           Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
           И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - https://clck.ru/fCqwP

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2008, 02:48   #1
dr.Chas
***
СуперМодератор
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
Печаль Ини файл ошибка(глюк или что?)

Ситуация такая:
Программка которую пишу большая, так что я иногда некоторые процедуры отлаживаю, в новой программе, т.е создаю программу, делаю такие же условия там, доделываю процедуры, потом переношу в основную. Так вот сделал пару процедур, переношу в основную программу, всё так же, перепроверил, всё тоже самое, индентично. В одной работает это, а в другой вот такая ошибка

Это бяка вылазиет в событие close формы
Код:
Ini:=TIniFile.Create(Application.GetNamePath+IniFName);
for i:=1 to MainMenu1.Items.Items[0].Items[9].Count do
  Ini.WriteString('History', 'Open_'+IntToStr(i), MainMenu1.Items.Items[0].Items[9].Items[i-1].Caption);
Ini.Destroy;
После первой работы цикла.
Может кто знает что это может быть? Суть ошибки я понял, но не могу понять её причину
dr.Chas вне форума Ответить с цитированием
Старый 17.06.2008, 10:23   #2
N!ckeL
Форумчанин
 
Регистрация: 29.03.2008
Сообщений: 300
По умолчанию

Возможно файл занят другой программой, если нет значит убери Ini.Destroy и добавь его в Form.OnDestroy.
Карп преодолевший водопад становится драконом.
N!ckeL вне форума Ответить с цитированием
Старый 17.06.2008, 12:49   #3
dr.Chas
***
СуперМодератор
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

Цитата:
Сообщение от N!ckeL Посмотреть сообщение
Возможно файл занят другой программой, если нет значит убери Ini.Destroy и добавь его в Form.OnDestroy.
Нет к сожалнею проблема в другом. Для полноты картины ща напишу по подробнее:
Процедура create:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
    s:='';
    //IniFName:=Application.GetNamePath+'Fails\history.ini'; 1) способ
    IniFName:='history.ini';   //2) способ
    MainMenu1.Items[0].Items[9].Enabled:=false;
    if FileExists({Application.GetNamePath+IniFName}IniFName) then
    begin
      Ini:=TIniFile.Create({Application.GetNamePath+}IniFName);
      for i:=0 to 10 do
      begin
        s:=Ini.ReadString('History', 'Open_'+IntToStr(i),'');
        //дальше не буду с этим всё нормально
      end;
      Ini.Destroy;
    end;
end;
Процедура close:
Код:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Ini:=TIniFile.Create({Application.GetNamePath+IniFName || Способ 1}   IniFName{способ 2});
    for i:=1 to MainMenu1.Items.Items[0].Items[9].Count do
      Ini.WriteString('History', 'Open_'+IntToStr(i), 
       MainMenu1.Items.Items[0].Items[9].Items[i-1].Caption);
    Ini.Destroy; 
end;
Я там сделал метки:
1 способ - в событие close вылазила вот та ошибка которую я описывал выше;
2 способ - т.е. задавал просто имя файла, значит файл записываеться в папку Windows. Так теперь не работает это
Код:
if FileExists(IniFName) then
Функция FileExists - проверяет существует ли такой файл, если да то true. А она даёт false хотя там этот же файл. Зато теперь клосе работает нормально.

За то в первой программе всё работает без ошибок как надо. Кто нибудь знает что это?
P.S.: Сори если много написал, но я уже не понимаю что это
dr.Chas вне форума Ответить с цитированием
Старый 17.06.2008, 13:41   #4
Ring0Sn
Форумчанин
 
Аватар для Ring0Sn
 
Регистрация: 06.09.2007
Сообщений: 239
По умолчанию

в первом способе вместо
Код:
  Ini:=TIniFile.Create({Application.GetNamePath+IniFName || Способ 1}   IniFName{способ 2});
напиши вот это:
Код:
Ini:=TIniFile.Create(IncludeTrailingPathDelimiter(ExtractFileDir(ParamStr(0))) + IniFName);
у тебя в путях косяк..., а точнее Application.GetNamePath в твоем случае ничего невозвратит

Последний раз редактировалось Ring0Sn; 17.06.2008 в 13:47.
Ring0Sn вне форума Ответить с цитированием
Старый 17.06.2008, 13:57   #5
Arteom
Пользователь
 
Регистрация: 22.08.2007
Сообщений: 59
По умолчанию

Я бы советовал делать так:
try
ini_file := TIniFile.Create(extractfilepath(par amstr(0)) + 'history.ini' );
finally
ini_file.free;
Arteom вне форума Ответить с цитированием
Старый 17.06.2008, 14:10   #6
Ring0Sn
Форумчанин
 
Аватар для Ring0Sn
 
Регистрация: 06.09.2007
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Arteom Посмотреть сообщение
Я бы советовал делать так:
try
ini_file := TIniFile.Create(extractfilepath(par amstr(0)) + 'history.ini' );
finally
ini_file.free;
Неправильно советуешь то...
В твоем случае если ini_file неинициализируеться (ну например у тебя нету прав для записи на диск),
произойдет выход из блока try, и выполниться finally, а там дадут по рукам, за то что хочешь уничтожить обьект, ктр не создан
Ring0Sn вне форума Ответить с цитированием
Старый 17.06.2008, 14:30   #7
Arteom
Пользователь
 
Регистрация: 22.08.2007
Сообщений: 59
По умолчанию

Согласен, это тут не учтено, но для большинства случаев подходит и на мой взгляд очень удобно.
Arteom вне форума Ответить с цитированием
Старый 17.06.2008, 15:12   #8
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

А это зачем? Ini.Destroy;
Дельфи справку хоть раз читал? Не вызывайте Destroy напрямую, вызывайте вместо этого Free, это всех объектов касается.

Путь к программе: ExtractFilePath(Application.EXEName )

Вообще сделай лучше так:
Код:
var
IniFName: string;

//FormCreate
begin
IniFName := ExtractFilePath(Application.EXEName) + 'инифайл.ini';
end;
И все, весь путь у тебя в одной переменной. Захочешь, не напутаешь.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 17.06.2008 в 15:30.
mutabor вне форума Ответить с цитированием
Старый 17.06.2008, 18:48   #9
dr.Chas
***
СуперМодератор
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

mutabor Вот спасиба, воспользовался твоим способом. А по поводу
Ini.Destroy; я же это не из головы взял, так написано в учебнике В.В. Фараонов "Delphi Программирование на языке выского уровня". Ну теперь буду знать.
P.S.: Спс всем кто откликнулся.
dr.Chas вне форума Ответить с цитированием
Старый 18.06.2008, 06:36   #10
Черничный
Форумчанин
 
Регистрация: 27.01.2007
Сообщений: 293
По умолчанию

а если *.Destroy не вызывать, что это очень многа место в памяти занимает? Программа завершиться и все само дестроится
Черничный вне форума Ответить с цитированием
Ответ

           Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
           Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глюк )) theos О форуме и сайтах клуба 9 08.01.2008 17:44
Ошибка при записи в файл txt Alex_Ku Помощь студентам 2 28.04.2007 12:15
Глюк? Или я туплю? Nick93.93 Общие вопросы Delphi 6 04.03.2007 14:28