喫茶XRAYトップページ

[▲前のスレッド]

[1100] 印刷方向設定について返信 削除
2007/2/12 (月) 20:23:00 順三
 順三と申します。
有用なコンポーネントをご提供頂きありがとうございます。

 早速ですが、plSetPrinter と plPrev の組み合わせで、印刷プレビュー
し、ユーザにはプレビューフォームの印刷ボタンから印刷させるプログラム
を組んでいます。
概略以下のようにしております。
  plSetPrinter1.PrinterNumber := -1;
  plSetPrinter1.SetOrientation(poLandscape); //横

  plPrev1.BeginDoc;
   ・・・以下省略

ここで、プレビューは横で表示されるのですが、プリントするとプリンタ設定
で縦がデフォルトになっている場合(つまりデフォルトを横に変えない限り)
縦方向に印刷されてしまいます。いろいろ試した結果、どうも通常使用する
プリンタが、NetBiosで共有されているプリンタの場合に起きるようです。
(通常使用するプリンタがネットワークプリンタで、plPrevFormの印刷ボタン
からプリンタを変更し、NetBios共有プリンタに出力した場合は横方向で印刷
されます。)
何か、対応方法や、設定項目などにつき、アドバイスをお願い致します。
                       よろしくお願い致します。




[1101] Re:印刷方向設定について返信 削除
2007/2/12 (月) 23:51:26 Mr.XRAY
▼ 順三さん

拙作コンポのご利用ありがとうございます。
質問の現象は、仕様というか、バグというか、発生する場合があります。
この修正はちょっとややこしいのでまだ変更していません。

この現象は、TplPrevがplSetPrinterを認識する時期的なことによって発生
するようです。
例えばFormCreateの段階で、既にTplPrevがTplSetPrinterを認識してしまって
てる場合に

>   plSetPrinter1.PrinterNumber := -1;
>   plSetPrinter1.SetOrientation(poLandscape); //横
>
>   plPrev1.BeginDoc;
>    ・・・以下省略


としても、plSetPrinterの設定は無効となってしまいます。
そこで、例えば

   plPrev1.plSetPrinter.PrinterNumber:=-1;
   plPrev1.plSetPrinter.SetOrientation(poLandscape);

とした場合どうなるか試してみて下さい。
また、plPrev1のオブジェクト・インスペクタでplSetPrinterを空にするとか

  plSetPrinter1.PrinterNumber := -1;
  plSetPrinter1.SetOrientation(poLandscape); //横
  plPrev1.plSetPrinter:=plSetPrinter1;

なども実験して下さいませんか。

この現象の修正は、いつかはやらなければいけないと思っています。
申し訳ありませんが、よろしくお願いします。



[1102] Re2:印刷方向設定について返信 削除
2007/2/13 (火) 00:03:03 Mr.XRAY
> この修正はちょっとややこしいのでまだ変更していません。

この修正はDelphi6以降であれば、割と簡単にできるのですが、Delphi5の
開発で拙作コンポを利用されている方がいるので、かなり悩んでいます。


[1103] Re3:印刷方向設定について返信 削除
2007/2/13 (火) 22:36:30 順三
▼ Mr.XRAYさん
> > この修正はちょっとややこしいのでまだ変更していません。
>
> この修正はDelphi6以降であれば、割と簡単にできるのですが、Delphi5の
> 開発で拙作コンポを利用されている方がいるので、かなり悩んでいます。


返事が遅れてすいません。アドバイスありがとうございます。
今手元に環境がないので、明日アドバイスいただいた事項を実験し、
ご報告いたします。  ありがとうございました。

ちなみに、私の開発環境は、D2006とD7です。D2006のコンポのインストール
方法などは、Mr.XRAYさんのこのサイトを参考にさせていただきました。
コンポだけでなく、貴重な情報ありがとうございます。


[1104] Re4:印刷方向設定について返信 削除
2007/2/13 (火) 23:34:25 Mr.XRAY
▼ 順三さん

> 返事が遅れてすいません。アドバイスありがとうございます。
> 今手元に環境がないので、明日アドバイスいただいた事項を実験し、


いえいえ気にしないで下さい.なしのつぶての方もいますから(笑).

ところで,告白しますと,利用されている方々には大変申し訳ないのですが,
この動作仕様は,明らかに設計ミスです.
とにかに騙して利用して頂くしかありません.


[1105] Re5:印刷方向設定について返信 削除
2007/2/14 (水) 23:23:45 順三
▼ Mr.XRAYさん
>
> ところで,告白しますと,利用されている方々には大変申し訳ないのですが,
> この動作仕様は,明らかに設計ミスです.
> とにかに騙して利用して頂くしかありません.


 本日、アドバイスいただいた事項を試してみましたが、うまくいきません
でした。ん〜、何かよい方法はないものでしょうか。
とてもきれいに印刷できるので、大変満足していますし、他の開発者にも
好評です。

 コロンブスの卵でもよいので、何か方法はないでしょうか。



