我正在尝试将一个程序从Delphi 2010转换到Delphi XE7(32位/Windows VCL)。在Delphi XE7中,通过后期绑定OLE自动化Excel的代码现在会导致异常“无法设置应用程序类的窗口状态属性”,当应用程序被最大化或最小化时。
我从ExcelXP单元获取常量xlmaximized和xlminimized,这些常量如下: xlMaximized = $FFFFEFD7; xlMinimized = $FFFFEFD4;
然而,如果我使用简单的常量值-4137和-4140,程序可以正常工作。我意识到我一定做错了一些简单的事情。
以下是一些示例代码,说明了问题。我测试过它,在Delphi 2010中可以工作,但在Delphi XE7中不行。我想这必须与新版本如何处理常量有关。请问有人能指点我正确的方向吗?谢谢!
我从ExcelXP单元获取常量xlmaximized和xlminimized,这些常量如下: xlMaximized = $FFFFEFD7; xlMinimized = $FFFFEFD4;
然而,如果我使用简单的常量值-4137和-4140,程序可以正常工作。我意识到我一定做错了一些简单的事情。
以下是一些示例代码,说明了问题。我测试过它,在Delphi 2010中可以工作,但在Delphi XE7中不行。我想这必须与新版本如何处理常量有关。请问有人能指点我正确的方向吗?谢谢!
//XLA is a global variable of type OLEVariant;
//Program uses ComObj and ExcelXP unit
//This proc just runs or connects to Excel
procedure TForm3.RunExcelClick(Sender: TObject);
begin
try
xla := GetActiveOLEObject('Excel.Application');
except
try
xla := CreateOleObject('Excel.Application');
except
on E: Exception do
begin
ShowMessage(E.Message);
end;
end;
xla.Visible := true;
end;
end;
procedure TForm3.MaxExcelClick(Sender: TObject);
begin
//This is the code that gives the exception
xla.windowstate := xlmaximized; //-4137; Works OK if use this number
end;
procedure TForm3.MinExcelClick(Sender: TObject);
begin
//Or this. I also get exceptions
xla.windowstate := xlminimized ; //-4140; Works OK if use this number
end;
$FFFFEFD7
作为 有符号 32 位整数是-4137
(这也是 Excel 预期的)。根据快速谷歌搜索,Delphi Longint 是 有符号的 32 位整数,所以可能存在一些类型转换。 - chris neilsen