Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2005年01月22日] [更新 2013年11月25日] Delphi サンプルプログラム集
拙作のコンポーネント類を使用したサンプル
T130_TPanel 上に印刷プレビュー・ワード・エクセルを表示
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro
以下の拙作のコンポーネント類が必要
TplSetPrinter, TplPrev, TplExcelFormEx, TplWordFormEx
T130_FormPanel3.zip [1,051 KB] 2013年11月25日版 (EXE 同梱)



  • 2010年09月09日
  • ワード操作フォームEx とエクセル操作フォームEx の更新による更新
  • 2013年11月05日
  • Windows 7 U64(SP1) + Delphi XE Proで動作確認




印刷プレビュー・ワード・エクセル操作フォームEx を表示


印刷プレビュー制御,ワード操作フォームEx,エクセル操作フォームExを,メインフォーム上で切り換えて表示するテストです.
メールからの問合わせの時は,TPageControl を使用して作成したのですが,その後 TFormPanel を使用したコードに変更しましたが,TFormPanel を使用したサンプルは他にもあるので,TPanel 上に表示する方式に変更しました.
基本的に,印刷プレビュー制御とワード操作フォームEx,エクセル操作フォームEx は利用目的が違うのですが,いろいろな用途を考えて下さる方がいて,嬉しいような気もします.必要な場面があれば参考にして下さい.

ワード操作フォームEx,エクセル操作フォームを他のフォームに埋め込んで使用する場合,実行時に生成して埋め込むと,正常に起動できません.そこで,どちらも自動生成にしています.


図1
メインフォームの設計時画面
  • TApplicationEvents コンポを配置
  • 実行開始時もこの画面
図2
エクセル操作フォームEx
  • 各種操作ボタンを配置
図3
実行画面 印刷プレビュー
図4
ワード操作フォームEx を表示
図5
エクセル操作フォームExを表示
  • [表をコピー] ボタンをクリック...
図6
ワードの文書に表が貼り付く

リスト1
印刷プレビュー,ワード操作フォームEx,エクセル操作フォームEx を同じフォームに表示
unit FormPanel3Unit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, AppEvnts;

type
  TForm1 = class(TForm)
    Panel0: TPanel;
    SpeedButton01: TSpeedButton;
    SpeedButton02: TSpeedButton;
    SpeedButton03: TSpeedButton;
    SpeedButton10: TSpeedButton;
    PanelRight: TPanel;
    Panel1: TPanel;
    ApplicationEvents1: TApplicationEvents;
    procedure SpeedButton10Click(Sender: TObject);
    procedure SpeedButton01Click(Sender: TObject);
    procedure SpeedButton02Click(Sender: TObject);
    procedure SpeedButton03Click(Sender: TObject);
    procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure ApplicationEvents1Deactivate(Sender: TObject);
  private
    { Private 宣言 }
    IsPrevShow   : Boolean;
    IsWordShow   : Boolean;
    IsExcelShow  : Boolean;
    ForeWnd      : HWND;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses plPrevfrm, Unit1, Unit2, Unit3;

{$R *.DFM}

//=============================================================================
//  各フォームの表示フラグの初期化
//=============================================================================
procedure TForm1.FormShow(Sender: TObject);
begin
  IsPrevShow  := False;
  IsWordShow  := False;
  IsExcelShow := False;
end;

//=============================================================================
//  ApplicationEvents1のOnDeactiveイベント処理
//  このフォームが非アクティブになっても,このフォーム上で起動していワードまた
//  エクセルがアクティブなら,このフォームがアクティブなように見せる
//=============================================================================
procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin
  ForeWnd := GetActiveWindow;
  if (ForeWnd <> plPrevForm2.Handle) then begin
    Perform(WM_NCACTIVATE, 1, 0);
  end;
end;

//=============================================================================
//  閉じる時はワード操作フォームExとエクセル操作フォームExも閉じる
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  plWordFormEx1.Close;
  plExcelFormEx3.Close;
end;

//=============================================================================
//  印刷プレビュー制御フォームをPanelに表示
//=============================================================================
procedure TForm1.SpeedButton01Click(Sender: TObject);
begin
  if IsPrevShow = False then begin
    plPrevForm2.Parent      := PanelRight;
    plPrevForm2.WindowState := wsMaximized;
    plPrevForm2.BorderStyle := bsNone;
    IsPrevShow              := True;
  end;

  plPrevForm2.Show;
end;

//=============================================================================
//  ワード操作フォームExをPanelに表示
//=============================================================================
procedure TForm1.SpeedButton02Click(Sender: TObject);
var
  AFileName : String;
