2013-11-03 54 views
1

用Delphi改变图表位置,创建一个excel工作表的一些数据值,然后我创建图表:在Excel产生访问冲突

WChart := ((ExcelApplication1.Workbooks[1].ActiveSheet) as _Worksheet).Shapes.AddChart(xl3DPie, 
           EmptyParam, EmptyParam, 
           EmptyParam, EmptyParam).Chart; 

该图表在片材上正确创建。 现在我想将它移动到新的工作表是这样的:

WChart.Location(xlLocationAsNewSheet, EmptyParam); 

这导致访问冲突。

我谷歌搜索了很多,没有找到使用Delphi的例子。所有其他语言(如VBA)正在做一些等同于我的代码的东西。

任何帮助表示赞赏。

编辑:

这里是行触发AV汇编代码:

WChart.Location(xlLocationAsNewSheet, EmptyParam); 
    lea eax,[ebp-$0000019c] 
    call @IntfClear 
    push eax 
    lea eax,[ebp-$000001ac] 
    call EmptyParam 
    push dword ptr [ebp-$000001a0] 
    push dword ptr [ebp-$000001a4] 
    push dword ptr [ebp-$000001a8] 
    push dword ptr [ebp-$000001ac] 
    push $01 
    mov eax,[ebp-$14]     // [ebp-$14] is WChart value 
    push eax 
    mov eax,[eax] 
    call dword ptr [eax+$00000198] // Supposed to call Location() 
    call @CheckAutoResult 
+0

您可以更具体地了解访问冲突吗? (什么是具体的消息,包括涉及的内存地址?)另外,试图将图表移动到与创建它的代码相关的代码的位置在哪里?是 –

+0

您是否尝试给新的工作表命名(而不是EmptyParam)? –

+0

访问冲突是“异常类$ C0000005,消息'0x00080004访问冲突:读取地址0x00080004',我提到的两行只是一个接一个地使用表名不会改变任何内容 – fpiette

回答

2

我无法弄清楚您遇到的特定问题(我得到一个不同的AV,但它仍然是一个AV)。不过,如果您有兴趣,可以使用以下解决方法。

var 
    Book: _Workbook; 
    LCID: Integer; 
    Chart: _Chart; 
begin 
    LCID := GetUserDefaultLCID; 

    Book := ExcelApplication1.ActiveWorkbook; 
    Chart := Book.Charts.Add(EmptyParam, EmptyParam, 
          EmptyParam, EmptyParam, LCID) as _Chart; 

    // Tested, and the second param below can be EmptyParam to leave 
    // the new sheet name as "Chart1". 
    Chart.Location(xlLocationAsNewSheet, 'ChartSheet'); 
end;