Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.046 c
3-1157540132
vodvorezlaya
2006-09-06 14:55
2006.11.05
Помогите разобраться с компонентом TDBListBox


15-1160607272
Бабай
2006-10-12 02:54
2006.11.05
Google Code Search не ищет по Паскалю !


2-1161261418
СержК
2006-10-19 16:36
2006.11.05
Событие наведения указателя мышки к кнопке на форме


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


2-1161083852
Kolan
2006-10-17 15:17
2006.11.05
Извлечение интерфейса и свойство, обращающееся к полю





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