喫茶XRAYトップページ

[スレッド全体
]

[9753] 記事の修正更新返信 削除
2016/4/14 (木) 09:40:15 Mr.XRAY
印刷プレビュー制御コンポーネント [イメージの描画]
http://mrxray.on.coocan.jp/Delphi/plPrev/M_Images.htm

に,以下の文章を追加しました.

DrawPict(X1, Y1, FileName)

ただし,TplPrev では 1 ドットが 0.1 mm であることに注意して下さい.
これは,同じ画像でも,プリンタの印刷の解像度 (DPI) が異なると,印刷結果
の画像の大きさが異なることを意味します.

StretchDrawBitmap(ARect, Pict)
StretchDrawMetaFile(ARect, Pict)

元の画像の縦横比を保ったまま,指定した枠 (四角の領域) に合わせて画像を描画
するには,画像の縦横比を計算して,その値を元にして ARect の各メンバの値を
計算する必要があります.

[画像の縦横比を保ったまま領域に合わせて画像を描画する例]
http://mrxray.on.coocan.jp/Delphi/plPrev/M_Images.htm#05


いろいろな質問があるということです.ハイ (涙汗)
これでも,当サイトの記事は「難解」でしょうか ?


[9755] 質問の仕方の例返信 削除
2016/4/14 (木) 14:54:23 Mr.XRAY
例えば,印刷プレビュー制御コンポーネント (以後,TplPrev) の印刷のコード
関係でトラブルがあったとします.

そのような場合,新規にプロジェクトを作成し,問題となる現象が発生する最低限
のコードを作成します.
この新規のプロジェクトが重要です.
新規であれば,他の影響を考えなくて済みます.
新規にプロジェクトを作成するのは面倒だと思うかも知れません.
しかし,それが結局は解決への早道なのです.

例えば以下のようにします.
このコードは,描画ルーチンを別としています.
別にしておくと,問題が発生した時に,この描画ルーチンを実行しないように
して,実行します.それで問題がなければ,描画ルーチン関係に問題があることが
分かります.つまり,デバッグしやすいコーディングということになります.

このようなコードを提示して頂ければ,このコードをコピペして,
実際に動作を確認することができます.
(注: このコードは正常に動作します)

//================================================================
//  新規のプロジェクトに
//  TButtonと拙作のTplPrevコンポを配置
//
//  動作確認 Widnows 7 U64(SP1) + Delphi XE(UP1) Pro
//================================================================
procedure TForm1.Button1Click(Sender: TObject); begin
   //印刷用のコードを書く
   plPrev1.BeginDoc;
   try
     //自作のルーチンを実行
     //引数にTplPrevのCanvasを渡す
     HogeHoge(plPrev1.Canvas);
   finally
     plPrev1.EndDoc;
   end;
   //プレビュー表示開始
   plPrev1.ShowModal;
end;

//----------------------------------------------------------------
//  自作のルーチン? の例
//----------------------------------------------------------------
procedure TForm1.HogeHoge(ACanvas: TCanvas); begin
  ACanvas.Pen.Color := clRed;
  ACanvas.Pen.Width := 50;
  ACanvas.MoveTo(0, 0);
  ACanvas.LineTo(500, 500);
end;


これを,コードは何も示さずに,印刷のコードを実行したのですが,
うまくいきませんとか,

  ACanvas.Pen.Color := clRed;
  ACanvas.Pen.Width := 50;
  ACanvas.MoveTo(0, 0);
  ACanvas.LineTo(500, 500);

と実行したのですが,うまくいきません.
と言われても,このコードをどこで実行しているのか,
ACanvas が何を指しているのかは分かりません.
どのようにテストしていいのか悩んでしまいます.

また,うまくいかないというのが,どういう状況なのかも分かりません.
エラーが発生するのか,そのエラーはどんな内容なのか ?
印刷のプレビュー画面が表示されないのか ? 等々...
更に,問題解決のためには,このような文章も書かなければなりません.
これは,ある程度の労力が必要で,かなりの時間の無駄になります.

最初のコードのようになっていれば,質問された方のコードのどこが問題なのか
を,おおよそ推測することができます.
また,どこで間違い,ミスや勘違いしているかの判断材料にもなります.

私はエスパーではありません !! (キッパリ)
こんなことを書いても,必要な方には読んでいただけない,
ということが分かっていながら書いてしまう私,
『私ってバカよね.ホントにバカよね』

えっ !? 何ですか ?
喫茶XRAY にこれだけいろいろ書く暇があるんだから,考えてやれば,ですか ?
ほっといてくれます ?


[9760] Re:質問の仕方の例返信 削除
2016/4/14 (木) 21:07:41 Mr.XRAY
>   ACanvas.Pen.Color := clRed;
>   ACanvas.Pen.Width := 50;
>   ACanvas.MoveTo(0, 0);
>   ACanvas.LineTo(500, 500);
>
> と実行したのですが,うまくいきません.
> と言われても,このコードをどこで実行しているのか,


印刷プレビュー制御コンポーネントを使用された方は,
そんなことは分かるじゃぁないですか ?
印刷コードを書くべきところに書いているでしょう.普通.
と思うかも知れません.

そんなことがあるんです.
以下は,本当にあった質問の例です.
Form2 が印刷プレビューのフォームだと思ってください.
もちろん,最初の質問の時は,コードの提示はありませんでした.

最初のは,

   Form2.Image1.Canvas.Pen.Color := clRed;
   Form2.Image1.Canvas.Pen.Width := 20;
   Form2.Image1.Canvas.MoveTo(0, 0);
   Form2.Image1.Canvas.LineTo(200, 200);

『というコードが実行されないようです.
TplPrev で線を引くにはどうしたらいいのでしょうか』
という質問でした.

次のは,
『クエリの結果を印刷するコードを書いたのですが,何も表示されません』

というものでした.


//=============================================================================
//  質問の内容は
//  「線が引かれません.実行されていないようですが」
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
   Form2.Image1.Canvas.Font.Size := 50;
   Form2.Image1.Canvas.TextOut(10, 10, '印刷テスト');

   Form2.ShowModal;

   Form2.Image1.Canvas.Pen.Color := clRed;
   Form2.Image1.Canvas.Pen.Width := 20;
   Form2.Image1.Canvas.MoveTo(0, 0);
   Form2.Image1.Canvas.LineTo(200, 200);
end;

//=============================================================================
//  Form2にはQuer1の結果セットを表示するコードがある
//
//  質問の内容は
//  「何も表示されません」
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  Query1.Close;

  Query1.SQL.Clear;
  Query1.SQL.Add('SELECT * FROM TEST.DB');
  Query1.Open;

  Form2.Show;

  Query1.Close;
end;




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