![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как проверить существет ли еще форма в frm:TMyTypeForm? [D7, WinXP]
pg81 © (2009-12-18 12:54:00)Есть переменная frm:TMyTypeForm;
Как узнать, что форма на которую ссылается эта переменная,еще существует?
assigned(frm)говорит существет, а на самом деле она уже закрыта...
и потом когда обращаешься к ней, напрмиер, frm.MyFunction, естественно ругается.
brother (2009-12-21 04:49:00) [1]> А чем отличаются destroy и free?
дестрой - тупо разрушение объекта ,и если он не создан, то ловим AV
фрии - проверка на "созданнось" (не nil), а уж потом дестрой, если объект не создан, то при проверке дестрой не вызовется и AV не будет ;)
{RASkov} (2009-12-18 18:58:00) [2]> [3] pg81 © (18.12.09 13:44)
> frm.destroy;
> frm:=nil;
> помогло.
Не нужно вызывать Destroy напрямую.... нужно Free.
> А чем отличаются destroy и free?
Посмотри метод Free и описание Destroy в TObject ...все станет ясно. Если понимаешь разницу статического от виртуального метода...
DVM (2009-12-18 14:46:00) [3]
> pg81 © (18.12.09 12:54)
> Как узнать, что форма на которую ссылается эта переменная,
> еще существует?
Сразу напрашивается вопрос - зачем это знать? Причем каков бы не был твой ответ это говорит имхо лишь об ошибках проектирования.
clickmaker (2009-12-18 13:45:00) [4]F1
Components on a form are created and destroyed automatically. However, if you write your own code to instantiate objects, you are responsible for disposing of them as well. Every object inherits a Destroy method (called a destructor) from TObject. To destroy an object, however, you should call the Free method (also inherited from TObject), because Free checks for a nil referencebefore calling Destroy.
pg81 (2009-12-18 13:44:00) [5]frm.destroy;
frm:=nil;
помогло.
А чем отличаются destroy и free?
Демо (2009-12-18 13:34:00) [6]
> {RASkov} © (18.12.09 13:13) [1]
Можно и проверить.
function CheckForm(Form: TForm): Boolean;
begin
Result := False;
if Assigned(Form) then
try
Result := isWindow(Form.Handle);
except
end;
end;
{RASkov} (2009-12-18 13:13:00) [7]> [0] pg81 © (18.12.09 12:54)
> а на самом деле она уже закрыта
закрыта и уничтожена - разные вещи.
что бы иметь возможность делать проверку на nil, т.е. if frm=nil then... или assigned(frm)
нужно после уничтожения формы ссылку на нее, например frm нилить... примерно так:
frm.Free;
frm:=nil;
или
FreeAndNil(frm);