CHE*_*APS 6 delphi excel ole delphi-2010 delphi-xe7
我正在尝试将程序从 Delphi 2010 转换为 Delphi XE7(32 位/windows VCL)。曾经在 D2010 中通过后期绑定 OLE 自动化 Excel 的代码现在在 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;
Run Code Online (Sandbox Code Playgroud)
这可能是一个数据类型问题。$FFFFEFD7作为有符号 32 位整数-4137(也是 Excel 所期望的)。根据快速谷歌搜索, Delphi Longint 是有符号的 32 位 int,所以也许正在进行某种类型转换......
根据OP自己的研究,设置
System.Variants.DispatchUnsignedAsSigned := True;
Run Code Online (Sandbox Code Playgroud)
解决它。
| 归档时间: |
|
| 查看次数: |
1419 次 |
| 最近记录: |