Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.26;
Скачать: CL | DM;

Вниз

Модальная форма   Найти похожие ветки 

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


   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 14:54) [1]

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


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

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


 
{RASkov} ©   (2009-03-12 14:55) [3]

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

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


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

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

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


 
Ega23 ©   (2009-03-12 15:02) [5]

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


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

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


 
Тын-Дын ©   (2009-03-12 15:07) [7]


> Андрей (начинающий)   (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:08) [8]

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

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


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


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


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


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

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

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


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

Т.е. ни 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:14) [12]

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


 
Тын-Дын ©   (2009-03-12 15:17) [13]


> Медвежонок Пятачок ©   (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:20) [14]

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


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


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

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2009.04.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
2-1236668653
petvv
2009-03-10 10:04
2009.04.26
Текст с разделителями.


15-1235299343
Den_
2009-02-22 13:42
2009.04.26
Что бы придумать для своей программы (не совсем шароварное)?


15-1235110897
Дмитрий С
2009-02-20 09:21
2009.04.26
Почему не работает SwitchDesktop ?


15-1235338204
Юрий
2009-02-23 00:30
2009.04.26
С днем рождения ! 23 февраля 2009 понедельник


2-1237270945
b@v
2009-03-17 09:22
2009.04.26
как запретить вводить символы в TEdit