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 как раз и не вылетает из-за того, что сама функция не создается заново, а используется классами в едином виде как написана и кто к ней обращается. Второй параметр сохранять надо. 
Спасибо в общем, докопался с подсказками до того, что там происходит. 
