我正在尝试将一个程序从Delphi2010转换到Delphi (32位/windows)。过去在D2010中工作的代码--通过后期绑定OLE实现自动Excel --现在在Delphi XE7中出现了“无法设置应用程序类的窗口状态属性”的异常,当应用程序被最大化或最小化时。
我从具有以下常数的ExcelXP单元中得到常数am最大值和最小值: xlmaximized = $FFFFEFD7;xlminimized = $FFFFEFD4;
但是,如果我使用简单的常量值-4137和-4140,程序工作正常。我意识到我一定是在做一些简单的错误的事情。
下面是一些说明问题的示例代码。我对此进行了测试,它在Delphi2010中工作,但在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;发布于 2014-12-06 10:39:03
这可能是一个数据类型问题。$FFFFEFD7作为一个带符号的32位整数是-4137 (也是-4137所期望的)。据快速古尔格搜索德尔菲隆特是签署32位int,所以可能有一些类型铸造正在进行.
根据OP自己的研究,
System.Variants.DispatchUnsignedAsSigned := True;解决了它。
https://stackoverflow.com/questions/27328018
复制相似问题