begin
  if IsWordShow = False then begin
    plWordFormEx1.Parent             := PanelRight;
    plWordFormEx1.BorderStyle        := bsNone;
    plWordFormEx1.btnClose.Visible   := False;
    plWordFormEx1.PanelRight.Visible := False;
    plWordFormEx1.Align              := alClient;
    AFileName := ExtractFilePath(Application.Exename) + 'AWordTest.doc';
  end;

  if IsWordShow = False then begin
    IsWordShow := True;
    plWordFormEx1.wdfFileFullPath := AFileName;
  end;
  //ワード操作フォームEx(の継承フォーム)を表示
  plWordFormEx1.Show;

  //ワード・エクセル操作フォームExではウィンドウが表示状態だとグローバルフッ
  //クが有効になったままになり,フォーカス移動がうまくいかない
  if Assigned(plExcelFormEx3.xlfExcelApp) then begin
    plExcelFormEx3.xlfStopHook;
  end;
  plWordFormEx1.wdfStartHook;
  plWordFormEx1.wdfDlgWordFocused := True;
end;

//=============================================================================
//  エクセル操作フォームExをPanelに表示
//=============================================================================
procedure TForm1.SpeedButton03Click(Sender: TObject);
var
  AFileName : String;
begin
  if IsExcelShow = False then begin
    plExcelFormEx3.Parent             := PanelRight;
    plExcelFormEx3.BorderStyle        := bsNone;
    plExcelFormEx3.btnClose.Visible   := False;
    plExcelFormEx3.Align              := alClient;

    IsExcelShow := True;
    AFileName := ExtractFilePath(Application.Exename) + 'AExcelTest.xls';
    plExcelFormEx3.xlfBookFullPath := AFileName;
  end;

  //エクセル操作フォームEx(の継承フォーム)を表示
  plExcelFormEx3.Show;

  //ワード・エクセル操作フォームExではウィンドウが表示状態だとグローバルフッ
  //クが有効になったままになり,フォーカス移動がうまくいかない
  if Assigned(plWordFormEx1.wdfWordApp) then begin
    plWordFormEx1.wdfStopHook;
  end;
  plExcelFormEx3.xlfStartHook;

  plExcelFormEx3.xlfSetFocusExcel;
  plExcelFormEx3.xlfDlgExcelFocused := True;
end;

//=============================================================================
//  閉じる
//=============================================================================
procedure TForm1.SpeedButton10Click(Sender: TObject);
begin
  //保存済みとする
  if Assigned(plWordFormEx1.wdfWordApp) then begin
    if plWordFormEx1.wdfWordApp.Documents.Count > 0 then begin
      plWordFormEx1.wdfWordDoc.Saved := True;
    end;
  end;

  if Assigned(plExcelFormEx3.xlfExcelApp) then begin
    plExcelFormEx3.xlfBookSaved := True;
  end;

  Hide;
  //各操作フォームを閉じる
  plWordFormEx1.Close;
  plExcelFormEx3.Close;
  plPrevForm2.Close;

  Close;
end;

//=============================================================================
//  マウスホイールは親のイベントを使用する
//  usseにplPrevfrmが必要
//=============================================================================
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
  SB : TScrollingWinControl;
begin
  if plPrevForm2 = nil then exit;

  SB := plPrevForm2.ScrollBox1;
  if FindVCLWindow(MousePos) = SB then begin
    Handled:=True;
    SB.VertScrollBar.Position := SB.VertScrollBar.Position - WheelDelta div 5;
  end;
end;

end.


リスト2
印刷プレビュー制御のプレビューフォーム (継承フォーム) のコード
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  PLPREVFRM, Menus, ExtCtrls, ComCtrls, Buttons, ToolWin, plPrev;

