Текущий архив: 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.48 MB
Время: 0.009 c