[1106] Re6:印刷方向設定について返信 削除
2007/2/15 (木) 00:01:00 Mr.XRAY
▼ 順三さん

お手数かけて申し訳ありません.
ところで,
印刷プレビュー制御コンポ TplPrev
プリンタ設定コンポ TplSetPrinter
はどこに配置してあるのでしょうか.

プレビューフォームあるいは,プレビューフォームを呼出す親のフォームで
しょうか.
また,プレビューフォームを生成(Create)するのはどのタイミングでしょうか.
[自動生成]か[選択可能なフォーム]のどちらでしょうか.
それによって,TplPrevにTplSetPrinterの設定が反映されるタイミングが違って
きます.




[1107] Re7:印刷方向設定について返信 削除
2007/2/15 (木) 22:49:38 順三
▼ Mr.XRAYさん
> 印刷プレビュー制御コンポ TplPrev
> プリンタ設定コンポ TplSetPrinter
> はどこに配置してあるのでしょうか.
>
> プレビューフォームあるいは,プレビューフォームを呼出す親のフォームで
> しょうか.
> また,プレビューフォームを生成(Create)するのはどのタイミングでしょうか.
> [自動生成]か[選択可能なフォーム]のどちらでしょうか.
> それによって,TplPrevにTplSetPrinterの設定が反映されるタイミングが違って
> きます.
>


 コンポは、プレビューを呼び出す親のフォームに配置しています。
すいません。[自動生成]か[選択可能なフォーム]かは、よく分かりません。
D2006では、ソース表示をみても、プロジェクトのプロパティを見ても
出てこないので...(実力ないのがバレバレですね)。この辺の変更方法も
教えていただけますでしょうか。
 設定反映のタイミングについてもご教示下さい。またテストしてみたいと
思いますので、よろしくお願い致します。


[1108] Re8:印刷方向設定について返信 削除
2007/2/15 (木) 23:04:02 Mr.XRAY
▼ 順三さん

>  設定反映のタイミングについてもご教示下さい。またテストしてみたいと
> 思いますので、よろしくお願い致します。


明日,サンプルコードを考えてアップしたいと思います.
お急ぎでしょうが,お待ち頂けますか.

[1109] Re9:印刷方向設定について返信 削除
2007/2/16 (金) 00:09:46 順三
▼ Mr.XRAYさん
> 明日,サンプルコードを考えてアップしたいと思います.
> お急ぎでしょうが,お待ち頂けますか.


 助かります。ありがとうございます。
 お手数をおかけいたしますが、よろしくお願い致します。


[1110] Re:印刷方向設定について返信 削除
2007/2/16 (金) 10:29:45 Mr.XRAY
今読み返してみました.

> ここで、プレビューは横で表示されるのですが、プリントするとプリンタ設定
> で縦がデフォルトになっている場合(つまりデフォルトを横に変えない限り)
> 縦方向に印刷されてしまいます。いろいろ試した結果、どうも通常使用する
> プリンタが、NetBiosで共有されているプリンタの場合に起きるようです。
> (通常使用するプリンタがネットワークプリンタで、plPrevFormの印刷ボタン
> からプリンタを変更し、NetBios共有プリンタに出力した場合は横方向で印刷
> されます。)


これは考えられます.

>  plSetPrinter1.PrinterNumber := -1;
>  plSetPrinter1.SetOrientation(poLandscape); //横


まず最初の行でデフォルトのプリンタを指定しています.そのプリンタの印刷
方向を横にしています.印刷の際にプリンタを変更すると,前のプリンタに設
定した内容(プロパティ)が必ずしも反映されるとは限りません.
例えば用紙サイズなどを考えればいいでしょう.他のプリンタでは使用できない
用紙サイズもあります.

対象であるプリンタ名とドライバが不明ですので,こちらでは確認できません
が,おそらくそのためだと思われます.
印刷プレビュー制御コンポーネントは,ワードや他のレポート作成ツールとは
違い,内部で用紙サイズや印刷方向を保持しているわけではありません.あく
までも,指定したプリンタに対する設定で行います.
プリンタが存在しない環境では使用できないのもそのためです.

強制的に印刷方向を変更するのであれば,以下のの様にTplPrevのイベント
OnPrintButtonClickに

     Printer.Orientation:=poLandscape;
あるいは,
     plPrev1.plSetPrinter.Orientation:=poLandscape;
と記述して下さい.



[1111] [自動生成]と[選択可能なフォーム]返信 削除
2007/2/16 (金) 12:35:15 Mr.XRAY
参考までにこれは以下の様なことです.

■自動生成フォームと使用可能フォーム

(1)新規プロジェクト作成
(2)[ファイル][新規作成][フォーム]でForm2ができる.
(3)この時[プロジェクト][ソース表示]でプロジェクトのソースは以下のようになる.

    program Project1;

    uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1},
      Unit2 in 'Unit2.pas' {Form2};

    {$R *.RES}

    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TForm2, Form2);  //Form1の後にForm2が生成される
      Application.Run;                        //最初の生成Form1がメインフォーム
    end.


