Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли из 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 можно использовать.


Наверх

Титульная страница Поиск, карта сайта Написать письмо