Форум: "Начинающим";
Текущий архив: 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