Текущий архив: 2005.03.06;
Скачать: CL | DM;
Вниз
закрытие MDIChild формы Найти похожие ветки
← →
ЦУКОР5 (2005-02-19 13:48) [0]Написал такой код :
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;
← →
ЦУКОР5 (2005-02-19 13:49) [1]Проблема в том,что если я запускаю свое приложение удаленно(т.е. не со своего ПК,а с некоторого другого И там доступ только чтение),то Child форма не закрывается!!
← →
ЦУКОР5 (2005-02-19 13:50) [2]Проблема в том,что если я запускаю свое приложение удаленно(т.е. не со своего ПК,а с некоторого другого И там доступ только чтение),то Child форма не закрывается!!
← →
ЦУКОР5 (2005-02-19 13:50) [3]Насколько я понимаю,всему виной with TIniFile.Create(FName) do .Я и эту строчку обрамлял в try.. except,но не помогает.
Какие будут предложения?
← →
ЦУКОР5 (2005-02-19 14:28) [4]ШО,никто не поможет?
← →
Юрий Зотов © (2005-02-19 14:40) [5]> ЦУКОР5 (19.02.05 13:50) [3]
IMHO, создавать TIniFile никто не запрещает, даже если нет прав на запись (ведь можно и только читать). Ошибка возникает при самой записи - WriteString. Соответственно, происходит вылет из метода и caFree не присваивается.
Если нужно уничтожить форму безусловно, то что мешает взять в try-except весь блок работы с Ini-файлом?
← →
ЦУКОР5 (2005-02-19 16:44) [6]2 Юрий Зотов © (19.02.05 14:40) [5]
>Если нужно уничтожить форму безусловно, то что мешает взять в try-except весь блок работы с Ini-файлом?
делал я и так,как Вы сказали.Тоже самое,блин :(
← →
Юрий Зотов © (2005-02-19 16:47) [7]> ЦУКОР5 (19.02.05 16:44) [6]
Раз чудес не бывает, значит, что-то было сделано не так. Показывайте код.
← →
ЦУКОР5 (2005-02-19 17:32) [8]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 17:42) [9]> ЦУКОР5 (19.02.05 17:32) [8]
Честно говоря, написано нечто маловразумительное, но это к разговору не относится.
К нему относится вот что: а где же здесь try-except?
← →
ЦУКОР5 (2005-02-19 18:03) [10]ну,вроде вышло...только я не пойму в блоке 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 18:22) [11]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-21 02:06) [12]Честно говоря,я не особо понял в чем разница между [10] и [11].
И еще,Action := caFree;
Form2 := nil; // А это точно нужно?
мне надо ставить в конце,ибо я сохраняю размеры форм и прочее.
← →
Юрий Зотов © (2005-02-21 05:50) [13]> в чем разница между [10] и [11]
В том, что если WriteString даст ошибку (что, по-видимому и происходит), то в [10] объект TIniFile зависнет в памяти (и получим ее утечку), а в [11] он будет уничтожен при любых условиях.
> надо ставить в конце, ибо я сохраняю размеры форм и прочее
Так и сохраняйте себе на здоровье. При чем тут Action?
А обнуление Form2, скорее всего, вообще не нужно. И даже более того, скорее всего, вообще не нужна переменная Form2. А если у Вас может быть создано несколько форм класса TForm2, то общая ссылка на них просто недопустима.
← →
ЦУКОР5 (2005-02-21 23:59) [14]>А обнуление 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-22 10:01) [15]> ЦУКОР5 (21.02.05 23:59) [14]
Не "неуверенно", а "предположительно". Потому, что это зависит от логики программы. В частности, от назначения TForm2.
Если это обычная дочерняя форма, которая может быть создана в нескольких экземплярах (как оно обычно и бывает - поэтому и "скорее всего"), то общая ссылка на них легко может стать источником ошибок. А если это форма, которая принципиально должна быть единственной, то нормально.
← →
GanibalLector © (2005-02-23 01:41) [16]2 Юрий Зотов © (22.02.05 10:01) [15]
> А если это форма, которая принципиально должна быть единственной, то нормально.
Дык в [14] еще приводил.Конечно единственная ;)if (not assigned(Form2)) then Application.CreateForm(TForm2, Form2) ;
← →
Юрий Зотов © (2005-02-23 10:39) [17]> GanibalLector © (23.02.05 01:41) [16]
Не еще в [14], а только в [14].
Соответственно, на момент отсылки [11] и [13] это было неизвестно.
Страницы: 1 вся ветка
Текущий архив: 2005.03.06;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.065 c