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

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

закрытие 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 форма не закрывается!!


Наверх

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