Delphi OpenTools API 获取组件属性
Posted
技术标签:
【中文标题】Delphi OpenTools API 获取组件属性【英文标题】:Delphi OpenTools API get component property 【发布时间】:2017-01-29 12:28:18 【问题描述】:我正在实现一个包以在 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 是否正确。
谢谢
【问题讨论】:
IIRC,aVal
的类型应为 IOTAComponent
或 TIComponentInterface
。这取决于mycomp
的类型。
【参考方案1】:
假设GetPropValueByName()
返回一个有效的TValue
(您没有显示该代码),那么使用aVal.AsClass
是错误的,因为SQL
属性getter 不返回元类类型。它返回一个对象指针,所以请改用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);
【讨论】:
以上是关于Delphi OpenTools API 获取组件属性的主要内容,如果未能解决你的问题,请参考以下文章
Delphi OpenTools API:如何获取 AfterCompile 通知?
Delphi OpenTools API - 编辑项目需要子句