Для демонстрации того, как это можно использовать, я включил в пример пару маленьких событий для кнопок. Во время работы, вы могли бы потестировать это с парой областей редактирования, имеющих другой тип и другие имена обработчиков.
Почуствуйте мощь RTTI (runtime type information)!
procedure SetEvent( ComponentWithEvent : TComponent ;const Event : string ;ComponentWithHandler : TComponent ;const Handler : string ) ; var PropInfo : PPropInfo ;Method : TMethod ; beginPropInfo := GetPropInfo( ComponentWithEvent.ClassInfo, Event ) ;if PropInfo = NIL thenRaise Exception.CreateFmt( 'Событие %s не найдено в классе %s',[ Event, ComponentWithEvent.ClassName ] ) ;Method.Code := NIL ;if Assigned( ComponentWithHandler ) and ( Handler <> '' ) then beginMethod.Code := ComponentWithHandler.MethodAddress( Handler ) ;if Method.Code = nil thenRaise Exception.CreateFmt( 'Класс %s не имеет метода с именем %s',[ ComponentWithHandler.ClassName,Handler ] ) ;end ;Method.Data := ComponentWithHandler ;SetMethodProp( ComponentWithEvent, PropInfo, Method ) ;end ; { примеры, показывающие как использовать SetEvent }procedure TForm1.SetBtnClick(Sender: TObject);beginSetEvent( MenuItem, 'OnClick', Self, 'Test1Click' ) ;end; procedure TForm1.ClearBtnClick(Sender: TObject);beginSetEvent( MenuItem, 'OnClick', NIL, '' ) ;end; |
- Mike Scott [000763]