![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли удалить объект в его же методе? [D5, D6, D7, Win2k, WinXP]
Dust © (2006-03-25 16:08:00)Насколько это будет корректно?
а если делать вот так:
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;
Германн (2006-03-27 02:32:00) [1]
> begin...end © (26.03.06 09:15) [21]
>
> > Dust © (25.03.06 16:08)
>
> > Можно ли удалить объект в его же методе?
>
> Можно. Если после удаления объекта не будет обращения к
> его полям и вызова виртуальных/динамических методов.
Именно так.
А в прочих случаях, лучше PostMessage не сыскать, имхо. Хотя, конечно, я в первую очередь имел ввиду компоненты, а не объекты.
Германн (2006-03-27 02:21:00) [2]
> Выделением смысла из текста вроде бы не страдаю.
??? :-)
begin...end (2006-03-26 09:15:00) [3]> Dust © (25.03.06 16:08)
> Можно ли удалить объект в его же методе?
Можно. Если после удаления объекта не будет обращения к его полям и вызова виртуальных/динамических методов.
> Defunct © (26.03.06 04:03) [13]
> Как минимум в методе MyClass2.Method1B может возникнуть
> Access Violation, из-за того что экземпляр класса может
> быть разрушен после исполнения FCloseNotify(true)..
Ну и что, что он может быть разрушен? После исполнения FCloseNotify(true) сразу же следует выход из метода Method1B. Исключению (из-за того, что объект разрушен), здесь взяться неоткуда. Так что мимо тазика.
Defunct (2006-03-26 07:19:00) [4]> На все 100 подпишусь только под последней строчкой из Германн © (26.03.06 04:52) [17].
Об этом и речь.. Выделением смысла из текста вроде бы не страдаю.
Германн (2006-03-26 05:09:00) [5]
> 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 05:00:00) [6]Германн © (26.03.06 04:52) [17]
согласен
Германн (2006-03-26 04:52:00) [7]
> Defunct © (26.03.06 04:41) [16]
>
> Германн © (26.03.06 04:33) [15]
>
> Дык, все бы хорошо, да вот владельцем может быть и не форма,
> а nil например.. речь же идет о наследниках TObject, а
> не о наследниках TWinControl.
>
Извини. Я не так выразился. Нужен PostMessage любойформе из проекта, в uses которой указан модуль, в котором описан вышеописанный объект.
То бишь нужно просто поручить "устранение объекта" другим лицам!
Defunct (2006-03-26 04:41:00) [8]Германн © (26.03.06 04:33) [15]
Дык, все бы хорошо, да вот владельцем может быть и не форма, а nilнапример.. речь же идет о наследниках TObject, а не о наследниках TWinControl.
Германн (2006-03-26 04:33:00) [9]Есть достаточно простой и понятный способ "Уничтожить объект в обработчике его же события". PostMessage форме-владельцу.
Defunct (2006-03-26 04:07:00) [10][13]
но здесь будет проблема с использованием полей..
Думаю лучше сделать просто отдельный менеджер, который будет ответственным за удаление и хранение объектов. А сами объекты должны (при необходимости) добавлять себя в очередь "на удаление".
Defunct (2006-03-26 04:03:00) [11]Dust © (25.03.06 16:58) [1]
Хм.. imho это будет некорректно. Как минимум в методе MyClass2.Method1Bможет возникнуть Access Violation, из-за того что экземпляр класса может быть разрушен после исполнения FCloseNotify(true).. Можно посоветовать сделать этот метод - class-методом, чтобы этот метод не зависел от конкретного экземпляра:
MyClass2 = class(TObject)
...
class procedure Method1B ();
end;
Германн (2006-03-26 03:54:00) [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, как говорится! :-)
Джо (2006-03-26 03:04:00) [13]> [9] Dmitrij_K (26.03.06 01:36)
> А разве, не все классы наследники от TObject?
Все.
Yanis (2006-03-26 03:04:00) [14]
> А разве, не все классы наследники от TObject?
Ой. Что то я совсем плохой стал. Ты прав :)
Dmitrij_K (2006-03-26 01:36:00) [15]
> А это большинство стандартных классов Delphi.
А разве, не всеклассы наследники от TObject?
Yanis (2006-03-26 01:08:00) [16]В принципе перед заголовком функции FreeAndNilнаписано вот что: Be careful to only pass TObjects to this routineНаверно ввиду имеются такжеи наследники от TObject. А это большинство стандартных классов Delphi.
Гаврила (2006-03-26 00:44:00) [17]
> Dust ©
не делай так.
В принципе из метда объекта разрушить его же можно
(например см. метод Free - тот самый случай), но не так, как ты тут написал
> Cash ©
> Где то, кто то, когда то и как то мне прожуж-ж-жал,
>что эту самую
> FreeAndNil юзать к классам не корректно.
передавай этому "кому-то" привет
Yanis (2006-03-25 23:43:00) [18]
> А FreeAndNil делает всего навсего
Не для никого не секрет :)
Kolan (2006-03-25 23:25:00) [19]Что такое класс - объект?
АFreeAndNilделает всего навсего
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
Cash (2006-03-25 23:11:00) [20]Yanis © (25.03.06 23:07) [3]:
А кто его знает! Я эту штуку никогда не юзал с классами, только с
класс-объектами, потаму, что у класс-объектов Free нету, а еще в
хелпе так написано.