![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уничтожение класса в классе
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]А в чём вопрос?