Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.01.10;
Скачать: [xml.tar.bz2];

Вниз

Как определить хто обработает эвент?   Найти похожие ветки 

 
Циркуль   (2009-11-18 12:59) [0]


 Tobj = class
   procedure Handler(Sender: TObject);
 end;

procedure TForm1.FormCreate(Sender: TObject);
var
 O1, O2: TObj;
begin
 Randomize;
 O1 := TObj.Create;
 try
   try
     if random(2) = 0 then
       OnShow := o1.Handler
     else
       OnShow := o2.Handler;

    { как понять для какого именно экземпляра TObj вызовется Handler ?  т.е. для 01 или для О2 ?}
     S := "Обработчик OnShow присвоен объекту №" + ???;
     ShowMessage(S);

     OnShow := nil;
   finally
     O2.Free;
   end;
 finally
   O1.Free;
 end;
end;


 
Phoenix77   (2009-11-18 13:13) [1]


как понять


Никак


 
clickmaker ©   (2009-11-18 13:21) [2]

код кажется бессмысленным. Если мы не можем различить, чай это или кофе, то какая нам разница?
O1, O2 - одного класса же. Или нет?


 
Циркуль   (2009-11-18 13:41) [3]

ммм... а если переписать так


Tobj = class
  F: TObject;
  procedure Handler(Sender: TObject);
  destructor Destroy; override;
end;

TForm1 = class(TForm)
private
 FObj1: TObj;
....
end;

procedure TForm1.FormCreate(Sender: TObject);
var
O2: TObj;
begin
Randomize;
FObj1 := TObj.Create;

o2 :=  TObj.Create;
  try
    if random(2) = 0 then
      OnShow := FObj1.Handler
    else
      OnShow := o2.Handler;

  finally
    O2.Free;
  end;
end;

procedure TObj.Handler(Sender: TObject);
begin
 тут происходит обращение к FObj;
end;

destructor TObj.Destroy;
begin
 Fobj.Free;
 inherited;
end;



собсно, если произойдет присвоение OnShow := o2.Handler, то в OnShow формы получим AV,  при обращении к  o2.FObj

Чтобы этого избежать, появилась идейка в деструкторе проверять явлется ли этот конкретный обект обработчиком события, и, если да, сделать Form1.OnShow = nil;


 
Дмитрий Белькевич   (2009-11-18 13:52) [4]

Ничего не понятно, но прдеположу, что проще всего отследить вот эту ситуацию: "то в OnShow формы получим AV,  при обращении к  o2.FObj". AV ты какое получаешь? На доступ к nil"у? Ну так отслеживай, не nil ли FObj. Т если не nil, до доступайся, если nil - нет.


 
clickmaker ©   (2009-11-18 14:00) [5]

> в OnShow формы получим AV,  при обращении к  o2.FObj

а откуда вдруг взялся o2.FObj, если FObj - поле формы?


 
Cobalt ©   (2009-11-18 14:02) [6]

Если разрушаешь сам. то делай через FreeandNil, а перед обращением к полям и методам объекта, который может быть разрушен, проверяй - не разрушен ли он.


 
Циркуль   (2009-11-18 14:08) [7]


> а откуда вдруг взялся o2.FObj, если FObj - поле формы?


Пардон... O2.F, конечно...


> Дмитрий Белькевич   (18.11.09 13:52) [4]
> Cobalt ©   (18.11.09 14:02) [6]


Код приведен для примера, как не допустить AV я знаю. Вопрос изначально был чисто академическим - можно ли определить какой конкретный экземпляр объекта будет обработчиком события. Если нельзя - ничего страшного, мир не рухнет. Просто вдруг можно, а я не знаю как :)


 
Циркуль   (2009-11-18 14:11) [8]

спасибо всем ответившим )


 
clickmaker ©   (2009-11-18 14:38) [9]

> можно ли определить какой конкретный экземпляр объекта будет
> обработчиком события

собственно, способов несколько.
Н-р, добавление объекту уникального ID или сохранение созданных объектов в списке с последующим поиском по нему


 
Циркуль   (2009-11-18 15:03) [10]


> clickmaker ©   (18.11.09 14:38) [9]


Предположим, в первом моём примере первый экземпляр имеет свойство ID = 1, второй ID = 2 и вдобавок оба сидят в неком TObjectList. Как эта информация мне поможет определить, за кем из них оказался "закреплен" эвент Form1.OnShow?
Не вызывая сам эвент, естесствено :)

ЗЫ. в первом примере после первого "try" пропущена строка "O2 := TObj.Create;"


 
Cobalt ©   (2009-11-18 16:06) [11]

Попробуй проверять содержимое параметра Sender.


 
Дмитрий Белькевич   (2009-11-18 16:35) [12]

>за кем из них оказался "закреплен" эвент Form1.OnShow?

OnShow = o1.Handler?


 
icWasya ©   (2009-11-18 16:46) [13]

А откуда это праеполагается узнавать?
Если изнутри  Handler, то
Self - это тот самый экземпляр TObject
Sender - это на самая форма, которая Show

Если из какого - нибудь другого места, то

var
 M:TMethod;
begin
if Assigned(Form1.OnShow) then begin
 M:= TMethod(Form1.OnShow);
 if M.Data = O1 then ;
 if M.Data = O2 then ;
...
end;
end;



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

Форум: "Начинающим";
Текущий архив: 2010.01.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
2-1258701942
Андрей Смирнов
2009-11-20 10:25
2010.01.10
D2009 PChar является PWideChar, как правельно?


15-1257707340
SergP
2009-11-08 22:09
2010.01.10
Реклама. Яндекс Директ и пр...


2-1258233401
Proton
2009-11-15 00:16
2010.01.10
TMediaPlayer in Thread


4-1226307753
DimDim
2008-11-10 12:02
2010.01.10
Лажа с округлениями???


15-1257209286
Германн
2009-11-03 03:48
2010.01.10
Кто-нибудь хочет завести себе собачку?





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