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