Delphi OpenTools API получает свойство компонента

Я реализую пакет для преобразования и автоматической генерации компонентов в Delphi IDE. Я знаю, что GExperts имеет аналогичную функцию, но мне нужно настроить некоторые конкретные свойства.

Прямо сейчас я застрял на доступ к TADOQuery.SQL свойство, которое является экземпляром TStrings:

var
    aVal : TValue;
    aSqlS : TStrings;
begin
    [...]
    if (mycomp.GetComponentType = 'TADOQuery') then
        if mycomp.GetPropValueByName('SQL', aVal) then
        begin
            aSqlS := TStrings(aVal.AsClass);
            if Assigned(aSqlS) then             <----- problem is here
                ShowMessage(aSqlS.Text);        <----- problem is here
        end;
end;

Я не совсем уверен, правильно ли использовать TValue из RTTI.

Спасибо

1 ответ

Если предположить, GetPropValueByName() возвращает действительный TValue (вы не показали этот код), затем с помощью aVal.AsClass неправильно, так как SQL Получатель свойства не возвращает тип метакласса. Он возвращает указатель на объект, поэтому используйте aVal.AsObject вместо или даже aVal.AsType<TStrings>,


Обновить, если comp на самом деле IOTAComponent чем TValue определенно неправильно использовать вообще. Выход из IOTAComponent.GetPropValueByName() нетипизированный var который получает необработанные данные о значении свойства или IOTAComponent за TPersistentобъекты:

var
  aVal: IOTAComponent;
  aSqlS : TStrings;
begin
    [...]
    if (mycomp.GetComponentType = 'TADOQuery') then
      if mycomp.PropValueByName('SQL', aVal) then
        ShowMessage(TStrings(aVal.GetComponentHandle).Text);
end;

Тем не менее, лучшим вариантом будет доступ к фактическому TADOQuery объект вместо:

if (mycomp.GetComponentType = 'TADOQuery') then
  ShowMessage(TADOQuery(comp.GetComponentHandle).SQL.Text);
Другие вопросы по тегам