![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
закрытие MDIChild формы [D5, Win2k]
ЦУКОР5 © (2005-02-19 13:48:00)Написал такой код :
procedure TForm6.FormClose(Sender: TObject; var Action: TCloseAction);
var FName:TFileName;
begin
FName := ReplaceStr(ParamStr(0),'.exe','.ini');
with TIniFile.Create(FName) do
try
WriteString('Form6','Branch',Ffname);
finally
Free;
end;
Form6:=nil;
Action:=CaFree;
end;
Юрий Зотов (2005-02-23 10:39:00) [1]> GanibalLector © (23.02.05 01:41) [16]
Не еще в [14], а только в [14].
Соответственно, на момент отсылки [11] и [13] это было неизвестно.
GanibalLector (2005-02-23 01:41:00) [2]2 Юрий Зотов © (22.02.05 10:01) [15]
> А если это форма, которая принципиально должна быть единственной, то нормально.
Дык в [14] еще приводил.Конечно единственная ;)
if (not assigned(Form2)) then Application.CreateForm(TForm2, Form2) ;
Юрий Зотов (2005-02-22 10:01:00) [3]> ЦУКОР5 (21.02.05 23:59) [14]
Не "неуверенно", а "предположительно". Потому, что это зависит от логики программы. В частности, от назначения TForm2.
Если это обычная дочерняя форма, которая может быть создана в нескольких экземплярах (как оно обычно и бывает - поэтому и "скорее всего"), то общая ссылка на них легко может стать источником ошибок. А если это форма, которая принципиально должна быть единственной, то нормально.
ЦУКОР5 (2005-02-21 23:59:00) [4]>А обнуление Form2, скорее всего, вообще не нужно.
А почему так не уверенно?Вы можете,например,обьяснить почему?
Кстати,если я этого не сделаю(Form2 := nil;) то у меня форма ВТОРОЙ раз не открывается.
Вызываю так :if (not assigned(Form2)) then Application.CreateForm(TForm2, Form2) ;
В dpr я ее не прописываю :
begin
Application.Initialize;
Application.Title:='STC-Istok :) ';
Application.CreateForm(TForm1, Form1);
//второй НЕТ
Application.CreateForm(TForm10, Form10);
Юрий Зотов (2005-02-21 05:50:00) [5]> в чем разница между [10] и [11]
В том, что если WriteString даст ошибку (что, по-видимому и происходит), то в [10] объект TIniFile зависнет в памяти (и получим ее утечку), а в [11] он будет уничтожен при любых условиях.
> надо ставить в конце, ибо я сохраняю размеры форм и прочее
Так и сохраняйте себе на здоровье. При чем тут Action?
А обнуление Form2, скорее всего, вообще не нужно. И даже более того, скорее всего, вообще не нужна переменная Form2. А если у Вас может быть создано несколько форм класса TForm2, то общая ссылка на них просто недопустима.
ЦУКОР5 (2005-02-21 02:06:00) [6]Честно говоря,я не особо понял в чем разница между [10] и [11].
И еще,Action := caFree;
Form2 := nil; // А это точно нужно?
мне надо ставить в конце,ибо я сохраняю размеры форм и прочее.
Юрий Зотов (2005-02-19 18:22:00) [7]procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
Form2 := nil; // А это точно нужно?
try
with TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini')) do
try
WriteString(...)
finally
Free
end
except
MessageDlg(...)
end
end;
ЦУКОР5 (2005-02-19 18:03:00) [8]ну,вроде вышло...только я не пойму в блоке except нужно ли делать free?
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
var FName:TFileName;
begin
FName := ReplaceStr(ParamStr(0),'.exe','.ini');
SetErrorMode(SEM_FAILCRITICALERRORS);
try
with TIniFile.Create(FName) do
begin
WriteString('Form2','Branch','455');
Free;
end;
except
messagedlg('íå ìîãó ïèñàòü!',mterror,[mbOk],0);
end;
Form2:=nil;
Action:=CaFree;
end;
Юрий Зотов (2005-02-19 17:42:00) [9]> ЦУКОР5 (19.02.05 17:32) [8]
Честно говоря, написано нечто маловразумительное, но это к разговору не относится.
К нему относится вот что: а где же здесь try-except?
ЦУКОР5 (2005-02-19 17:32:00) [10]2 Юрий Зотов © (19.02.05 16:47) [7]
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
var FName:TFileName;
begin
FName := ReplaceStr(ParamStr(0),'.exe','.ini');
try
TIniFile.Create(FName).WriteString('Form2','Branch','455');
finally
TIniFile.Create(FName).Free
end;
Form2:=nil;
Action:=CaFree;
end;
Юрий Зотов (2005-02-19 16:47:00) [11]> ЦУКОР5 (19.02.05 16:44) [6]
Раз чудес не бывает, значит, что-то было сделано не так. Показывайте код.
ЦУКОР5 (2005-02-19 16:44:00) [12]2 Юрий Зотов © (19.02.05 14:40) [5]
>Если нужно уничтожить форму безусловно, то что мешает взять в try-except весь блок работы с Ini-файлом?
делал я и так,как Вы сказали.Тоже самое,блин :(
Юрий Зотов (2005-02-19 14:40:00) [13]> ЦУКОР5 (19.02.05 13:50) [3]
IMHO, создавать TIniFile никто не запрещает, даже если нет прав на запись (ведь можно и только читать). Ошибка возникает при самой записи - WriteString. Соответственно, происходит вылет из метода и caFree не присваивается.
Если нужно уничтожить форму безусловно, то что мешает взять в try-except весь блок работы с Ini-файлом?
ЦУКОР5 (2005-02-19 14:28:00) [14]ШО,никто не поможет?
ЦУКОР5 (2005-02-19 13:50:00) [15]Насколько я понимаю,всему виной with TIniFile.Create(FName) do.Я и эту строчку обрамлял в try.. except,но не помогает.
Какие будут предложения?
ЦУКОР5 (2005-02-19 13:50:00) [16]Проблема в том,что если я запускаю свое приложение удаленно(т.е. не со своего ПК,а с некоторого другого И там доступ только чтение),то Child форма не закрывается!!
ЦУКОР5 (2005-02-19 13:49:00) [17]Проблема в том,что если я запускаю свое приложение удаленно(т.е. не со своего ПК,а с некоторого другого И там доступ только чтение),то Child форма не закрывается!!