在Delphi 6中,对于OLE Automation Objects的存取一般是通过Variant变量来实现的。
我一般这样用:
ExcelApp := CreateOleObject('Excel.Application');
Workbook := ExcelApp.Workbooks.Open('A.xls');
Worksheet := Workbook.ActiveSheet;然后我可以这样:
EntryA := Worksheet.Cells.Find(LookAt := xlPart, What := 'Age');在VB中,根据msdn上的例程,如果没有找到'Age',Excel就会返回Nothing。
所以可以这样写
If Not EntryA Is Nothing Then ...
通过看EntryA是否等于Nothing来判断是否找到了'Age'。
我要问的是这个Nothing在Delphi 6中应该是什么?我在Delphi中如何判断有否找到了'Age'?我观察过,对含有Nothing的EntryA施行VarType(),会得到
varDispatch = $0009;
说明它还是一个IDispatch。
然后用Delphi IDE的Watch看EntryA的内容,是$00000000。说明是一个指向空的IDispatch指针。
所以我就写了这么一段东东:
function IsNothing(A: Variant): Boolean;
type
PPointer = ^Pointer;
PDWORD = ^DWORD;
var
P: Pointer;
begin
P := @A;
if (nil = PPointer(DWORD(P)+1)^) and (9 = DWORD(PPointer(P)^)) then
Result := true
else
Result := false;
end;
可这方法实在愚蠢之极,竟还依赖于Variant变量的二进制内存布局。那个Nothing在Delphi中到底是什么?

解决方案 »

  1.   

    nil;
    生存期自管理的。要没有指针(变量)指向他就会释放。
    可以用
    xxx:=nil来把变量不指向他。使其计数器减一。如果计数器为0就会自动释放
      

  2.   

    绝对不是这个意思。在以上程序中,EntryA是一个Variant变量,在被赋上Excel的返回值以后,类型是varDispatch,绝对不是varNull。wr960204(武稀松):
    我关心的不是对象的生存期的问题,那是Excel的事。我只是像判断'Age'找到了没有。kaidu(Roger):
    nil只能用于Delphi的原生(native)指针,不能用于类型为varDispatch的OleVariant变量。
      

  3.   

    总而言之:
    有定义
    var
      EntryA: OleVariant;现在我用了
    EntryA := Worksheet.Cells.Find(LookAt := xlPart, What := 'Age');我在Delphi中如何判断'Age'是否被找到?
    这在VB中是通过一句
    If Not EntryA Is Nothing Then 来完成的。
      

  4.   

    variant:
    if assigned(p) then
       p:=unassigned;
    function VarIsEmpty(const V: Variant): Boolean;
      

  5.   

    ssl2000(大宋):
    赋值后的EntryA是有类型的变量,类型是varDispatch,不是Unassigned。
    所以也不能使用VarIsEmpty来判断。我试过的,不论'Age'能不能找到,EntryA都不是Unassigned的。Unassigned只是用来标示“什么都不是的”Variant变量用的。
      

  6.   

    简而言之,就是说在VB中的这么一段:
    Set c = Worksheets(1).Cells.Find(LookAt := xlPart, What := 'Age')
    If Not c Is Nothing Then
    ...在Delphi中应该如何写?
      

  7.   

    绝对不是nil,不能简单的拿EntryA和nil比较。不信大家就试试。
      

  8.   

    多谢大家的帮助上面已经说过,'Age'没有找到时,EntryA不是Unassigned。它是有实际类型的,是varDispatch类型。表明它是一个IDispatch类型的接口。只是这个接口不指向任何东西。肯定不是nil,如果写
    if EntryA = nil then
    ...
    都通不过编译。至于PChar(nil)倒是很有意思,写下
    if EntryA = PChar(nil) then
    可以通过编译,不过在执行期会出现异常“Could not convert variant of type (Dispatch) into type (String)”