首页 > 解决方案 > Delphi - Excel - 为形状添加阴影

问题描述

我有一个 Excel 电子表格,其中包含一系列已知的图片。我需要为这些图片添加一个阴影(名为 SoftEdge 的属性)。虽然执行此操作的 VBA 代码很容易(通过宏录制捕获),但我无法让 Delphi 等效工作。我遍历每张图片,获取图片的句柄,然后设置 SoftEdge 类型。我知道我的句柄是有效的,因为我可以“MyExcelPic.Delete”并且有效。我尝试将 MyExcelPic 定义为 OleVariant 和 Shape。当定义为 Shape 时,我得到一个 AV,当定义为 OleVariant 时,我得到“自动化对象不支持的 type_”。

这是相关的代码片段...

var
MyExcelPic:  Shape;
begin
...
  for i := 1 to TotalPicCount do
  begin
     // VBA Code...
    //ActiveSheet.Shapes.Range(Array("Picture 13")).Select
    //Selection.ShapeRange.SoftEdge.Type = msoSoftEdgeType1

    MyExcelPic := ExcelCloudSheet.Shapes.Item('Picture ' + IntToStr(i));
    //MyExcelPic.Delete;
    MyExcelPic.SoftEdge.type_ :=  msoSoftEdgeType1;
  end;

我看到的唯一奇怪的是 Excel 宏定义了“type”,而 Delphi 定义了“type_”。在一个完美的世界里,我想要一张纸上的所有形状的范围,并一次性设置 SoftEdge 属性,但是在这一点上,任何设置这个属性的方式都很好......

标签: exceldelphi

解决方案


我使用 Variant 而不是 OLEVariant。您不能使用 Shape,也不需要下划线。您指出您切换到影子,但我认为这与问题无关。

使用您的代码,这将等同于以下内容

var
MyExcelPic:  Variant;
begin
...
  for i := 1 to TotalPicCount do
  begin
     // VBA Code...
    //ActiveSheet.Shapes.Range(Array("Picture 13")).Select
    //Selection.ShapeRange.SoftEdge.Type = msoSoftEdgeType1

    MyExcelPic := ExcelCloudSheet.Shapes.Item('Picture ' + IntToStr(i));
    //MyExcelPic.Delete;
    MyExcelPic.SoftEdge.type :=  msoSoftEdgeType1;
  end;

推荐阅读