Форум: "Основная";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
ВнизМожно ли из 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.042 c