我正在编写一个发布名为“ Value”的Variant属性的组件。
在对象检查器窗口中,我可以看到属性及其类型。
有时,从下拉列表中选择“字符串”类型后,它会变成“未知”。
这是setter方法的代码:
procedure TMyComponent.FSetValue(const AValue : Variant);
begin
if(FValue <> AValue) OR (TVarData(FValue).VType <> TVarData(AValue).VType) then
begin
FValue := AValue;
if(@FOnChanged <> nil)
then FOnChanged(Self);
end;
end;
有什么应该改变的吗?
更多信息:
当出现“未知”类型时,AValue参数的类型设置为256。
在System.pas中,我发现了这一点:
varString = $ 0100; {Pascal字符串256} {不兼容OLE}
..但我仍然不明白为什么显示“未知”。
最佳答案
问题似乎是因为DesignEditors中的函数TVariantTypeProperty.GetValue从Variant值中读取类型,然后尝试在一个受限列表中查找它,该列表似乎仅涵盖OLE兼容变体以及UniCode字符串的特定异常。 TVariantTypeProperty.SetValue的代码将“字符串”转换为varString类型,它似乎是旧样式AnsiString的代理,而不是现代UniCode字符串的代理。 GetValue转换类型varUString以将类型显示为字符串,并将varString保留为“未知”。这看起来像是Delphi设计界面中的错误,因为GetValue和SetValue方法之间确实应该没有任何差异。
我仅在XE2上进行了检查,因此尽管您可以合理地认为至少所有以前的版本(因为Unicode转换都受到了影响)都无法确定,但其他/哪些版本可能/不会受到影响。
关于delphi - 如何正确设置变体发布的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29979950/