Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 выполняется дважды?

Потому что ошибка в программе.


Наверх

Титульная страница Поиск, карта сайта Написать письмо