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

Вниз

Можно ли из procedure of object получить ссылку на объект   Найти похожие ветки 

 
Bless ©   (2006-09-25 12:20) [0]


TProc = procedure of object;
TMyClass= class(TObject)
private
 FProc: TProc;
public
 procedure SomeMethod;
end;


procedure SomeMethod;
begin
 if Assigned(FProc) then
   <объект,чьим методом проинициализирован FProc>.FreeNotification;
end;

Что написать вместо выделенного жирным?


 
Barloggg   (2006-09-25 12:21) [1]

ну, Self можно использовать.


 
Сергей М. ©   (2006-09-25 12:23) [2]


> объект,чьим методом проинициализирован FProc


Обычно приватные данные инициализируются самим объектом, использующим эти приватные данные.


 
clickmaker ©   (2006-09-25 12:23) [3]


> из procedure of object получить ссылку на объект

эээ... а зачем?


 
DrPass ©   (2006-09-25 12:24) [4]


> TMyClass= class(TObject)
> private
>  FProc: TProc;
> public
>  procedure SomeMethod;
> end;
>
> procedure SomeMethod;
> begin
>  if Assigned(FProc) then
>    <объект,чьим методом проинициализирован FProc>.FreeNotification;
>
> end;

...это даже не скомпилируется


 
Barloggg   (2006-09-25 12:26) [5]

скомпилируется.
и даже будет работать.
если конечно вместо procedure SomeMethod; сделать procedure TMyClass.SomeMethod;

а вот если при создании объекта не присвоить FProc хоть чему-нибудь, пусть даже Nil то можно схлопотать AV.


 
Barloggg   (2006-09-25 12:28) [6]

эй... объект ЧЬИМ МЕТОДОМ???

хммм.... ну с объектами облом.
с классами... что-то кажется можно. классовый метод неявно прикрепляет ссылку на себя... блин, кажется ЧТО-ТО можно сделать. Это я к тому, что я неправильно понял вопрос и мои посты выше не читать.


 
clickmaker ©   (2006-09-25 12:28) [7]


> а вот если при создании объекта не присвоить FProc хоть
> чему-нибудь, пусть даже Nil то можно схлопотать AV

члены класса инициализируются нулем.
Поэтому if Assigned достаточно


 
Barloggg   (2006-09-25 12:32) [8]

procedure SomeMethod(dummy:Pointer;Sender:TObject);

var t:SomeMethod;

t:=Button1.onClick;

(или TMyClass=class
  fproc:TNotifyEvent;
end
var g:TmyClass;
t:=g.fproc;)
procedure SomeMethod(dummy:Pointer;Sender:TObject);
begin
dummy кажется и должен быть этой самой button1.
а может быть и нет...

в общем это тебе поможет вычленить обе ссылки, а там уж сам разберись кто есть кто.
end;


 
Сергей М. ©   (2006-09-25 12:33) [9]

var
 Obj: TObject;
..

Obj := TObject(TMethod(FProc).Data);
if Assigned(Obj) and (Obj is TComponent then
 TComponent(Obj).FreeNotification(..);


 
Bless ©   (2006-09-25 12:34) [10]


> Barloggg   (25.09.06 12:21) [1]
>
> ну, Self можно использовать.


Нельзя. Внутри SomeMethod self - это объект класса TMyClass, а мне нужен объект, которому принадлежит процедура, на которую ссылается FProc.

Код в первом посте должен был пояснить чего я хочу, но он  ошибочный.


TProc = procedure of object;
TMyClass= class(TComponent)
private
FProc: TProc;
public
procedure SomeMethod;
end;

procedure TMyClass.SomeMethod;
begin
if Assigned(FProc) then //FProc где-то ранее был проинициализирован
  <объект,чьим методом проинициализирован FProc>.FreeNotification(self);
end;



> clickmaker ©   (25.09.06 12:23) [3]
> > из procedure of object получить ссылку на объект
>
> эээ... а зачем?
>


Я хочу, чтобы компонент, на метод которого ссылается FProc, уведомлял о своем уничтожении объект TMyClass.


 
Barloggg   (2006-09-25 12:35) [11]


> Сергей М.
[9]

это правильно если нет варианов. и мы точно знаем какого типа должен быть объект.
а в общем случае нестабильно.


 
Bless ©   (2006-09-25 12:36) [12]


> Сергей М. ©   (25.09.06 12:33) [9]


Спасибо!


 
zamtmn ©   (2006-09-25 12:41) [13]

>>хммм.... ну с объектами облом.
с object`ом также как с class никакого облома


 
evvcom ©   (2006-09-26 08:55) [14]

> [11] Barloggg   (25.09.06 12:35)

Кто такие варианы? Почему нестабильно, что смущает? Код все что нужно проверяет, как раз для общего случая.


 
Barloggg   (2006-09-26 09:12) [15]

согласен. для данных условий все верно.
это просто я любитель наследовать все от бог знает каких предков...
вот меня этот freenotification и засмущал...
в этой же задачке объект гарантированно наследован от Tcomponent.


 
evvcom ©   (2006-09-26 09:41) [16]

> [15] Barloggg   (26.09.06 09:12)

Да наплевать, от чего объект унаследован. Запиши в TMethod(FProc).Data хоть результат рандомайза. Предложение
> if Assigned(Obj) and (Obj is TComponent) then
всё проверит, является ли этот объект компонентом. И только, если является, будет работать с ним, как с компонентом. Хотя, конечно, с рандомайзом, существует вероятность 1/2^32 ловли AV, если считать рандомайз равновероятной функцией :)



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

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

Наверх




Память: 0.5 MB
Время: 0.041 c
2-1161627334
Busik
2006-10-23 22:15
2006.11.05
Помогите програмисты,это очень важно для меня


15-1161166150
SerJaNT
2006-10-18 14:09
2006.11.05
Комп не грузиться=((


15-1161088099
Курдль
2006-10-17 16:28
2006.11.05
Посоветуйте хорошую книгу по ASP.NET


11-1137747496
-=Mike=-
2006-01-20 11:58
2006.11.05
Вопрос по ListView


2-1161612005
stud
2006-10-23 18:00
2006.11.05
вечер уже ничего не понимаю, помогите!!!