Delphi-在Excel中更改图表标题会导致AV-使用完整示例更新

Delphi-在Excel中更改图表标题会导致AV-使用完整示例更新,excel,delphi,com,Excel,Delphi,Com,我正在使用Delphi Seattle在Excel(2013)中构建和显示图表。我从数据透视表构建图表。图表显示一切都很好。它有一个默认标题,所以我想更改它。这应该是一个简单的属性更改,但我不断收到AV错误。当我在谷歌上搜索时,我能找到的最接近的东西就是我需要在更改之前选择图表和/或图表标题[更新]这是一个显示问题的工作示例 procedure TForm1.Button1Click(Sender: TObject); var oExcel : ExcelApplication; Raw

我正在使用Delphi Seattle在Excel(2013)中构建和显示图表。我从数据透视表构建图表。图表显示一切都很好。它有一个默认标题,所以我想更改它。这应该是一个简单的属性更改,但我不断收到AV错误。当我在谷歌上搜索时,我能找到的最接近的东西就是我需要在更改之前选择图表和/或图表标题[更新]这是一个显示问题的工作示例

procedure TForm1.Button1Click(Sender: TObject);
var
  oExcel : ExcelApplication;
  RawDataSheet :_Worksheet;
  myChart: Shape;
begin
    oExcel := CreateOleObject('Excel.Application') as ExcelApplication;
    oExcel.Visible[LOCALE_USER_DEFAULT] := True;

   // Add a New Workbook, with a single sheet
   oExcel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT);
   // Get the handle to the active Sheet, and insert some dummy data
   RawDataSheet :=  oExcel.ActiveSheet as _Worksheet;
   RawDataSheet.Range['A1', 'B10'].value2 := 10;

    // Now add my chart
    myChart := RawDataSheet.Shapes.AddChart2(208, xlColumnClustered, 200, 10,  300, 300, True);

    // Try to access the Chart Title...  This always AVs here.
    myChart.Chart.HasTitle[LOCALE_USER_DEFAULT] := True;

    // Set Title Text.  If Comemnt out above line, this AVs as well
    myChart.Chart.ChartTitle[LOCALE_USER_DEFAULT].Caption := 'New Chart Title';

end;
我找不到任何办法来改变我的头衔。我甚至找不到任何方法来阅读现有的标题,更不用说修改了

ChartTitle的Microsoft对象模型文档说明这是正确的属性…()

附加信息:我确实生成了我自己的类型库Excel_TLB,并且在我的USES子句中有它。我完整的USES子句是

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, ComObj, Excel_TLB;

我可以设置一个标题如下。不同之处在于选择图表以便能够通过
ActiveChart
引用它。请注意,我的office 14没有
AddChart2
,因此我使用了
AddChart

uses
  comobj, excel_tlb;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  oExcel : ExcelApplication;
  RawDataSheet :_Worksheet;
  myChart: Shape;
begin
    oExcel := CreateOleObject('Excel.Application') as ExcelApplication;
    oExcel.Visible[LOCALE_USER_DEFAULT] := True;

   // Add a New Workbook, with a single sheet
   oExcel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT);
   // Get the handle to the active Sheet, and insert some dummy data
   RawDataSheet :=  oExcel.ActiveSheet as _Worksheet;
   RawDataSheet.Range['A1', 'B10'].value2 := 10;

    // Now add my chart
//    myChart := RawDataSheet.Shapes.AddChart2(208, xlColumnClustered, 200, 10,  300, 300, True);
    myChart := RawDataSheet.Shapes.AddChart(xlColumnClustered, 200, 10,  300, 300);
    myChart.Select(False);

    oExcel.ActiveChart.HasTitle[LOCALE_USER_DEFAULT] := True;
    oExcel.ActiveChart.ChartTitle[LOCALE_USER_DEFAULT].Caption := 'New Chart Title';
end;
还要注意的是,我不知道传递给
Select
的参数的含义


另一个可行的选择是在某一点(不再有效)后放弃类型安全,并依赖MS文档中的VBA示例(与生成的类型库的签名不匹配)。这样可以直接在图表上工作

procedure TForm1.Button1Click(Sender: TObject);
var
  oExcel : ExcelApplication;
  RawDataSheet :_Worksheet;
  myChart: Shape;
  V: OleVariant;
begin
    oExcel := CreateOleObject('Excel.Application') as ExcelApplication;
    oExcel.Visible[LOCALE_USER_DEFAULT] := True;

   // Add a New Workbook, with a single sheet
   oExcel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT);
   // Get the handle to the active Sheet, and insert some dummy data
   RawDataSheet :=  oExcel.ActiveSheet as _Worksheet;
   RawDataSheet.Range['A1', 'B10'].value2 := 10;

    // Now add my chart
//    myChart := RawDataSheet.Shapes.AddChart2(208, xlColumnClustered, 200, 10,  300, 300, True);
    myChart := RawDataSheet.Shapes.AddChart(xlColumnClustered, 200, 10,  300, 300);

    V := myChart.Chart;
    V.HasTitle := True;
    V.ChartTitle.Caption := 'Chart Title';
end;

我不知道为什么您必须使用ActiveChart而不是要访问的图表的句柄,但显然您需要。。。您的代码与Excel2013配合使用。。。非常感谢。这让我快发疯了。@user-也许你不必这么做。但是,由于它不能按预期工作(与类型库和文档不匹配),所以任何人都可以猜测您应该如何做。我用一个奇怪的解决方案更新了答案,而没有使用ActiveChart。