Назначение события во время выполнения программы



Автор: 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;


Далее: Определить и выставить значение текстового свойства »»