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

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

Уничтожение класса в классе


learner ©   (2006-06-27 18:38:00) 

Т.е. что нибудь такого типа :
procedure MyClass.Kamikadze;
begin
FreeAndNil(Self);
end;


Amoeba   (2006-06-29 12:12:00) [1]


> К счастью, на этот случай есть решение,
> однако оно относится лишь к потомкам TComponent.
> Зовут же его procedure Notification; overriude.

Точнее используется только там. Но ничего не мешает на свой манер реализовать идеологию нотификации и в своем наборе классов.


Leonid Troyanovsky   (2006-06-28 20:33:00) [2]


> learner ©   (28.06.06 11:01) [11]

> решения проблемы. Мне нужно не только уничтожить объект,
>  но и обнулить
> переменную, его создавашую.


Это, действительно, заблуждение.
Бо, кроме переменной, хранящей свежесозданный объект,
т.е. x := TMyObject.Create, может существовать и некий у,
значение которого получено простым y := x.
Сл-но, даже если мы сумели расправиться с x,
то и у может исполнить свою роль, скажем, путем y.Free.
И, всякие там FreeAndNil никак ситуацию не исправят.

К счастью, на этот случай есть решение,
однако оно относится лишь к потомкам TComponent.
Зовут же его procedure Notification; overriude.

--
Regards, LVT.


ЮЮ   (2006-06-28 11:27:00) [3]

Вот вместо MyVar.DeleteSelf и следует написать FreeAndNil(MyVar);

P.S. никто не обязан следить за ссылками на объект как и  на наличие таковых вообще.

P.P.S. Если так трудно управляться с объектами, смотри в сторну интерфейсов.


learner   (2006-06-28 11:01:00) [4]

>Leonid Troyanovsky ©   (27.06.06 21:12)
Насколько я понимаю (может просто ничего) в приведенной ссылке нет
решения проблемы. Мне нужно не только уничтожить объект, но и обнулить
переменную, его создавашую. Сумбурно получилось. Что-то типа такого:
MyVar:= TMyClass.Create(...Может ссылка какая-то на переменную...);
MyVar.DeleteSelf;
if MyVar = nil then ShowMessage('I''am nil !');


Leonid Troyanovsky   (2006-06-27 21:12:00) [5]


> learner ©   (27.06.06 19:21) [8]

> Что-то внутри не пошло - тогда никому не достанусь !


Внутри должно было бы, видимо, означать "не имея внешней ссылки".
Обычно этот вопрос звучит примерно так: "как разрушить объект
из его обработчика". Т.е., аналог метода Release формы.
Что, собс-но, решается похожим способом. См., например,
http://rsdn.ru/Forum/Message.aspx?mid=624577
Желательно все обсуждение.

--
Regards, LVT.


Пусик   (2006-06-27 19:25:00) [6]


> Это всё понятно, но для чего нужна именно class procedure?


Согласна. В данном случае можно обойтись без этого.


learner   (2006-06-27 19:21:00) [7]

Пусик - настоящий телепат.
Спасибо.
>Джо
>И какой глубокий смысл такого метода?
Жадность, человеческая :)
Что-то внутри не пошло - тогда никому не достанусь !
В хозяйстве пригодиться :))


Джо   (2006-06-27 19:19:00) [8]

> [5] Пусик ©   (27.06.06 19:12)
> procedure TForm1.Button1Click(Sender: TObject);
> var
> Obj: TMyClass;
> begin
> Obj := TMyClass.Create;
> Obj.KillSelf(Obj);
> end;

Это всё хорошо. Но почему, в таком случае, не городить эдакое, а не написать просто:

procedure TForm1.Button1Click(Sender: TObject);
var
 Obj: TMyClass;
begin
 Obj := TMyClass.Create;
 FreeAndNil (Obj)
end;

?
Ответ, данный Вами, на этот вопрос, успокоит меня и возрадует :0)


begin...end   (2006-06-27 19:16:00) [9]

> Пусик ©   (27.06.06 19:12) [5]

Это всё понятно, но для чего нужна именно classprocedure?


Пусик   (2006-06-27 19:12:00) [10]


> begin...end ©   (27.06.06 19:04) [4]
> > Пусик ©   (27.06.06 19:02) [3]А зачем нужно смотреть "class
> procedure"?


А для того, чтобы не использовать FreeAndnil. Как я поняла, автор именно это и имеет ввиду.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TMyClass=class
 public
   class procedure KillSelf(var Obj: TMyClass);
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 MyObj: TMyClass;

implementation

{$R *.dfm}

{ TMyClass }

class procedure TMyClass.KillSelf(var Obj: TMyClass);
begin
 Obj.Free;
 Obj := nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Obj: TMyClass;
begin
 Obj := TMyClass.Create;
 Obj.KillSelf(Obj);
end;

end.


begin...end   (2006-06-27 19:04:00) [11]

> Пусик ©   (27.06.06 19:02) [3]

А зачем нужно смотреть "class procedure"?


Пусик   (2006-06-27 19:02:00) [12]


> learner ©   (27.06.06 18:38) 


См. class procedure


Джо   (2006-06-27 18:56:00) [13]

> procedure MyClass.Kamikadze;
> begin
> FreeAndNil(Self);
> end;

И какой глубокий смысл такого метода?


begin...end   (2006-06-27 18:41:00) [14]

А в чём вопрос?


Наверх

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