這是我碰到了,去年和SO似乎是一個好地方,記錄它:)檢查的變量值「無」
問:從當自動化Excel(/字/ ...) Delphi,如何檢查Excel函數是否返回了變量Nothing
(因爲它在VBA中調用)?
這是我碰到了,去年和SO似乎是一個好地方,記錄它:)檢查的變量值「無」
問:從當自動化Excel(/字/ ...) Delphi,如何檢查Excel函數是否返回了變量Nothing
(因爲它在VBA中調用)?
VarIsClear
函數包括您的情況,其中類型爲varDispatch
,值爲nil
。它還包含空值和「未知」值以及自定義變體類型。我在Delphi 2005的源代碼中看到它;我不知道它被包括在內多少。
奇怪的是,VBA的Nothing
是不一樣Unassigned
,Null
或Empty
,所以你不能使用,例如:
// Worksheet is a TExcelWorksheet or OleVariant coupled to an open worksheet
MyRange := Worksheet.Range['MyRangeInTheWorksheet', EmptyParam]
if (MyRange = Null) then // won't work!
MsgBox('The range doesn''t exist!');
相反,使用此功能:
function VarIsNothing(V: OleVariant): Boolean;
begin
Result :=
(TVarData(V).VType = varDispatch)
and
(TVarData(V).VDispatch = nil);
end;
// ...
if (VarIsNothing(MyRange)) then
更新
顯然,德爾福5和2007之間的RTL單元Variants.pas
的來源已經發生了變化。根據@mghie(參見注釋),函數VarIsEmpty
將在D5中完成這項工作。然而,在D2007中,這似乎不再是這種情況了,所以你可能會再次需要上述功能。
此外,請注意,VBA的Nothing
可能是一個相當特殊的情況;我不認爲用自動化經常遇到它。
VarIsEmpty(與VarIsNull不同)不是做你想做的?
@onnodb:如果用「VarIsNull(MyRange)」或「VarIsEmpty(MyRange)」代替「(MyRange = Null)」,我會禮貌地建議接受Craig的答案。無需爲已存在於庫中並記錄的內容編寫自定義函數。 – mghie 2009-02-23 15:39:34
@mghie:我很肯定那些做*不*與那討厭的`沒有`價值:) – onnodb 2009-02-23 16:27:33
@onnodb:看看VarIsEmpty()的源代碼 - 它是你的代碼的超集,至少在我現在看到的德爾福5版本中...... – mghie 2009-02-23 16:49:13