Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
1-1108654275
Ji
2005-02-17 18:31
2005.03.06
Формат даты и времени


6-1103822762
Alexey Romanskiy
2004-12-23 20:26
2005.03.06
Как узнать свой ай-пишник?


3-1107784366
NorthMan
2005-02-07 16:52
2005.03.06
AdoQuery и Insert


4-1106554241
tradakad
2005-01-24 11:10
2005.03.06
замена черного цвета прозрачным на карте бит


14-1108487639
Petr V. Abramov
2005-02-15 20:13
2005.03.06
Хорошая статья по управлению памятью в Linux