![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ini [D2005, XP]
vain © (2006-08-28 11:12:00)
procedure TForm1.SaveToIni;
begin
sif:= TIniFile.Create(ExtractFilePath(Application.ExeName)+'positions.ini');
section:= 'window';
sif.WriteBool(section, 'maximized', (Form1.WindowState=wsMaximized));
sif.WriteInteger(section, 'width', Form1.Width);
sif.WriteInteger(section, 'height', Form1.Height);
end;
procedure TForm1.ReadFromIni;
begin
sif:= TIniFile.Create(ExtractFilePath(Application.ExeName)+'positions.ini');
section:= 'window';
If sif.ReadBool(section, 'maximized', false)
Then Form1.WindowState:= wsMaximized
Else begin
Form1.Width:= sif.ReadInteger(section, 'width', 735);
Form1.Height:= sif.ReadInteger(section, 'height', 502);
end;
end;
Не работает, записывает width и height те значения, которые устанавливались не этапе конструированиея (не 735 и 502).
В maximized тоже записывает 0.
Ещё вопрос. Почему Form.FormDestroy выполняется дважды?
Плохиш (2006-08-28 12:08:00) [1]
> А почему не понимаю.
Потому что переменная Form1 никакого отношения к классу TForm1 не имеет и может указывать куда угодно. В особенности в момент автосоздания объекта формы в программе начинающего.
vain (2006-08-28 12:04:00) [2]
> Наиль ©
Спасибо за дельные советы.
Наиль (2006-08-28 12:00:00) [3]Из [11] следует, что Form1 создавался дважды.
Есть другой вариант. В следствии наличия в программе Free или Destroy Form1 уничтожается. Поэтому к моменту сохранения он может не существовать. А в сочетании с автоматическим уничтожением формы при закрытии, получается двойной дестрой.
Ega23 (2006-08-28 11:45:00) [4]
> Ведь у меня только и был экземпляр Form1?
В купе с постом о дважды-вызове деструктора лично я в этом очень сильно сомневаюсь.
vain (2006-08-28 11:40:00) [5]
> Если объект создаётся в методе и уничтожатся (должен) в
> методе, то sif должен (но не обязан), быть локальной переменной.
Это я понимаю, просто var тоже в пост не скопировал.
>
> Старайся ни когда не использовать Form1 в тексте программы.
> Либо ни чего не пиши (Form1.Width -> Width), либо пиши
> self (Form1.Width -> self.Width).
Помогло. Спасибо. А почему не понимаю. Ведь у меня только и был экземпляр Form1?
Fay (2006-08-28 11:31:00) [6]2 vain © (28.08.06 11:27) [4]
> Какие ошибки могут вызвать вызывание метода destroy два раза?
Прининьзячивание одного обработчика на несколько событий.
Плохиш (2006-08-28 11:31:00) [7]
> Какие ошибки могут вызвать вызывание метода destroy два
> раза?
Пути начинающего не желающего думать неисповедимы.
Наиль (2006-08-28 11:30:00) [8]Масса ошибок. К перечисленым добавлю:
> procedure TForm1.SaveToIni;
> begin
> sif:= TIniFile.Create(ExtractFilePath(Application.ExeName)+'positions.ini');
Если объект создаётся в методе и уничтожатся (должен) в методе, то sif должен (но не обязан), быть локальной переменной.
> sif.WriteInteger(section, 'width', Form1.Width);
> sif.WriteInteger(section, 'height', Form1.Height);
Старайся ни когда не использовать Form1 в тексте программы. Либо ни чего не пиши (Form1.Width -> Width), либо пиши self (Form1.Width -> self.Width).
А двойной дестрой возникает из-за того, что в программе есть Form1.Free или просто Free.
Ega23 (2006-08-28 11:30:00) [9]
> Какие ошибки могут вызвать вызывание метода destroy два
> раза?
Как это какие? Один дополнительный Create
Dmitrij_K (2006-08-28 11:30:00) [10]
> Какие ошибки могут вызвать вызывание метода destroy два
> раза?
Например в OnDestroy вызвать метод Free формы
vain (2006-08-28 11:27:00) [11]
> sif.free по-твоему делать не надо?
Да делаю, просто скопировал только куски процедур, а не целиком.
> Ошибки в программе
Какие ошибки могут вызвать вызывание метода destroy два раза?
vain (2006-08-28 11:25:00) [12]Да нет же.
Я посмотрел, если поставить brackpoint в Form1.formdestroy, то в watch'e form1.width и height показываются такими, какими я их сделал на этапе конструирования. //Form1.WindowState тоже
Dmitrij_K (2006-08-28 11:19:00) [13]
> Почему Form.FormDestroy выполняется дважды?
Ошибки в программе
sif.free по-твоему делать не надо?
Плохиш (2006-08-28 11:18:00) [14]
> Не работает, записывает width и height те значения, которые
> устанавливались не этапе конструированиея
Form1.Width:= sif.ReadInteger(section, 'width', 735);
Form1.Height:= sif.ReadInteger(section, 'height', 502);
Вот поэтому и не работает.
> Ещё вопрос. Почему Form.FormDestroy выполняется дважды?
Потому что ошибка в программе.