0

我正在实现一个包以在 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;

我不确定使用RTTI 中的TValue是否是正确的方法。

谢谢

4

1 回答 1

2

假设GetPropValueByName()返回一个有效的TValue(您没有显示该代码),那么 usingaVal.AsClass是错误的,因为SQL属性 getter 不返回元类类型。它返回一个对象指针,因此请aVal.AsObject改用,甚至使用aVal.AsType<TStrings>.


更新如果comp实际上IOTAComponentTValue使用绝对错误。的输出IOTAComponent.GetPropValueByName()是接收属性值的原始数据的无类型var,或IOTAComponentforTPersistent派生对象:

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);
于 2017-01-29T18:50:45.990 回答