![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли из procedure of object получить ссылку на объект
Bless © (2006-09-25 12:20:00)
TProc = procedure of object;
TMyClass= class(TObject)
private
FProc: TProc;
public
procedure SomeMethod;
end;
procedure SomeMethod;
begin
if Assigned(FProc) then
<объект,чьим методом проинициализирован FProc>.FreeNotification;
end;
Что написать вместо выделенного жирным?
evvcom (2006-09-26 09:41:00) [1]> [15] Barloggg (26.09.06 09:12)
Да наплевать, от чего объект унаследован. Запиши в TMethod(FProc).Data хоть результат рандомайза. Предложение
> if Assigned(Obj) and (Obj is TComponent) then
всё проверит, является ли этот объект компонентом. И только, если является, будет работать с ним, как с компонентом. Хотя, конечно, с рандомайзом, существует вероятность 1/2^32 ловли AV, если считать рандомайз равновероятной функцией :)
Barloggg (2006-09-26 09:12:00) [2]согласен. для данных условий все верно.
это просто я любитель наследовать все от бог знает каких предков...
вот меня этот freenotification и засмущал...
в этой же задачке объект гарантированно наследован от Tcomponent.
evvcom (2006-09-26 08:55:00) [3]> [11] Barloggg (25.09.06 12:35)
Кто такие варианы? Почему нестабильно, что смущает? Код все что нужно проверяет, как раз для общего случая.
zamtmn (2006-09-25 12:41:00) [4]>>хммм.... ну с объектами облом.
с object`ом также как с class никакого облома
Bless (2006-09-25 12:36:00) [5]
> Сергей М. © (25.09.06 12:33) [9]
Спасибо!
Barloggg (2006-09-25 12:35:00) [6]
> Сергей М.
[9]
это правильно если нет варианов. и мы точно знаем какого типа должен быть объект.
а в общем случае нестабильно.
Bless (2006-09-25 12:34:00) [7]
> 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.
Сергей М. (2006-09-25 12:33:00) [8]var
Obj: TObject;
..
Obj := TObject(TMethod(FProc).Data);
if Assigned(Obj) and (Obj is TComponent then
TComponent(Obj).FreeNotification(..);
Barloggg (2006-09-25 12:32:00) [9]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;
Barloggg (2006-09-25 12:28:00) [10]эй... объект ЧЬИМ МЕТОДОМ???
хммм.... ну с объектами облом.
с классами... что-то кажется можно. классовый метод неявно прикрепляет ссылку на себя... блин, кажется ЧТО-ТО можно сделать. Это я к тому, что я неправильно понял вопрос и мои посты выше не читать.
clickmaker (2006-09-25 12:28:00) [11]
> а вот если при создании объекта не присвоить FProc хоть
> чему-нибудь, пусть даже Nil то можно схлопотать AV
члены класса инициализируются нулем.
Поэтому if Assigned достаточно
Barloggg (2006-09-25 12:26:00) [12]скомпилируется.
и даже будет работать.
если конечно вместо procedure SomeMethod; сделать procedure TMyClass.SomeMethod;
а вот если при создании объекта не присвоить FProc хоть чему-нибудь, пусть даже Nil то можно схлопотать AV.
DrPass (2006-09-25 12:24:00) [13]
> TMyClass= class(TObject)
> private
> FProc: TProc;
> public
> procedure SomeMethod;
> end;
>
> procedure SomeMethod;
> begin
> if Assigned(FProc) then
> <объект,чьим методом проинициализирован FProc>.FreeNotification;
>
> end;
...это даже не скомпилируется
Сергей М. (2006-09-25 12:23:00) [14]
> объект,чьим методом проинициализирован FProc
Обычно приватные данные инициализируются самим объектом, использующим эти приватные данные.
clickmaker (2006-09-25 12:23:00) [15]
> из procedure of object получить ссылку на объект
эээ... а зачем?
Barloggg (2006-09-25 12:21:00) [16]ну, Self можно использовать.