Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.031 c
15-1142694690
Vlad_
2006-03-18 18:11
2006.04.09
Кто напишет простенькую прогу за 5 Баксов(На мобильный или WM)


1-1141469674
АРІ
2006-03-04 13:54
2006.04.09
Утечка памяти - OLE SysString (MemProof)


5-1128678870
MacCybex
2005-10-07 13:54
2006.04.09
TTabbedNotebook и табуляция!


15-1133314811
Delphi5.01
2005-11-30 04:40
2006.04.09
Прошу оценить и высказать личное мнение


15-1142623140
Fl@sh
2006-03-17 22:19
2006.04.09
Клиент Банк