Excel 2010自动化常量在Delphi XE7中无法正常工作

6
我正在尝试将一个程序从Delphi 2010转换到Delphi XE7(32位/Windows VCL)。在Delphi XE7中,通过后期绑定OLE自动化Excel的代码现在会导致异常“无法设置应用程序类的窗口状态属性”,当应用程序被最大化或最小化时。
我从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;

常量在Excel对象模型中定义,但似乎在Delphi XE7中没有(如果它们可以在Delphi 2010中工作,则也必须在那里定义)。通常,在_后期绑定_时,您需要按其值指定常量(或者自己声明为常量)。您确定原始的Delphi 2010代码中没有这样做吗?您总是可以使用_早期绑定_... - chris neilsen
我想我已经找到了问题所在,但并不真正理解发生了什么。这些常量在两个程序中都是相同的,并且在ExcelXP单元中被定义为十六进制值的$符号。在Delphi2010中,它们被用作shortint值(最高32768),因此xlmaximized的十六进制值($FFFFEFD7)被用作-4137。但是,在Delphi XE7中,这个相同的十六进制值变成了4294963159(一个LongInt)。然而,我很困惑,不知道何时以及为什么会进行这种更改,因为它似乎破坏了OLE常量的使用。或者我可能错过了Delphi中的一些基本设置? - CHEAPS
一个短期解决方案是这样包装常量:ShortInt(xlmaximized)。 - CHEAPS
1
这可能是一个数据类型问题。$FFFFEFD7 作为 有符号 32 位整数是 -4137(这也是 Excel 预期的)。根据快速谷歌搜索,Delphi Longint 有符号的 32 位整数,所以可能存在一些类型转换。 - chris neilsen
3
好的,我明白了。Longint/shortint 是一个误导性线索。谢谢 @Chris 提供的信息,抱歉我需要一些时间才能理解你的观点。结果证明你需要设置这个: System.Variants.DispatchUnsignedAsSigned := True;参考链接:http://docwiki.embarcadero.com/Libraries/XE7/en/System.Variants.DispatchUnsignedAsSigned - CHEAPS
显示剩余6条评论
1个回答

3
很可能是数据类型问题。作为有符号32位整数,$FFFFEFD7-4137(Excel所期望的)。根据快速谷歌搜索,Delphi Longint 是有符号32位整数,因此可能存在某些类型转换...
根据OP自己的研究,设置
System.Variants.DispatchUnsignedAsSigned := True;

解决它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接