喫茶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


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


[9754] Re:記事の修正更新返信 削除
2016/4/14 (木) 12:35:44 Mr.XRAY
> [画像の縦横比を保ったまま領域に合わせて画像を描画する例]
> http://mrxray.on.coocan.jp/Delphi/plPrev/M_Images.htm#05


ここまでくると,プログラムのコーディングというより,
中学校あたりの比例計算の方法と言うか,(回答ではなく)解答例ですね (^^;


[9836] 比例計算返信 削除
2016/4/27 (水) 17:07:37 Mr.XRAY
> ここまでくると,プログラムのコーディングというより,
> 中学校あたりの比例計算の方法と言うか,(回答ではなく)解答例ですね (^^;


ゴメンなさい.失礼しました.
最近というか,だいぶ前ですが,高校卒業した方でも,
比例計算ができない方がいるそうです.
昔,ある理工系だか,理工学部系だか忘れましたか,1 年生の数学の講義で,
中学校程度の数学の内容から始めるところがあったらしいです.
今もあまり変わりはないと思います.

記憶があまり確かでないのですが,理工系でも,入学試験に数学を選択しなくても
いい場合があるようなんです.
当時,ある評論家がそんなことが原因のようなことを言っていた記憶があります.
もしかしたら,数学全てではなかったかも知れません.あいまいです.


[9837] Re:比例計算返信 削除
2016/4/27 (水) 17:16:40 Mr.XRAY
> 最近というか,だいぶ前ですが,高校卒業した方でも,
> 比例計算ができない方がいるそうです.


プログラマに数学的な知識が必要かどうかは私には分かりません.
ないよりも,あるに越したことはありませんね.

数値計算のプログラムをする方は,別扱いでしょう.
過去の経験では,数値計算する方の中にもあまり数学的な知識がない方も... (^^;
比例計算のレベルではないですが.


[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 にこれだけいろいろ書く暇があるんだから,考えてやれば,ですか ?
ほっといてくれます ?


[9756] Re:質問の仕方の例返信 削除
2016/4/14 (木) 15:04:10 Mr.XRAY
> と言われても,このコードをどこで実行しているのか,

最近,某掲示板にありましたね.

http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201604/16040007.txt

>"DoHorizLine"なるメソッドがありましたが、横線は引かれません。

これをどこで実行したが書いてありません.
というより,コードの提示が全くありません.
結局,「横線が引かれない」のではなく,実行する場所が間違っていたわけです.


[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;




[9762] Re:質問の仕方の例返信 削除
2016/4/15 (金) 10:15:24 Mr.XRAY
> 例えば以下のようにします.

このようなコードを頂ければいくらでもテストします.
文章でいろいろ書いていただいても,変数の定義等を,私がやらなれば
ならないのや,どんな場所でどのように,文章中のコード実行しているのかを
推測しながらテストプログラムを作成しなければならないのは苦痛です.
くどいようですが,私は Delphi のサポートセンターの要員ではありません.

プリンタ関係で問題があれば,できれば,そのプリンタの名前も教えて
頂ければ幸いです
プリンタ関係の時は,実際にプリンタドライバをダウンロードしてテスト
しています.もちろん,プリンタドライバの入手先も示していただければ
もっと嬉しいです.

それから,メールの返信の文章は是非お読みになってください.
反応がないと,理解していただこうと,返信の文章が長くなります.
益々難解になり,読みたくなくなると思います.


[9759] Re:記事の修正更新返信 削除
2016/4/14 (木) 20:15:59 Mr.XRAY
> [画像の縦横比を保ったまま領域に合わせて画像を描画する例]
> http://mrxray.on.coocan.jp/Delphi/plPrev/M_Images.htm#05


TCanvas の StretchDraw を使用するコードに書き換えました.
その方がいろいろな画像の種類を扱えるので.
変数名を変更しました.


[9761] Re2:記事の修正更新返信 削除
2016/4/14 (木) 23:38:02 Mr.XRAY
> > [画像の縦横比を保ったまま領域に合わせて画像を描画する例]
> > http://mrxray.on.coocan.jp/Delphi/plPrev/M_Images.htm#05


用紙の印刷可能な範囲を横幅とするサンプルを追加しました.
画像は,JPEG 画像をディスクから読み込みます.

uses に Printers, Jpeg が必要です.


[9763] Re3:記事の修正更新返信 削除
2016/4/15 (金) 11:25:42 Mr.XRAY
> 用紙の印刷可能な範囲を横幅とするサンプルを追加しました.
> 画像は,JPEG 画像をディスクから読み込みます.


こういうことで苦労するなら,レポート作成ツールを利用した方が
いいかも知れませんね.もしかしたら.

画像を印刷したい
     ↓
実は,指定枠内に収まるように印刷したい
     ↓
実は,印刷可能な幅いっぱいに印刷したい


[9769] Re3:記事の修正更新返信 削除
2016/4/16 (土) 10:47:33 Mr.XRAY
> http://mrxray.on.coocan.jp/Delphi/plPrev/M_Images.htm

参考コードを以下の 4 つに分けました.

   画像の縦横比を保ったまま画像を描画する例 - 横幅固定
   画像の縦横比を保ったまま画像を描画する例 - 高さ固定
   印刷可能な幅に合わせて画像を描画する例
   印刷可能な領域の上下左右の中央に描画する例


[9776] 放置返信 削除
2016/4/16 (土) 16:44:28 Mr.XRAY
また放置か...
もう,質問のメール来てもレスしねぇ !!


[9830] Re:記事の修正更新返信 削除
2016/4/26 (火) 12:11:18 Mr.XRAY
> [画像の縦横比を保ったまま領域に合わせて画像を描画する例]
> http://mrxray.on.coocan.jp/Delphi/plPrev/M_Images.htm#05


上の記事以降のコードに一部間違いがありました.
修正して,文章も見直しました.
まっ,誤字脱字の天才である私が,急いでやったやつですからね.ホホホッ.


[9832] 更にサンプルコードを追加返信 削除
2016/4/26 (火) 23:36:36 Mr.XRAY
> http://mrxray.on.coocan.jp/Delphi/plPrev/M_Images.htm#05

更にサンプルコードを追加しました.
もうこれ以上は必要ないと思いますが...
後で,もしからしたら,実行結果の画像を追加するかも知れません.
適当な,いい画像が見つかれば.


INCM/CMT
Cyclamen v3.82