【问题标题】:How to correctly set a Variant published property如何正确设置变体发布的属性
【发布时间】:2015-05-01 00:28:27
【问题描述】:

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

..但我仍然不明白为什么显示“未知”..

【问题讨论】:

  • FOnChanged 是否声明为 TNotifyEvent?如果是这样,为什么要使用@FOnChanged?删除@符号并重试?
  • @JSON - 这将尝试调用 FOnChanged,并且由于没有参数而无法编译。请改用 Assigned(FOnChanged),这就是 Assigned() 最初创建的目的
  • @Jason:当然,FOnChanged 是 TNotifyEvent 但它不会影响行为。 //if(@FOnChanged nil) //然后 FOnChanged(Self);类型“未知”仍然出现在对象检查器中。这种行为是否有原因?

标签: delphi types properties set variant


【解决方案1】:

问题似乎是因为 DesignEditors 中的函数 TVariantTypeProperty.GetValue 从 Variant 值中读取类型,然后尝试在有限列表中查找它,该列表似乎仅涵盖 OLE 兼容变体以及 UniCode 字符串的特定例外。 TVariantTypeProperty.SetValue 的代码将“字符串”转换为 varString 类型,这似乎是旧样式 AnsiString 而不是现代 UniCode 字符串的代理。 GetValue 转换类型 varUString 以将类型显示为字符串并将 varString 保留为“未知”。这看起来像是 Delphi 设计界面中的一个错误,因为 GetValue 和 SetValue 方法之间确实不应该有任何差异。

我仅在 XE2 上对此进行了检查,因此不知道哪些其他版本可能/可能不会受到影响,尽管您可以合理地解释至少自 Unicode 转换以来的所有先前版本都受到影响。

【讨论】:

  • 我也在 XE7 上检查了这个,行为/错误仍然是一样的。是否有避免出现“未知”类型的解决方法?
【解决方案2】:

我遇到了同样的问题。我能找到的唯一解决方法是将字符串值分配给 Value。像这样。

procedure TMyComponent.FSetValue(const AValue : Variant);
  begin
    if(FValue <> AValue) OR (TVarData(FValue).VType <> TVarData(AValue).VType) then
      begin
        FValue := AValue;

          case TVarData(FValue).VType of
            varString : FValue := VarToStr( AValue ); //converts FValue to a string
          end;

         if(@FOnChanged <> nil) then 
           FOnChanged(Self);
      end;
  end;

【讨论】:

    猜你喜欢
    • 2018-02-19
    • 2018-07-20
    • 1970-01-01
    • 2019-05-31
    • 2015-05-20
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 2019-01-23
    相关资源
    最近更新 更多