bormant писал(а):Открою маленький секрет: все экземпляры TMyClass будут иметь один и тот же адрес ChangeEvent при показанных выше объявлениях, если правильно путаю. Экземпляры класса отличаются данными, но имеют общий код. С каким классом работает код, определяет неявный параметр Self. Вот только тот Self -- это данные того экземпляра TMyClass, а не self непонятно какого вызывающего класса на момент вызова.
Согласен, неправильно пример привел. Насколько помню только объявления protected имеют разные копии.
- Код: Выделить всё
TMyClass=class
private
FOnChangeEvent:TNotifyEvent; // В зависимости от экземпляра класса, будет свой обработчик. К примеру у каждой формы свой класс и обработчик.
public
property OnChangeEvent:TNotifyEvent .....
end;
- Код: Выделить всё
***
var
ListEvent:TList;
****
var
Item:TMyClass;
begin
Item:=TMyClass.create;
....
ListEvent.add(addr(item.OnChangeEvent));
item.free;
end;
- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
P:Pointer;
EventProcedure:TNotifyEvent;
M: TMethod;
begin
for i := 0 to ListEvent.Count - 1 do
begin
P:=(ListEvent.Items[i]);
M.Code := P;
M.Data := nil; //self объекта-обработчика равен nil
EventProcedure:=TNotifyEvent(M);
try
if Assigned(EventProcedure)then
EventProcedure(Self); // В качестве Self передаем виновника возникновения событий
except
// Не происходит
end;
end;
end;
Проверил наконец, с доделками. Недостаток - без {$mode delphi} не работает. Except как раз и не вылетает из-за того, что сама функция не создается заново, а используется классами в едином виде как написана и кто к ней обращается. Второй параметр сохранять надо.
Спасибо в общем, докопался с подсказками до того, что там происходит.