![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Модальная форма [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