type
  TplPrevForm2 = class(TplPrevForm)
    plPrev1: TplPrev;
    procedure plPrev1FormShow(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  plPrevForm2: TplPrevForm2;

implementation

{$R *.DFM}

//=============================================================================
//   矩形を描き,そこを基準にしてルーチン名と同じ文字列を描画
//=============================================================================
procedure TplPrevForm2.plPrev1FormShow(Sender: TObject);
var
  X1 : Integer;
  X2 : Integer;
  Y1 : Integer;
  Y2 : Integer;
begin
  plPrev1.BeginDoc;

  plPrev1.FontSize(20);
  plPrev1.FontName('Courier New');
  plPrev1.PenWidth(1);
  plPrev1.PenColor(clBlue);

  //矩形の左上から描画
  X1  := 150;
  X2  := 700;
  Y1  := 300;
  Y2  := 450;
  plPrev1.Rectangle (X1, X2, Y1, Y2);
  plPrev1.TextRectLT(X1, X2, Y1, Y2, 'TextRectLT');

  //矩形の左端から描画
  Y1  := Y1 + 300;
  Y2  := Y2 + 300;
  plPrev1.Rectangle (X1, X2, Y1, Y2);
  plPrev1.TextRectLC(X1, X2, Y1, Y2, 'TextRectLC');

  //矩形の左下から描画
  Y1  := Y1 + 300;
  Y2  := Y2 + 300;
  plPrev1.Rectangle (X1, X2, Y1, Y2);
  plPrev1.TextRectLB(X1, X2, Y1, Y2, 'TextRectLB');

  //矩形の左右中央で上端に寄せて描画
  X1  := X1 + 600;
  X2  := X2 + 600;
  Y1  := 300;
  Y2  := 450;
  plPrev1.Rectangle(X1, X2, Y1, Y2);
  plPrev1.TextRectCT(X1, X2, Y1, Y2, 'TextRectCT');

  //矩形の左右中央に描画
  Y1  := Y1 + 300;
  Y2  := Y2 + 300;
  plPrev1.Rectangle (X1, X2, Y1, Y2);
  plPrev1.TextRectCC(X1, X2, Y1, Y2, 'TextRectCC');

  //矩形の左右中央で下端に寄せて描画
  Y1  := Y1 + 300;
  Y2  := Y2 + 300;
  plPrev1.Rectangle (X1, X2, Y1, Y2);
  plPrev1.TextRectCB(X1, X2, Y1, Y2, 'TextRectCB');

  //矩形の右上に寄せて描画
  X1  := X1 + 600;
  X2  := X2 + 600;
  Y1  := 300;
  Y2  := 450;
  plPrev1.Rectangle (X1, X2, Y1, Y2);
  plPrev1.TextRectRT(X1, X2, Y1, Y2, 'TextRectRT');

  //矩形の右端に寄せて描画
  Y1  := Y1 + 300;
  Y2  := Y2 + 300;
  plPrev1.Rectangle (X1, X2, Y1, Y2);
  plPrev1.TextRectRC(X1, X2, Y1, Y2, 'TextRectRC');

  //矩形の右下に寄せて描画
  Y1  := Y1 + 300;
  Y2  := Y2 + 300;
  plPrev1.Rectangle (X1, X2, Y1, Y2);
  plPrev1.TextRectRB(X1, X2, Y1, Y2, 'TextRectRB');

  plPrev1.EndDoc;
end;

end.


リスト3
ワード操作フォームEx(継承フォーム)のコード
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, plWordEx, Buttons, ToolWin, ComCtrls, ExtCtrls, StdCtrls;

type
  TplWordFormEx1 = class(TplWordFormEx)
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  plWordFormEx1: TplWordFormEx1;

implementation

{$R *.dfm}

end.


リスト4
エクセル操作フォームEx (継承フォーム) のコード
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, plExcelEx, Buttons, ToolWin, ComCtrls, ExtCtrls, StdCtrls;

type
  TplExcelFormEx3 = class(TplExcelFormEx)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  plExcelFormEx3: TplExcelFormEx3;

implementation

uses Unit2;

{$R *.dfm}

//=============================================================================
//  エクセル操作フォームEx上のボタンに応じて該当シートを表示
//=============================================================================
procedure TplExcelFormEx3.Button1Click(Sender: TObject);
begin
  if TButton(Sender).Tag = 1 then xlfActiveSheetName := '第1四半期';
  if TButton(Sender).Tag = 2 then xlfActiveSheetName := '第2四半期';
  if TButton(Sender).Tag = 3 then xlfActiveSheetName := '第3四半期';
  if TButton(Sender).Tag = 4 then xlfActiveSheetName := '第4四半期';
  if TButton(Sender).Tag = 5 then xlfActiveSheetName := '年度計';

  Self.xlfSetFocusExcel;
end;

//=============================================================================
//  指定範囲をワード操作フォームExに貼付け
//=============================================================================
procedure TplExcelFormEx3.Button6Click(Sender: TObject);
var
  ARange    : Txlf2000Range;
  pBookMark : OleVariant;
  pFalse    : OleVariant;
begin
  //セルB6~F12までの範囲をクリップボードにコピー
  ARange := xlfExcelSheet.Range['B6', 'F12'];
  ARange.Copy(EmptyParam);

  //ワード文書の最後に挿入
  if Assigned(plWordFormEx1.wdfWordApp) then begin
    if plWordFormEx1.wdfWordApp.Documents.Count > 0 then begin
      pBookMark := '\EndOfDoc';
      plWordFormEx1.wdfWordDoc.Bookmarks.Item(pBookMark).Select;
      plWordFormEx1.wdfWordApp.Selection.Collapse(EmptyParam);
      plWordFormEx1.wdfWordApp.Selection.Paste;
    end;
  end;

  //Rangeオブジェクトの点滅する点線をクリア
  //これを消さないと作業中の状態となり,終了時に例外が発生する
  pFalse := False;
  xlfExcelApp.CutCopyMode[0] := pFalse;
end;

end.