2013-11-03 72 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;