【问题标题】:Delphi 'Could not convert variant of type (UnicodeString) into type (Boolean)Delphi'无法将类型(UnicodeString)的变体转换为类型(布尔)
【发布时间】:2013-01-28 14:10:16
【问题描述】:

我有这段代码可以根据列数据为网格行着色(网格来自 devexpress)

var
AColumn: TcxCustomGridTableItem;
gs: variant;
begin

  AColumn := (Sender as TcxGridDBTableView).GetColumnByFieldName('COLOR');

  gs := ARecord.Values[AColumn.Index];

  if VarType(gs) and VarTypeMask = varString or varUString then
    AStyle.Color := gs; //<<<----- exception

color 字段是 varchar (firebird),包含诸如 cllime、clred 等值... 但我在异常注释的行中收到错误“无法将类型(UnicodeString)的变体转换为类型(布尔)”。我应该改变什么?

谢谢

【问题讨论】:

  • AStyle.Color 属性是布尔类型(基于编译器错误)。 AStyle 是如何声明的?无论如何,您可以使用if VarIsType(gs, [varString, varUString]) then 来检查gs 中的值是否属于某种类型。
  • @TLama:我对变体类型了解不多,但if 部分看起来很可疑。它可能是正确的吗? [看起来 OP 几乎认为编译器接受自然语言输入!]
  • @TLama AStyle.Color 属于 TCOLOR 类型,编译器接受行为什么会引发异常?
  • if 中的逻辑需要括号。而且你不能神奇地将字符串变成颜色。您应该在您的字段上使用 AsString,然后使用 IIRC IdentToColor。
  • varUstring 不是布尔值!所以试试if (VarType(gs) and VarTypeMask = varString) or (VarType(gs) and VarTypeMask = varUString) then ...

标签: delphi


【解决方案1】:

我会将您的 if 声明替换为以下内容。它使用VarIsType 函数,该函数更直接地用于Variant 类型检查,它使用StringToColor 函数将存储在Variant 变量中的字符串值转换为颜色:

...
if VarIsType(gs, [varString, varUString]) then
  AStyle.Color := StringToColor(gs);

【讨论】:

  • 谢谢,但我遇到了这个解决方案的访问冲突!我期待它能够工作!
  • 这是一个不同的问题。那是因为AStyle 设置不正确。我们无法看到您的所有代码。这个答案很好。
  • +1,但在 System.pas 中的快速浏览显示 varString or varUString = varUString。 OP 代码 kludge 有效。 :)
  • @DavidHeffernan 我会检查一下,虽然这确实是我的全部代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
相关资源
最近更新 更多