Текущий архив: 2006.04.09;
Скачать: CL | DM;
ВнизМожно ли удалить объект в его же методе? Найти похожие ветки
← →
Dust © (2006-03-25 16:08) [0]Насколько это будет корректно?
а если делать вот так:TObjectMessage = procedure (const flag : boolean) of object;
type
EProgrammerIsIdiot = class(Exception);
MyClass2 = class;
MyClass1 = class(TObject)
private
{ Private declarations }
FClassVar1 : MyClass2;
public
{ Public declarations }
procedure Method1A ();
procedure OnCloseNotify (const flagDelete: boolean);
end;
MyClass2 = class(TObject)
private
{ Private declarations }
FCloseNotify : TObjectMessage;
public
{ Public declarations }
property CloseNotification : TObjectMessage read FCloseNotify write FCloseNotify;
procedure Method1B ();
end;
implementation
{ MyClass2 }
procedure MyClass2.Method1B;
begin
if Assigned( FCloseNotify) then FCloseNotify(true);
end;
{ MyClass1 }
procedure MyClass1.Method1A;
begin
FClassVar1 := MyClass2.Create();
FClassVar1.FCloseNotify := OnCloseNotify;
end;
procedure MyClass1.OnCloseNotify(const flagDelete: boolean);
begin
if FlagDelete then FreeAndNil(FClassVar1);
end;
← →
Dust © (2006-03-25 16:58) [1]Народ, хелп. Нуна ли мне писать отдельно мененджер, или всётаки можно будет рубить объекты вышеописанным образом?
← →
Cash © (2006-03-25 22:29) [2]Где то, кто то, когда то и как то мне прожуж-ж-жал, что эту самую
FreeAndNil юзать к классам не корректно.
Ну вот с тех самых пор (т. е. с момента освоения классов) юзаю только
метод Free у самого объекта. Этот метод можно ставить где угодно,
особенно внутри других методов этого класса.
А FreeAndNil вроде обычно для класс-объектов используют.
Т. е. для конструкций вида:
Type
TBlablabla = Object
... ... ...
end;
← →
Yanis © (2006-03-25 23:07) [3]
> Где то, кто то, когда то и как то мне прожуж-ж-жал, что
> эту самую
> FreeAndNil юзать к классам не корректно.
Но для классов же работает.
← →
Cash © (2006-03-25 23:11) [4]Yanis © (25.03.06 23:07) [3]:
А кто его знает! Я эту штуку никогда не юзал с классами, только с
класс-объектами, потаму, что у класс-объектов Free нету, а еще в
хелпе так написано.
← →
Kolan © (2006-03-25 23:25) [5]Что такое класс - объект?
АFreeAndNil
делает всего навсегоprocedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
← →
Yanis © (2006-03-25 23:43) [6]
> А FreeAndNil делает всего навсего
Не для никого не секрет :)
← →
Гаврила © (2006-03-26 00:44) [7]
> Dust ©
не делай так.
В принципе из метда объекта разрушить его же можно
(например см. метод Free - тот самый случай), но не так, как ты тут написал
> Cash ©
> Где то, кто то, когда то и как то мне прожуж-ж-жал,
>что эту самую
> FreeAndNil юзать к классам не корректно.
передавай этому "кому-то" привет
← →
Yanis © (2006-03-26 01:08) [8]В принципе перед заголовком функции FreeAndNil написано вот что:Be careful to only pass TObjects to this routine Наверно ввиду имеются также и наследники от TObject. А это большинство стандартных классов Delphi.
← →
Dmitrij_K (2006-03-26 01:36) [9]
> А это большинство стандартных классов Delphi.
А разве, не все классы наследники от TObject?
← →
Yanis © (2006-03-26 03:04) [10]
> А разве, не все классы наследники от TObject?
Ой. Что то я совсем плохой стал. Ты прав :)
← →
Джо © (2006-03-26 03:04) [11]> [9] Dmitrij_K (26.03.06 01:36)
> А разве, не все классы наследники от TObject?
Все.
← →
Германн © (2006-03-26 03:54) [12]
> Cash © (25.03.06 22:29) [2]
>
> Где то, кто то, когда то и как то мне прожуж-ж-жал, что
> эту самую
> FreeAndNil юзать к классам не корректно.
> Ну вот с тех самых пор (т. е. с момента освоения классов)
> юзаю только
> метод Free у самого объекта. Этот метод можно ставить где
> угодно,
> особенно внутри других методов этого класса.
> Yanis © (25.03.06 23:07) [3]
>
>
> > Где то, кто то, когда то и как то мне прожуж-ж-жал, что
>
> > эту самую
> > FreeAndNil юзать к классам не корректно.
>
> Но для классов же работает.
> <Цитата>
> Cash © (25.03.06 23:11) [4]
>
> Yanis © (25.03.06 23:07) [3]:
> А кто его знает! Я эту штуку никогда не юзал с классами,
> только с
> класс-объектами, потаму, что у класс-объектов Free нету,
> а еще в
> хелпе так написано.
> Yanis © (26.03.06 01:08) [8]
>
> В принципе перед заголовком функции FreeAndNil написано
> вот что:Be careful to only pass TObjects to this routine
> Наверно ввиду имеются также и наследники от TObject. А это
> большинство стандартных классов Delphi.
>
No Comments, как говорится! :-)
← →
Defunct © (2006-03-26 04:03) [13]Dust © (25.03.06 16:58) [1]
Хм.. imho это будет некорректно. Как минимум в методе MyClass2.Method1B может возникнуть Access Violation, из-за того что экземпляр класса может быть разрушен после исполнения FCloseNotify(true).. Можно посоветовать сделать этот метод - class-методом, чтобы этот метод не зависел от конкретного экземпляра:MyClass2 = class(TObject)
...
class procedure Method1B ();
end;
← →
Defunct © (2006-03-26 04:07) [14][13]
но здесь будет проблема с использованием полей..
Думаю лучше сделать просто отдельный менеджер, который будет ответственным за удаление и хранение объектов. А сами объекты должны (при необходимости) добавлять себя в очередь "на удаление".
← →
Германн © (2006-03-26 04:33) [15]Есть достаточно простой и понятный способ "Уничтожить объект в обработчике его же события". PostMessage форме-владельцу.
← →
Defunct © (2006-03-26 04:41) [16]Германн © (26.03.06 04:33) [15]
Дык, все бы хорошо, да вот владельцем может быть и не форма, а nil например.. речь же идет о наследниках TObject, а не о наследниках TWinControl.
← →
Германн © (2006-03-26 04:52) [17]
> Defunct © (26.03.06 04:41) [16]
>
> Германн © (26.03.06 04:33) [15]
>
> Дык, все бы хорошо, да вот владельцем может быть и не форма,
> а nil например.. речь же идет о наследниках TObject, а
> не о наследниках TWinControl.
>
Извини. Я не так выразился. Нужен PostMessage любой форме из проекта, в uses которой указан модуль, в котором описан вышеописанный объект.
То бишь нужно просто поручить "устранение объекта" другим лицам!
← →
Defunct © (2006-03-26 05:00) [18]Германн © (26.03.06 04:52) [17]
согласен
← →
Германн © (2006-03-26 05:09) [19]
> Defunct © (26.03.06 05:00) [18]
>
> Германн © (26.03.06 04:52) [17]
>
> согласен
>
А я, лично, не очень согласен. Т.е. у меня есть много претензий к формулировке Германн © (26.03.06 04:52) [17]
Но сейчас сформулировать лучше не смог.
На все 100 подпишусь только под последней строчкой из Германн © (26.03.06 04:52) [17].
← →
Defunct © (2006-03-26 07:19) [20]> На все 100 подпишусь только под последней строчкой из Германн © (26.03.06 04:52) [17].
Об этом и речь.. Выделением смысла из текста вроде бы не страдаю.
← →
begin...end © (2006-03-26 09:15) [21]> Dust © (25.03.06 16:08)
> Можно ли удалить объект в его же методе?
Можно. Если после удаления объекта не будет обращения к его полям и вызова виртуальных/динамических методов.
> Defunct © (26.03.06 04:03) [13]
> Как минимум в методе MyClass2.Method1B может возникнуть
> Access Violation, из-за того что экземпляр класса может
> быть разрушен после исполнения FCloseNotify(true)..
Ну и что, что он может быть разрушен? После исполнения FCloseNotify(true) сразу же следует выход из метода Method1B. Исключению (из-за того, что объект разрушен), здесь взяться неоткуда. Так что мимо тазика.
← →
Германн © (2006-03-27 02:21) [22]
> Выделением смысла из текста вроде бы не страдаю.
??? :-)
← →
Германн © (2006-03-27 02:32) [23]
> begin...end © (26.03.06 09:15) [21]
>
> > Dust © (25.03.06 16:08)
>
> > Можно ли удалить объект в его же методе?
>
> Можно. Если после удаления объекта не будет обращения к
> его полям и вызова виртуальных/динамических методов.
Именно так.
А в прочих случаях, лучше PostMessage не сыскать, имхо. Хотя, конечно, я в первую очередь имел ввиду компоненты, а не объекты.
Страницы: 1 вся ветка
Текущий архив: 2006.04.09;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.011 c