delphi - 如何正确设置变体发布的属性

标签 delphi types properties set variant

我正在编写一个发布名为“ 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/

相关文章:

delphi - Delphi 中的动态赋值

delphi - Delphi Win64中如何获取当前用户的全名

vba - 如何将对象插入作为用户修改类的字段的数组中? VBA

objective-c - 在 Objective-C 中获取对象的属性数组

properties - 我无法配置具有多个条件的 log4j2 属性文件

delphi - 在delphi中分配一个字节数组并随后释放它

delphi - 邮槽永远阻塞

types - typescript 中的 GUID/UUID 类型

c++ - 使用 sizeof 获得两个的最大幂

nhibernate - 操作数类型冲突 : bigint is incompatible with time