![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Есть переменная frm:TMyTypeForm;
Как узнать, что форма на которую ссылается эта переменная,еще существует? assigned(frm)говорит существет, а на самом деле она уже закрыта... и потом когда обращаешься к ней, напрмиер, frm.MyFunction, естественно ругается. |
#2
|
||||
|
||||
![]() Закрыта и несуществует - это разные понятия.
Вот если вы выполните frm.Free и после этого Assigned(frm) будет возвращать истину, тогда стоит задуматься. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
![]() Цитата:
|
#4
|
||||
|
||||
![]() Тогда попробуйте FreeAndNil(frm) вместо frm.Free.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
|||
|
|||
![]() форма уничтожена методом frm.destroy, а какая разница можду free?
|
#6
|
|||
|
|||
![]() Форма уничтожается в другом месте методом destroy не через переменную frm. форма сама когда закрывается уничтожается, а ссылка на нее остается в переменной frm, и нужно проверять прежде чем с ней работать, что существет ли форма или нет.
|
#7
|
||||
|
||||
![]() Есть такая информация, что изредка методы Destroy и Free отрабатывают не совсем корректно, обычно это связано просто с ошибками а коде, но остается некий процент который этими ошибками не объяснить.
Как альтернатива этим методам можно применить FreeAndNil(frm). Это гарантированый метод освободить память выделенную под указатель. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#8
|
|||
|
|||
![]() а как быть если frm это свойство определенного объекта, то выдается сообщение, что
Constant object cannot be passed as var parameter. |
#9
|
||||
|
||||
![]() Цитата:
Вы создаете объект Код:
frm := TMyTypeForm.Create(<?>); Когда Вы пишите frm.Free, объект уничтожается и его память освобождается, НО frm продолжает указывать на то место, где был объект. Assigned проверяет переменную ( или свойство ) не равно ли оно nil. Тоже самое делает Free перед вызовом destroy ( поэтому и рекомендуют писать Free а не destroy. Но чтобы они сработали надо при уничтожении присвоить frm := nil, что и делает функция FreeAndNil. Тогда и Assigned и Free будут работать правильно. Но FreeAndNil не единственный способ обнуления ссылки при уничтожении оъекта. Если frm свойство объекта который является наследником от TComponent ( TForm тоже его наследник ) - то можно воспользоваться механизмом нотификации. Если расскажете по подробнее как и где создается и храниться форма расскажу как сделать. Код:
procedure FreeAndNil(var Obj); var Temp: TObject; begin Temp := TObject(Obj); Pointer(Obj) := nil; Temp.Free; end; Код:
procedure TObject.Free; begin if Self <> nil then Destroy; end; Последний раз редактировалось s0Creator, 18.12.2009 в 16:52. |
#10
|
|||
|
|||
![]() Цитата:
Код:
function CreateMDI(ParentHndle:Thandle):integer; StdCall; var frm:TfrmMDI_dll; begin frm:=TfrmMDI_dll.CreateParented(ParentHndle); frm.fParentFormHandle:=ParentHndl; frm.Show; result:=integer(frm); end; |
#11
|
||||
|
||||
![]() Такого конечно не ожидал.
Но думаю здесь можно использовать SendMessage(fParentFormHandle, ... ) при уничтожении ( например в OnDestroy ) с соответствующей обработкой. |