Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.16;
Скачать: CL | DM;

Вниз

Уничтожение класса в классе   Найти похожие ветки 

 
learner ©   (2006-06-27 18:38) [0]

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


 
begin...end ©   (2006-06-27 18:41) [1]

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


 
Джо ©   (2006-06-27 18:56) [2]

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

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


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


> learner ©   (27.06.06 18:38) 


См. class procedure


 
begin...end ©   (2006-06-27 19:04) [4]

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

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


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


> 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:16) [6]

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

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


 
Джо ©   (2006-06-27 19:19) [7]

> [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)


 
learner ©   (2006-06-27 19:21) [8]

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


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


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


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


 
Leonid Troyanovsky ©   (2006-06-27 21:12) [10]


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

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


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

--
Regards, LVT.


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

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


 
ЮЮ ©   (2006-06-28 11:27) [12]

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

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

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


 
Leonid Troyanovsky ©   (2006-06-28 20:33) [13]


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

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


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

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

--
Regards, LVT.


 
Amoeba ©   (2006-06-29 12:12) [14]


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.07.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.034 c
3-1147500946
Leshiy
2006-05-13 10:15
2006.07.16
Значение параметра xml документа


5-1135259011
sco
2005-12-22 16:43
2006.07.16
Package unit IconButton cannot appear in contains or uses claus


2-1151354245
SergNic
2006-06-27 00:37
2006.07.16
о возможностях Delphi 2006 Prof


3-1147626786
Alpine
2006-05-14 21:13
2006.07.16
Вопрос по настройке клиента в IB


1-1149082572
adalx
2006-05-31 17:36
2006.07.16
Компоненты