喫茶XRAYトップページ

[スレッド全体
]

[3462] [印刷プレビュー]ボタン返信 削除
2010/6/16 (水) 15:44:35 Mr.XRAY
> エクセルの場合,詳細なプロパティを設定して印刷したい場合は,
> エクセルのダイアログを表示して印刷してください.


エクセルの印刷ダイアログを表示すると.
[印刷プレビュー]ボタンが表示されます.
エクセル操作フォームExでは,印刷プレビューを実行すると,
その後,本体の表示がおかしくなります.
この回避方法は,現在のところ残念ながらありません.

そこで,[印刷プレビュー]のボタンを使用不可にすることが考えられますが,
これも難しいです.
方法としては,

(1) 何らかの方法で,[印刷]ダイアログのハンドルを取得
(2) 何らかの方法で[印刷プレビュー]ボタンのID値を取得して
  そのハンドル値を取得し,以下のように使用不可に設定する
    http://mrxray.on.coocan.jp/Delphi/plSamples/016_PrinterSetupDialog.htm#01

(1)は,フック(WH_CALLWNDPROCRET)でないとできないかも知れません.

[3463] Re:[印刷プレビュー]ボタン返信 削除
2010/6/16 (水) 16:11:13 Mr.XRAY
> (1)は,フック(WH_CALLWNDPROCRET)でないとできないかも知れません.

エクセルやワードには,Delphiのように,各種ダイアログ表示時,
あるいは,閉じるときのイベントはありませんので.


[3464] エクセル操作フォームExの仕様の限界返信 削除
2010/6/16 (水) 18:32:55 Mr.XRAY
もし,Delphiの印刷ダイアログ以外のプロパティを設定するのでいれば,
自作の印刷ダイアログを作成し,その設定をエクセルのPrintメソッド
で設定する方がいいかも知れません.

当然,この場合もプリンタ固有の設定はできませんが.
エクセルまたはワード操作フォームExの仕様と解釈してください.

いや,もっと詳細な設定がしたい!!
のであれば,エクセル操作フォームExを使用しないで,
エクセルそのものを,Delphiのコードで制御するしかないでしょう.


[3465] Re:[印刷プレビュー]ボタン返信 削除
2010/6/16 (水) 23:38:21 Mr.XRAY
> (1)は,フック(WH_CALLWNDPROCRET)でないとできないかも知れません.

えっと,WndProcで取得できそうです.
テストしてみました.
続きは明日以降ということで.
動作確認環境は, Windows XP(SP3) + Delphi2010

function GetWindowTextStr(hWindow: HWND): String;
var
    Buffer : Array[0..MAX_PATH-1] of char;
begin
    Result := '';
    if (GetWindowText(hWindow, Buffer, MAX_PATH)<>0) then begin
      Result := Buffer;
    end;
end;

procedure TplExcelFormEx2.WndProc(var Message: TMessage);
var
  ACaption : String;
begin
  inherited;

  if Message.Msg = WM_ACTIVATE then begin
    ACaption := GetWindowTextStr(Message.lParam);
    Caption  := ACaption;
  end;
end;



[3466] Re2:[印刷プレビュー]ボタン返信 削除
2010/6/17 (木) 14:37:57 Mr.XRAY
>続きは明日以降ということで.

報告です.
結果的に[印刷プレビュー]ボタンは無効にも非表示もできませんでした.
ハンドルまたはIDの値が取得できません(添付図の上図参照)

ハンドルあるいはID値が取得できれば,例えば以下のように値をセットしたり
できます.
(結果は添付図の下の図参照)

procedure TplExcelFormEx2.WndProc(var Message: TMessage);
var
  DialogWnd   : HWND;
  S1,S2,S3    : String;
  Id1,Id2,Id3 : Integer;
begin
  inherited;

  if Message.Msg = WM_ACTIVATE then begin
    DialogWnd := Message.LParam;
    if GetWindowTextStr(DialogWnd) <> '印刷' then exit;

    Id1:=33;  //Excel97,2000印刷開始頁コントロールID
    Id2:=34;  //Excel97,2000印刷終了コントロールID
    Id3:=40;  //Excel97,2000印刷部数コントロールID

    S1 :=IntToStr(1);  //印刷開始頁
    S2 :=IntToStr(10); //印刷終了頁
    S3 :=IntToStr(5);  //印刷部数

    //印刷開始頁等に文字列をセット}
    SendDlgItemMessage(DialogWnd, Id1, WM_SETTEXT, 0, LongInt(PChar(S1)));
    SendDlgItemMessage(DialogWnd, Id2, WM_SETTEXT, 0, LongInt(PChar(S2)));
    SendDlgItemMessage(DialogWnd, Id3, WM_SETTEXT, 0, LongInt(PChar(S3)));
  end;
end;


[3474] Re3:[印刷プレビュー]ボタン返信 削除
2010/6/18 (金) 11:03:10 Mr.XRAY
> ハンドルあるいはID値が取得できれば,例えば以下のように値をセットしたり
> できます.


えっと,わさわざこんなことしなくても,エクセルのオブジェクトの
プロパティで設定できますので.
ハンドルが取得できれば,こんなことも可能だという例ですので.
念のため.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82