Delphi Programming / Object Pascal
[掲載 2013年11月22日] [更新 2013年11月22日] ワード操作フォームEx |
ワード操作フォームEx 参考コード類
ヘッダ部とフッタ部の操作 |
動作確認等 |
Windows 7 U64(SP1) + Delphi XE2 + Word 2010 |
ヘッダ部とフッタ部の操作は,文字列やページ数,日付等のフィールド値,あるいは文字列の挿入に関しては,文書中の操作と同じで,ヘッダフッタオブジェクトの Range あるいは Selection オブジェクトを使用します.
Word 2010 では,ヘッダ部分あるいはフッタ部分をダブルクリック,またはポップアップメニューから編集状態にすることができます.
残念ですが,ワード操作フォームEx でヘッダまたはフッタ部をダブルクリックすると,再描画が行われずにワードの文書が正常に描画できません.ダブルクリックが検出できれば,この現象を回避できるのですが,現在のところヘッダフッタ部分のダブルクリックを検出する方法が分かりません.
そこで,ヘッダ部あるいはフッタ部をコードで編集状態にする方法を掲載しておきました.
本ページのサンプルコードは,印刷レイアウトの状態でないと失敗します. |
|
図1
ヘッダ部を編集状態にする
|
ヘッダ部あるいはフッタ部を編集状態にするトグル動作のコードです.
このコードはヘッダ部を編集状態にしますが,pID の値を 2825 にするとフッタ部が編集状態のトグル動作となります. |
|
図2
通常の入力状態 |
|
図3
ヘッダ部の編集状態
- 文字列が入力できる
- ポップアップメニューでの編集も可能
|
procedure TplWordFormEx2.Button1Click(Sender: TObject);
var
pType : OleVariant;
pID : OleVariant;
begin
wdfSetFocusWord;
pType := EmptyParam;
pID := 762;
try
wdfWordApp.CommandBars.FindControl(pType, pID, EmptyParam, EmptyParam).Execute;
except
raise;
end;
wdfSetFocusWord;
end;
ヘッダ部を編集状態に,または通常の編集状態にするためのコードです.
wdSeekCurrentPageHeader を wdSeekCurrentPageFooter にすればフッタ部が編集状態になります.
LockWindowUpdate を使用していますが,これはチラつき防止と,ワード文書が更新されない現象の対策の意味でも使用しています. |
//=============================================================================
// ヘッダ部を表示して入力フォーカスを移動
// 印刷レイアウトでないと失敗する
//=============================================================================
procedure TplWordFormEx2.Button2Click(Sender: TObject);
var
View : OleVariant;
begin
LockWindowUpdate(wdfWordHandle);
wdfWordDoc.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;
wdfSetFocusWord;
LockWindowUpdate(0);
end;
//=============================================================================
// 通常の表示に戻す
//=============================================================================
procedure TplWordFormEx2.Button3Click(Sender: TObject);
begin
wdfWordDoc.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
wdfSetFocusWord;
end;
HeaderFooter の Range オブジェクトでヘッダ部に文字列を挿入 |
HeaderFooter オブジェクトの Range オブジェクトのプロパティを使用して,ヘッダに文字列を挿入する際の参考コードです.
左右中央寄せで,フォントサイズも設定しています. |
|
図4
実行結果
|
リスト3
Range オブジェクトを使用してヘッダに文字列を挿入 |
procedure TplWordFormEx2.Button4Click(Sender: TObject);
var
objWordDoc : OleVariant;
objHeader : OleVariant;
begin
objWordDoc := wdfWordApp.ActiveDocument;
//奇数と偶数頁でヘッダフッタ部を変えない
objWordDoc.PageSetup.OddAndEvenPagesHeaderFooter := False;
//すべての頁のヘッダフッタを同じとする.pTrueだと最初の頁のみ別
objWordDoc.PageSetup.DifferentFirstPageHeaderFooter := False;
//プライマリ頁のヘッダオブジェクトを取得
objHeader := objWordDoc.Sections.Item(1).Headers.Item(wdHeaderFooterPrimary);
objHeader.Range.Font.Size := 25;
objHeader.Range.Text := '重要文書';
objHeader.Range.ParagraphFormat.Alignment := wdAlignParagraphCenter;
wdfSetFocusWord;
end;
HeaderFooter の Range オブジェクトでフッタ部に文字列を挿入 |
HeaderFooter オブジェクトの Range オブジェクトのプロパティを使用して,フッタに文字列を挿入する際の参考コードです.
左端寄せで,フォントサイズも設定した文字列と,図では分かりにくいのですが,頁番号を中央に挿入しています. |
|
図5
実行結果 |
リスト4
Range オブジェクトを使用してフッタに文字列を挿入 |
procedure TplWordFormEx2.Button5Click(Sender: TObject);
var
objWordDoc : OleVariant;
objFooter : OleVariant;
begin
objWordDoc := wdfWordApp.ActiveDocument;
//奇数と偶数頁でヘッダフッタ部を変えない
objWordDoc.PageSetup.OddAndEvenPagesHeaderFooter := False;
//すべての頁のヘッダフッタを同じとする.pTrueだと最初の頁のみ別
objWordDoc.PageSetup.DifferentFirstPageHeaderFooter := False;
//プライマリ頁のフッタオブジェクトを取得
objFooter := objWordDoc.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary);
objFooter.Range.ParagraphFormat.Alignment := wdAlignParagraphLeft;
objFooter.Range.Font.Size := 12;
objFooter.Range.Text := '重要文書';
objFooter.Range.InsertBefore('題名 : ');
objFooter.PageNumbers.Add(PageNumberAlignment := wdAlignPageNumberCenter);
wdfSetFocusWord;
end;
Selection オブジェクトでヘッダ部に文字列を挿入 |
ヘッダ部の Selection オブジェクト,これは段落ということになりますが,これのメソッドやプロパティを使用して,ヘッダに文字列を挿入する際の参考コードです.
フォントサイズと色を設定した文字列を,左端寄せで挿入しています. |
|
図6
実行結果 |
リスト5
Selection オブジェクトを使用してヘッダに文字列を挿入 |
procedure TplWordFormEx2.Button6Click(Sender: TObject);
var
objWordDoc : OleVariant;
objHeader : OleVariant;
objSelection : OleVariant;
begin
LockWindowUpdate(wdfWordHandle);
objWordDoc := wdfWordApp.ActiveDocument;
//ヘッダ部のオブジェクトを取得して,そのRangeを削除
objHeader := objWordDoc.Sections.Item(1).Headers.Item(wdHeaderFooterPrimary);
objHeader.Range.Delete;
//ヘッダ部を表示してそのSelectionオブジェクトを取得
objWordDoc.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;
objSelection := objWordDoc.ActiveWindow.Selection;
//文字のフォントを設定して文字列を挿入
objSelection.font.Size := 35;
objSelection.font.Name := 'MS Pゴシック';
objSelection.font.Color := wdColorBlue;
objSelection.ParagraphFormat.Alignment := wdAlignParagraphLeft;
objSelection.TypeText('重要文書');
//文書本文を表示
objWordDoc.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
wdfSetFocusWord;
LockWindowUpdate(0);
end;
Selection オブジェクトでフッタ部に頁数と日付を挿入 |
フッタ部の Selection オブジェクト,これは段落ということになりますが,これのメソッドやプロパティを使用して,フッタに頁番号,総頁数と日付を挿入します.
総頁数はフィールドの値として挿入しています.したがって,総頁数が変わっても自動で値も変換してくれます.日付の書式設定には注意が必要です.Delphi の FormatDateTime 関数とは書式に使用する値が違います.詳しくは Word の VBA のヘルプで確認してください.
InsertDateTime メソッドは,Range オブジェクトにもあります. |
|
図7
実行結果 |
リスト6
Selection オブジェクトを使用してフッタに頁番号,総頁数と日付を挿入 |
procedure TplWordFormEx2.Button7Click(Sender: TObject);
var
objWordDoc : OleVariant;
objFooter : OleVariant;
objSelection : OleVariant;
begin
LockWindowUpdate(wdfWordHandle);
objWordDoc := wdfWordApp.ActiveDocument;
//フッタ部のオブジェクトを取得して,そのRangeを削除
objFooter := objWordDoc.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary);
objFooter.Range.Delete;
//フッタ部を表示してそのSelectionオブジェクトを取得
objWordDoc.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageFooter;
objSelection := objWordDoc.ActiveWindow.Selection;
objSelection.font.Size := 28;
objSelection.font.Bold := True;
objSelection.font.Name := 'MS Pゴシック';
//フッタ部に頁番号を追加
objSelection.ParagraphFormat.Alignment := wdAlignParagraphCenter;
objSelection.Fields.Add(objSelection.Range, wdFieldPage);
//総頁数と現在の年月日を追加
//月は大文字のMであることに注意
//和暦にするには'ggge年M月d日'とする
objSelection.TypeText(' / ');
objSelection.Fields.Add(objSelection.Range, wdFieldNumPages);
objSelection.TypeText(' ');
objSelection.InsertDateTime( DateTimeFormat:='yyyy年M月d日');
//文書本文を表示
objWordDoc.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
wdfSetFocusWord;
LockWindowUpdate(0);
end;
|