在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中到底是什么?
我一般这样用:
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中到底是什么?
解决方案 »
- TServerSocket大概可以同时被多少个客户端连接?
- 在线等:请问一条简单的sql条件删除语句?
- 请教高手在局域网能够通连,但是太远了就出问题!!
- 我用Session登录系统时想固定转向到特定的网页,但不行,我用的是D6,请高手帮忙。
- 我用DELPHI在本地做了一个小程序,功能中要用到数据库(ACCESS),而该数据库又放在INTERNET上,我能否让该程序和ACCESS相连,如何做?
- 在线等待!在Excel中 A1与B2画一个边框线,中间不画线
- 此程序错在那?怎么改?
- Delphi 中的消息处理问题
- 在Win2000下用DELPHI编写程序,应该怎样做才能令它在WIN2000和WIN98运行的效果一样呢?(如该用什么字体等)
- 请问各位,“砼”字怎么念?
- 北京的朋友注意了,我要找一个DELPHI家教
- 有个朋友天天做这样的事情:。。。。。。谁来帮我编个程??
生存期自管理的。要没有指针(变量)指向他就会释放。
可以用
xxx:=nil来把变量不指向他。使其计数器减一。如果计数器为0就会自动释放
我关心的不是对象的生存期的问题,那是Excel的事。我只是像判断'Age'找到了没有。kaidu(Roger):
nil只能用于Delphi的原生(native)指针,不能用于类型为varDispatch的OleVariant变量。
有定义
var
EntryA: OleVariant;现在我用了
EntryA := Worksheet.Cells.Find(LookAt := xlPart, What := 'Age');我在Delphi中如何判断'Age'是否被找到?
这在VB中是通过一句
If Not EntryA Is Nothing Then 来完成的。
if assigned(p) then
p:=unassigned;
function VarIsEmpty(const V: Variant): Boolean;
赋值后的EntryA是有类型的变量,类型是varDispatch,不是Unassigned。
所以也不能使用VarIsEmpty来判断。我试过的,不论'Age'能不能找到,EntryA都不是Unassigned的。Unassigned只是用来标示“什么都不是的”Variant变量用的。
Set c = Worksheets(1).Cells.Find(LookAt := xlPart, What := 'Age')
If Not c Is Nothing Then
...在Delphi中应该如何写?
if EntryA = nil then
...
都通不过编译。至于PChar(nil)倒是很有意思,写下
if EntryA = PChar(nil) then
可以通过编译,不过在执行期会出现异常“Could not convert variant of type (Dispatch) into type (String)”