6

我正在尝试将程序从 Delphi 2010 转换为 Delphi XE7(32 位/windows VCL)。曾经在 D2010 中通过后期绑定 OLE 自动化 Excel 的代码现在在 Delphi XE7 中给出异常“无法设置应用程序类的窗口状态属性”,当应用程序最大化或最小化时。

我从具有以下常量的 ExcelXP 单元中获取常量 xlmaximized 和 xlminimized: xlMaximized = $FFFFEFD7; xl最小化 = $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;
4

1 回答 1

3

这可能是数据类型问题。$FFFFEFD7作为有符号的 32 位整数是-4137(并且是 Excel 所期望的)。根据快速谷歌搜索,Delphi Longint 是 32 位 int 签名的,所以也许有一些类型转换正在进行......

根据OP自己的研究,设置

System.Variants.DispatchUnsignedAsSigned := True;

解决它。

于 2014-12-06T10:39:03.030 回答