Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.10;
Скачать: CL | DM;

Вниз

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

 
Циркуль   (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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.033 c
15-1257524073
trxnet
2009-11-06 19:14
2010.01.10
Количество треугольников в массиве


2-1258546185
Никита7
2009-11-18 15:09
2010.01.10
Как использовать Zlib в своей программе?


2-1258375107
defen
2009-11-16 15:38
2010.01.10
разрешения для изменения ключей реестра


15-1257509410
Огненный_дракон
2009-11-06 15:10
2010.01.10
Удалённое включение компьютера


2-1258384893
Кузьма
2009-11-16 18:21
2010.01.10
Работа с отладчиком в Дельфи