Главная страница
    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.034 c
2-1237272243
Тетрис2009
2009-03-17 09:44
2009.04.26
поиск файлов


6-1199630362
WebSQLNeederr
2008-01-06 17:39
2009.04.26
отключить в ТВебБроузер звук щелчка при переходе по линку


2-1237121432
AIK
2009-03-15 15:50
2009.04.26
Теряется путь от исполняемой папки


4-1208784022
leonidus
2008-04-21 17:20
2009.04.26
Как узнать размер exe из него же?


2-1237279953
igorntk
2009-03-17 11:52
2009.04.26
Как осуществить запись информации из TEdit





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский