Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2009年05月27日] [更新 2013年12月18日] エクセル操作フォームEx
エクセル操作フォームEx   参考コード類
オートシェイプの描画
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro + Excel 2010







オートシェイプの描画


シートにオートシェイプを描画するサンプルです。FillFormat、ShadowFormat 等のオブジェクトを使用します。半透明は均一な色の図形および線にだけに対して有効なプロパティです。位置とサイズはポイント数で指定します。
オートシェイプは、エクセルのバージョンによって、同じコードでもデフォルトの色や線の太さ等に違いがあるようです。Excel 2000 当時に作成したものを Excel 2010 でテストしたのですが、同じ様にするのに苦労しました。


図1
実行前のシート




半透明の楕円を描画


半透明の楕円の描画例です。Fill プロパティを FillFormat オブジェクト型でキャストしています。


図2
実行結果

リスト1 
procedure TplExcelFormEx1.Button1Click(Sender: TObject);
var
  AShape : Txlf2000Shape;
begin
  //位置とサイズの指定はポイント
  AShape := xlfExcelSheet.Shapes.AddShape(msoShapeOval, 40, 20, 100, 100);
  //枠線の色
  (AShape.Line as LineFormat).ForeColor.RGB := RGB(0,150,0);

  //塗潰しの色と透明度
  (AShape.Fill as FillFormat).ForeColor.RGB := RGB(0,150,0);
  (AShape.Fill as FillFormat).Transparency  := 0.5;
end;




OleVariant 型を使用したオートシェイプの描画


実行結果は上のコードと同じですが、Shape オブジェクトを OleVariant 型にして操作します。
こうすると型キャストが必要ありません。


[備考]
Fill プロパティは、上のコードのように、FillFormat オブジェクトのことです。


リスト2
procedure TplExcelFormEx1.Button2Click(Sender: TObject);
var
  AShape : OleVariant;
begin
  //位置とサイズの指定はポイント
  AShape := xlfExcelSheet.Shapes.AddShape(msoShapeOval, 40, 20, 100, 100);
  //枠線の色
  AShape.Line.ForeColor.RGB := RGB(0, 150, 0);

  //塗潰しの色と透明度
  AShape.Fill.ForeColor.RGB := RGB(0, 150, 0);
  AShape.Fill.Transparency  := 0.5;
end;




グラデーション付きの四角形を描画


グラデーション付きの四角形の描画例です。


図3
実行結果

リスト3 
procedure TplExcelFormEx1.Button3Click(Sender: TObject);
var
  AShape : OleVariant;
begin
  AShape      := xlfExcelSheet.Shapes.AddShape(msoShapeRectangle, 50, 20, 72, 72);
  AShape.Name := 'Grad Square';

  AShape.Fill.ForeColor.RGB := RGB(200, 200, 200);
  AShape.Line.Weight        := 1;
  AShape.Fill.OneColorGradient(msoGradientHorizontal, 1, 1);
end;




影付き四角形を描画


影付きの四角形の描画例です。


図4
実行結果

リスト4 
procedure TplExcelFormEx1.Button4Click(Sender: TObject);
var
  AShape : OleVariant;
begin
  AShape := xlfExcelSheet.Shapes.AddShape(msoShapeRectangle, 50, 10, 80, 120);

  AShape.Fill.ForeColor.RGB := RGB(250, 250, 250);
  AShape.Line.Weight        := 1;
  AShape.Line.ForeColor.RGB := RGB(200, 200, 200);

  AShape.Shadow.OffsetX      := 5;
  AShape.Shadow.OffsetY      := -3;
  AShape.Shadow.Transparency := 0.7;
  AShape.Shadow.Visible      := msoTrue;
end;