(4)[プロジェクト][オプション]で表示されるダイアログで左のリストから
   [フォーム](Delphi7で[フォーム]タブ)を選択し,[自動作成フォーム作
   成]から[使用可能フォーム]へ移動.
   プロジェクトのソースは以下の様になる.
   (Delphi7では各々
   [自動作成フォーム]は[自動作成の対象]
   [使用可能なフォーム]は[選択可能なフォーム]となっている)
 
    program Project1;

    uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1},
      Unit2 in 'Unit2.pas' {Form2};

    {$R *.RES}

    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);  //Form2は生成されない
      Application.Run;
    end.
 
つまり使用可能フォームは,メインフォーム(アプリ実行開始)表示の時は生成されま
せん.何故このようにするかというと,この時Form2が使用するメモリを節約できる
ことと,プロジェクトの管理上に便利だからです.多くのアプリはこのような方法を
とっていると思われます.
では,Form2はどのように実行時に生成するかというと,例えば


■使用可能フォームの生成

(1)Form1にTButton(Button1)を一つ配置
(2)Unit1のコードをアクティブにして[ファイル][ユニットを使う]でUnit2を選択
(3)Button1のクリックイベントを以下のようにする

rocedure TForm1.Button1Click(Sender: TObject);
begin
     Form2:=TForm2.Create(Self);
     try
       if Form2.ShowModal=mrOK then begin
       end;
     finally
       FreeAndNil(Form2);  //使い終わったら解放する
     end;
end;

以上が自動作成フォームと使用可能なフォームの説明ですが,順三さんのプロジェクト
の様子が不明なものですからお聞きしました.



[1112] Re:[自動生成]と[選択可能なフォーム]返信 削除
2007/2/17 (土) 18:54:37 順三
▼ Mr.XRAYさん
> 参考までにこれは以下の様なことです.
>
> ■自動生成フォームと使用可能フォーム
>

 ご丁寧に解説頂きありがとうございました。
 何も考えずに、ある人の作ったプロジェクトの作り方をまねして
 使っていました。私の作っているプロジェクトは、すべて選択可能な
 フォームです。
 ただ、ShowModalでなくShowしていて、複数のWindowを開けるように
 しています。明示的にFreeAndNilをしてないのは、問題があるでしょうか。

 

[1114] Re2:[自動生成]と[選択可能なフォーム]返信 削除
2007/2/17 (土) 20:58:20 Mr.XRAY
▼ 順三さん

>  ただ、ShowModalでなくShowしていて、複数のWindowを開けるように
>  しています。明示的にFreeAndNilをしてないのは、問題があるでしょうか。


明示的にFreeAndNilしなくてもアプリの終了時に自動的に解放破棄してくれます。
もし、Freeにしたければ、ShowするFormのOnCloseイベントに

rocedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     Action:=caFree;
end;

と書けば、フォームは閉じ,そのフォームに割り当てたすべてのメモリが解放さ
れます(ヘルプより)。
ShowしたフォームをShowの後でFreeしたらなくなちゃいますからね(笑)。

[1113] Re2:印刷方向設定について返信 削除
2007/2/17 (土) 19:06:23 順三
▼ Mr.XRAYさん
> 今読み返してみました.
>
> 強制的に印刷方向を変更するのであれば,以下のの様にTplPrevのイベント
> OnPrintButtonClickに
>
>      Printer.Orientation:=poLandscape;
> あるいは,
>      plPrev1.plSetPrinter.Orientation:=poLandscape;
> と記述して下さい.
>


 ありがとうございます。印刷直前に設定しなければならない、と
 言うことですね。イベントに入れて試してみます。
 ちなみに試してみたプリンタは、EPSON LP-9000とCANON MP-770です。
 (富士通のA4ページプリンタも試しましたが機種名を忘れてしまいました)
 

[1117] Re2:印刷方向設定について返信 削除
2007/2/20 (火) 00:00:53 順三
▼ Mr.XRAYさん

> 強制的に印刷方向を変更するのであれば,以下のの様にTplPrevのイベント
> OnPrintButtonClickに
>
>      Printer.Orientation:=poLandscape;
> あるいは,
>      plPrev1.plSetPrinter.Orientation:=poLandscape;
> と記述して下さい.
>

  OnPrintButtonClickイベントに
 plPrev1.plSetPrinter.Orientation:=poLandscape;を設定してみましたが
 駄目でした。

  Printer.Orientation:=poLandscape; こちらは、勘違いして
  plSetPrinter1.SetOrientation(poLandscape); を設定してしまったので
 まだ、試しておりません。
 明日、再度試してみます。
 今回の現象は、デフォルトプリンタが、NetBios共有プリンタになっている
 時だけのようです。
 ネットワークプリンタにしてもらうか、デフォルトの用紙方向のプリンタを
 作ってもらうのも解決策なんですが、用紙カセットの指定まで出来ると
 いいなと思っています。
  また、アドバイスお願いします。


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