Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Вниз

Можно ли удалить объект в его же методе?   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.012 c
15-1142588143
LordOfRock
2006-03-17 12:35
2006.04.09
Учебник по Firebird


2-1143059552
Std
2006-03-22 23:32
2006.04.09
создание и подключение плагина


15-1142928167
Petrovski
2006-03-21 11:02
2006.04.09
Неужели Delphi на этом и закончится?


1-1141504348
Serg1981
2006-03-04 23:32
2006.04.09
TRichEdit и большой текст


2-1143168361
kast
2006-03-24 05:46
2006.04.09
WebBrowser - проблема





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский