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

Вниз

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

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

Наверх





Память: 0.48 MB
Время: 0.01 c
1-1149059340
.ruslan
2006-05-31 11:09
2006.07.16
ListView и строки разных цветов, чередование


15-1150602927
guard_gg
2006-06-18 07:55
2006.07.16
Microsoft Visual C++ and Borland C++ Builder


2-1151318301
fast2
2006-06-26 14:38
2006.07.16
Как сделать инсталятор?


6-1141833264
anton773
2006-03-08 18:54
2006.07.16
подключиться к интернету


2-1151655597
Mr tray
2006-06-30 12:19
2006.07.16
Изменять выведенный текст консольного приложения





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский