Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.17;
Скачать: CL | DM;

Вниз

Ini   Найти похожие ветки 

 
vain ©   (2006-08-28 11:12) [0]


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 11:18) [1]


> Не работает, записывает width и height те значения, которые
> устанавливались не этапе конструированиея


       Form1.Width:= sif.ReadInteger(section, "width", 735);
       Form1.Height:= sif.ReadInteger(section, "height", 502);

Вот поэтому и не работает.

> Ещё вопрос. Почему Form.FormDestroy выполняется дважды?

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


 
Dmitrij_K   (2006-08-28 11:19) [2]


>  Почему Form.FormDestroy выполняется дважды?

Ошибки в программе

sif.free по-твоему делать не надо?


 
vain ©   (2006-08-28 11:25) [3]

Да нет же.
Я посмотрел, если поставить brackpoint в Form1.formdestroy, то в watch"e form1.width и height показываются такими, какими я их сделал на этапе конструирования. //Form1.WindowState тоже


 
vain ©   (2006-08-28 11:27) [4]


> sif.free по-твоему делать не надо?

Да делаю, просто скопировал только куски процедур, а не целиком.

> Ошибки в программе

Какие ошибки могут вызвать вызывание метода destroy два раза?


 
Наиль ©   (2006-08-28 11:30) [5]

Масса ошибок. К перечисленым добавлю:
> 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) [6]


> Какие ошибки могут вызвать вызывание метода destroy два
> раза?


Как это какие? Один дополнительный Create


 
Dmitrij_K   (2006-08-28 11:30) [7]


> Какие ошибки могут вызвать вызывание метода destroy два
> раза?

Например в OnDestroy вызвать метод Free формы


 
Fay ©   (2006-08-28 11:31) [8]

2 vain ©   (28.08.06 11:27) [4]
> Какие ошибки могут вызвать вызывание метода destroy два раза?
Прининьзячивание одного обработчика на несколько событий.


 
Плохиш ©   (2006-08-28 11:31) [9]


> Какие ошибки могут вызвать вызывание метода destroy два
> раза?

Пути начинающего не желающего думать неисповедимы.


 
vain ©   (2006-08-28 11:40) [10]


> Если объект создаётся в методе и уничтожатся (должен) в
> методе, то sif должен (но не обязан), быть локальной переменной.

Это я понимаю, просто var тоже в пост не скопировал.

>
> Старайся ни когда не использовать Form1 в тексте программы.
>  Либо ни чего не пиши (Form1.Width -> Width), либо пиши
> self (Form1.Width -> self.Width).

Помогло. Спасибо. А почему не понимаю. Ведь у меня только и был экземпляр Form1?


 
Ega23 ©   (2006-08-28 11:45) [11]


> Ведь у меня только и был экземпляр Form1?


В купе с постом о дважды-вызове деструктора лично я в этом очень сильно сомневаюсь.


 
Наиль ©   (2006-08-28 12:00) [12]

Из [11] следует, что Form1 создавался дважды.
Есть другой вариант. В следствии наличия в программе Free или Destroy Form1 уничтожается. Поэтому к моменту сохранения он может не существовать. А в сочетании с автоматическим уничтожением формы при закрытии, получается двойной дестрой.


 
vain ©   (2006-08-28 12:04) [13]


> Наиль ©

Спасибо за дельные советы.


 
Плохиш ©   (2006-08-28 12:08) [14]


> А почему не понимаю.

Потому что переменная Form1 никакого отношения к классу TForm1 не имеет и может указывать куда угодно. В особенности в момент автосоздания объекта формы в программе начинающего.



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.066 c
1-1154508723
IGray
2006-08-02 12:52
2006.09.17
Ищу компонент - ресайзовый уголок (как в TScrollBar)


8-1141204700
Sour Smile
2006-03-01 12:18
2006.09.17
Как проиграть несколько звуков одновременно?


15-1156430622
vidiv
2006-08-24 18:43
2006.09.17
Быстрый поиск в упорядоченном массиве.


8-1141647509
race1
2006-03-06 15:18
2006.09.17
Кусок Wav-файла


15-1156124990
Ringo
2006-08-21 05:49
2006.09.17
Давайте создавать мидлеты для мобильников на Паскале!