如何检查Variant是否已设置varByRef标志?

use*_*150 2 delphi

建议用来VarIsClear检查Variant是Null,Empty还是Unassigned.但是Unassigned如果设置了varByRef标志,我发现函数可以在调试器中返回False变量.VarIsClear检查

function VarIsClear(const V: Variant): Boolean;
var
  LHandler: TCustomVariantType;
  LVarData: TVarData;
begin
  LVarData := FindVarData(V)^;
  with LVarData do
    if VType < CFirstUserType then
      Result := (VType = varEmpty) or
                (((VType = varDispatch) or (VType = varUnknown)) and
                  (VDispatch = nil))
    else if FindCustomVariantType(VType, LHandler) then
      Result := LHandler.IsClear(LVarData)
    else
      Result := False;
end;
Run Code Online (Sandbox Code Playgroud)

在我的情况下,VType是16384($ 4000 = varByRef).如何检查Null,Empty或Unassigned是否正确?

Dav*_*nan 10

  • 检查未分配VarIsEmpty.
  • 检查未定义的值VarIsClear.
  • 检查空值VarIsNull.

因此,您似乎需要VarIsEmpty检查未分配的变体.

根据文档,您的变体类型VT_EMPTY | VT_BYREF无效.这在本文中明确提到:

不得使用VT_BYREF位标志指定VT_EMPTY和VT_NULL值.

所以这意味着你的变体是无效的,当它们被呈现无效输入时,期望任何RTL函数是不合理的.

我怀疑你需要修复提供这个无效变体的代码,或者解决破坏的代码.

  • 显而易见的结论是变体不是未分配的. (2认同)