Назначение события во время выполнения программы
Автор: Mike Scott
Вот процедура, назначающая событие компонента обработчику события другого (или того же самого) компонента, где во время выполнения программа само событие и его обработчик заданы в виде строки. В случае неверных имен события или его обработчика процедура возбуждает исключительную ситуацию. Вы можете "очищать" событие, передавая компоненту 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; |
Далее: Определить и выставить значение текстового свойства »»