Таким образом, если третьим параметром метода «Add» будет задано True, то TVCLScriptControl установит обработчики событий OnClick, OnChange, OnEnter, OnExit и OnTimer на свои методы, реализованные следующим образом:
Code: |
procedure TVCLScriptControl.OnClickHandler(Sender: TObject); begin RunProc((Sender as TComponent).Name + '_' + 'OnClick'); end; |
Примером использования данной функциональности может служить следующий код:
Code: |
Sub Main() Self.Add "Timer1", "TTimer", True With Timer1 .Interval = 1000 .Enabled = True End With End Sub
Sub Timer1_OnTimer() Self.Caption = CStr(Time) End Sub |
Если требуется назначить обработчики событий имеющихся на форме компонентов – это может быть сделано в коде
Button1.OnClick := ScriptControl1.OnClickHandler;
или реализацией соответствующего метода в GetIdsOfNames и Invoke
Получение свойств
Для получения свойств классов VCL служит метод GetVCLProperty. В нем осуществляется трансляция типов данных Object Pascal в типы данных OLE.
Code: |
function TVCLProxy.GetVCLProperty(PropInfo: PPropInfo; dps: TDispParams; PDispIds: PDispIdList; var Value: OleVariant ): HResult; var I, J, K: Integer; S: String; P, P1: TPersistent; Data: PTypeData; DT: TDateTime; TypeInfo: PTypeInfo; begin Result := S_OK; case PropInfo^.PropType^.Kind of |
Для данных строкового и целого типа Delphi осуществляет автоматическую трансляцию
Code: |
tkString, tkLString, tkWChar, tkWString: // Символьная строка Value := GetStrProp(FOwner, PropInfo); tkChar, tkInteger: // Целое число Value := GetOrdProp(FOwner, PropInfo); |
Для перечисляемых типов OLE не имеет прямых аналогов. Поэтому для всех типов, кроме Boolean будем передавать символьную строку с именем соответствующей константы. Для Boolean имеется подходящий тип данных и этот случай необходимо обрабатывать отдельно
Code: |
tkEnumeration: begin // Проверяем, не Boolean ли это if CompareText(PropInfo^.PropType^.Name, 'BOOLEAN') = 0 then // Передаем как Boolean Value := Boolean(GetOrdProp(FOwner, PropInfo)); else begin // Остальные - передаем как строку I := GetOrdProp(FOwner, PropInfo); Value := GetEnumName(PropInfo^.PropType^, I); end; end; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!