2009-04-14 56 views
1

我们刚从德尔福2006年更新了一个应用程序使用Excel类型库到德尔福2009年。我发现几乎没有任何工作 - 几乎任何调用Excel结果一条消息“不良变量类型”。例如,我们可能会这样做:Sheet.Cells.Item [Row,Column] .Value:=其中Sheet是ExcelWorksheet且Value是Variant的值。我们在堆栈中看到的下一件事是调用Variants中的_DispInvoke,然后调用ComObj。我究竟做错了什么?Excel类型库/德尔福2009 /坏变量类型

回答

2

原来我们有一个通用的方法来设置格式的单元格的值:

procedure SetValue(aSheet: ExcelWorksheet; aRow, aCol: Integer; aValue: Variant) 
begin 
    aSheet.Cells.Item[aRow, aCol].Value := aValue; 
end; 

失败与我提到的错误。如果我更改为:

procedure SetValue(aSheet: ExcelWorksheet; aRow, aCol: Integer; aValue: Variant) 
var 
    sValue: WideString; 
begin 
    sValue:= aValue; 
    aSheet.Cells.Item[aRow, aCol].Value := sValue; 
end; 

对我来说这表明德尔福2009年是干什么用的变体不同的东西(比D2006是至少),一些COM不喜欢,除非有人有更好的解释吗?无论如何,我很高兴暂时解决这个问题。

+0

变体中的值是什么类型?看起来这将创建COM需要的字符串类型的新变体。也许你的旧代码传递了COM变体不支持的ANSIString? – mj2008 2009-04-15 17:16:31

2

如果Excel或Delphi版本发生更改,我可以建议您重新创建/重新导入类型库。使用其他版本的TLB通常会产生这些问题。

+0

我们以前使用的Office XP样本导入与Delphi 2006和2009一起提供,而且这对于Excel 2000-2007似乎工作正常(对于我们如何使用它)。无论如何,我现在已经重新导入了类型库并得到完全相同的问题。 – Andrew 2009-04-14 14:02:15