Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли удалить объект в его же методе? [D5, D6, D7, Win2k, WinXP]


Страницы:   1 2

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 нету, а еще в
хелпе так написано.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо