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