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

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

Модальная форма [D7]


Андрей (начинающий) ©   (2009-03-12 14:52:00) 


   for i:=0 to 3 do  
     if frmUser=nil then begin
       frmUser:=TfrmUser.Create(Application);
       try    
         frmUser.ShowModal;
         if frmUser.ModalResult = mrOk
           then begin
             // ...              
           end
           else ;
       finally
         frmUser.Free;
       end;
     end // *** if frmUser=nil then
     else ShowMessage('frmUser<>nil');

Почему после первого создания формы и ее закрытия все-таки выскакивает вставленный в код ShowMessage?
Что я делаю не так?


Эстет   (2009-03-12 15:35:00) [1]

Она же модальная, а при выходе из нее ты ее уничтожаешь. Ее просто не может быть на момент проверки.


Медвежонок Пятачок   (2009-03-12 15:34:00) [2]

Ты на строчку создания просто не попадешь если она уже создана и у нее вызван шоумодал.
если попал на строчку создания, значит ее уже нет.


Андрей (начинающий)   (2009-03-12 15:31:00) [3]


> Медвежонок Пятачок ©   (12.03.09 15:05) [6]
> зачем вообще здесь нилить

Хотелось проверить перед открытием новой формы, не создана ли уже она ..


Андрей (начинающий)   (2009-03-12 15:20:00) [4]

Всем спасибо, понял :)


Тын-Дын   (2009-03-12 15:17:00) [5]


> Медвежонок Пятачок ©   (12.03.09 15:11) [10]
> for i := 0 to 2 do with TForm2.Create(Application) do  try
>    DoSomething;  finally    Free;  end;Все остальное лишнее


Я знаю, что земля не круглая.


Медвежонок Пятачок   (2009-03-12 15:14:00) [6]

И какую переменную должен занилить деструктор и примера в [10] ?


Медвежонок Пятачок   (2009-03-12 15:13:00) [7]

Т.е. ни Free ни Destroy не присваивают nil ?

var v1,v2,v3,v4,v5 ..... v1000 : TForm1;
begin
v1 := TForm1.Create();
v2 := v1;
v3 := v1;
.....
v1000 := v1;

v3.Free;

Какую именно переменную должен занилить деструктор? И с какой стати это ему делать вообще?


Медвежонок Пятачок   (2009-03-12 15:11:00) [8]

for i := 0 to 2 do
with TForm2.Create(Application) do
 try
   DoSomething;
 finally
   Free;
 end;

Все остальное лишнее


Ega23   (2009-03-12 15:10:00) [9]


> Т.е. ни Free ни Destroy не присваивают nil ?


Нет. И не должны.


Андрей (начинающий)   (2009-03-12 15:08:00) [10]

Процедура Free применяется для освобождения памяти, динамически выделенной под объект.
Процедура Free проверяет, не была ли ранее уже освобождена выделенная под объект память и вообще был ли данный объект создан (не равен ли указатель на объект nil). После этого вызывается метод Destroy.
Метод Destroy вызывает деструктор объекта, что приводит к его разрушению и освобождению занимаемой им памяти.

Т.е. ни Free ни Destroy не присваивают nil ?


Тын-Дын   (2009-03-12 15:07:00) [11]


> Андрей (начинающий)   (12.03.09 14:52) 


У тебя один из немногих случаев, в котором оправдано использование with:

procedure TForm1.Button1Click(Sender: TObject);
begin
 with TForm2.Create(Application) do
 begin
   try
     if ShowModal=mrOk then ShowMessage('OK')
     else ;
   finally
     Release;
   end;
 end;
end;


Либо из твоего примера:

var
 Frm: TForm;


...

procedure TForm1.Button2Click(Sender: TObject);
var
 i: Integer;
begin
 for i := 0 to 2 do
 begin
   if not Assigned(Frm) then
   begin
     Frm := TForm2.Create(Application);
     try
       if Frm.ShowModal=mrOk then ShowMessage('OK');
     finally
       FreeAndNil(Frm);
     end;
   end;
 end;
end;


Медвежонок Пятачок   (2009-03-12 15:05:00) [12]

зачем вообще здесь нилить, и зачем проверять на нил перед вызовом конструткора.
форма-то модальная.


Ega23   (2009-03-12 15:02:00) [13]

      finally
        frmUser.Free;
        frmUser := nil;
      end;


Медвежонок Пятачок   (2009-03-12 14:57:00) [14]

Что я делаю не так?

И еще многое другое


{RASkov}   (2009-03-12 14:55:00) [15]

> Что я делаю не так?

Сравниваешь с nil а сам не нилишь...


Сергей М.   (2009-03-12 14:55:00) [16]

Вместо frmUser.Freeпиши FreeAndNil(frmUser)


Медвежонок Пятачок   (2009-03-12 14:54:00) [17]

код выполняется потому что frmUser <> nil


Наверх

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