Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
Андрей (начинающий)   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
2-1236771470
dplz
2009-03-11 14:37
2009.04.26
Связанные переменные во всех формах


2-1237201177
Pavel
2009-03-16 13:59
2009.04.26
Работа с WordDocument


15-1235256218
alex-drob
2009-02-22 01:43
2009.04.26
Проэктирование сервера для обмена пакетами двух пользователей


2-1237193561
igorntk
2009-03-16 11:52
2009.04.26
Как при открытии формы сделать кнопку неактивной?


15-1234356827
ДимДимыч
2009-02-11 15:53
2009.04.26
Высшая математика, оказывается, убивает креативность!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский