喫茶XRAYトップページ

[スレッド全体
]

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

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

  plPrev1.BeginDoc;
   ・・・以下省略

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




[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したらなくなちゃいますからね(笑)。

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