Мониторинг обменных курсов валют
18c0693f

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


Вот процедура, назначающая событие компонента обработчику события другого (или того же самого) компонента, где во время выполнения программа само событие и его обработчик заданы в виде строки. В случае неверных имен события или его обработчика процедура возбуждает исключительную ситуацию. Вы можете "очищать" событие, передавая компоненту 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]






Самый выгодный курс обмена валюты