Excel 2010自动化常量不能在Delphi XE7中使用
我试图从delphi2010年转换为Delphi XE7(32位/ Windows VCL)的程序。 在D2010中用于通过后期绑定OLE自动化Excel的代码现在在应用程序被最大化或最小化时给出了Delphi XE7中的“无法设置应用程序类的窗口状态属性”exception。
我从具有这些常量的ExcelXP单元中获取常量xlmaximized和xlminimized:xlMaximized = $ FFFFEFD7; xlMinimized = $ FFFFEFD4;
但是,如果我使用简单的常量值-4137和-4140,程序确实工作正常。 我意识到我必须做一些简单的事情是错误的。
以下是一些说明问题的示例代码。 我testing了这个,它在delphi2010年,但不是在delphiXE7。 我想这应该是一个怎样处理新的版本中的常量(?)有人可以指出我在正确的方向吗? 提前致谢!
//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;
这可能是一个数据types的问题。 $FFFFEFD7
作为一个有符号的32位整数是-4137
(这是Excel的期望)。 根据一个快速的search结果, Delphi Longint签名为32位int,所以也许有一些types的转换正在进行中…
根据OP自己的研究,设定
System.Variants.DispatchUnsignedAsSigned := True;
解决它。