Форум: "Начинающим";
Текущий архив: 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.47 MB
Время: 0.007 c