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

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

Как определить хто обработает эвент? [D6, WinXP]


Циркуль ©   (2009-11-18 12:59:00) 


 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;


icWasya   (2009-11-18 16:46:00) [1]

А откуда это праеполагается узнавать?
Если изнутри  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;


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

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

OnShow = o1.Handler?


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

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


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


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


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

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


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

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

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


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

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


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


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


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


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


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


Cobalt   (2009-11-18 14:02:00) [8]

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


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

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

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


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

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


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

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


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;


clickmaker   (2009-11-18 13:21:00) [12]

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


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


как понять


Никак


Наверх

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