|
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.
|