喫茶XRAYトップページ

[スレッド全体
]

[2172] Re:やってみて、質問です?返信 削除
2009/2/26 (木) 21:51:39 Mr.XRAY
▼ KSCさん

ありゃ.ハハハッって,人が困っているのに笑ってはいけませんね.
調べてみます.

[2173] Re3:やってみて、質問です?返信 削除
2009/2/27 (金) 12:06:47 KSCHomePage
▼ Mr.XRAYさん
> ▼ KSCさん
>
> ありゃ.ハハハッって,人が困っているのに笑ってはいけませんね.
> 調べてみます.


わっ、わっ、わっ、笑われた〜!
って、私も最初は笑いましたけどね...。

すいませんが、宜しくお願い致します。

それとこれなら
「右90度」とか「左90度」もARectにしている座標値の計算だけで対応
出来そうですね。
ただ、フォントサイズの計算が面倒かも...。

それとこの件とは無関係ですが、
最近「Wink」で動画マニュアル作成にハマッテイマス!

Wink
 http://www.debugmode.com/wink/

[2174] 動画マニュアル作成返信 削除
2009/2/27 (金) 18:42:42 Mr.XRAY
▼ KSCさん

> 最近「Wink」で動画マニュアル作成にハマッテイマス!

これが一番でしょうね.
作成する方は苦労しますけど.

[2178] Re:動画マニュアル作成返信 削除
2009/3/1 (日) 17:48:55 KSC 〔HomePage
▼ Mr.XRAYさん
> ▼ KSCさん
>
> > 最近「Wink」で動画マニュアル作成にハマッテイマス!
>
> これが一番でしょうね.
> 作成する方は苦労しますけど.


確かに面倒ですが、「後付け」「修正」それと「差し替え」の事
を考えたら、仕方ないですかね...。

特にソフトの「機能追加」や「機能の仕様変更」などによる一部操作の
変更などは、特定の部分の「差し替え」となりますが、「フレーム」単位で
管理されており、別のプロジェクトからコピペできるので、容易に「差し替え」
に対応できます。

後々の事を考えたら「Wink」は、すこい!

[2175] Re3:やってみて、質問です?返信 削除
2009/2/27 (金) 18:55:15 Mr.XRAY
▼ KSCさん

> ただ、フォントサイズの計算が面倒かも...。

そうなんですよね.これが難問です.
そう言えば,前にDelphi-MLだった思うんですが,この反転文字列,
ミラー文字列というらしいです.質問があったような気がします.
質問された方は,確か? 型抜きだったか,とにかくミラー文字が必要な理由を
書いていました.その時は,「なるほどこんな必要性もあるんだ」と
納得した記憶があります.

少し考えながら,Q and A にカキコしながら,また考えたんですが,
もしかしたら,こういうことではないのかと.

1. TextOutで描画した場合
   描画開始始点は(X1,Y1)であるが,終点は文字列の長さとサイズに
   によって違ってくる
2. StretchDrawMetaFileの場合
   (X1,Y1)と(X2,Y2)で設定した範囲内にStretchDrawされている

の違いかも知れません.
以下コードです.KSCさんの画像を参考に,少し修正しました.
でも,こうやって,動作内容の画像を添付していただけると嬉しいです.
理解しやすいです.
作成する方は大変でしょうけど.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  plPrev, StdCtrls, plSetPrinter,ExtCtrls,Printers;

type
  TForm1 = class(TForm)
    Button1: TButton;
    plPrev1: TplPrev;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
    procedure InverseString(X1,Y1,X2,Y2: Integer; Text : String; AFont: TFont);
    procedure AdjustFont(Canvas : TCanvas);
    procedure SwapIntValue(var A: Integer; var B: Integer);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

//====================================================================
//  先読み方式のコード
//  ミラー文字列(反転文字列)のテスト1
//
//  TPrinerによる印刷同様,BeginDoc〜EndDocメソッドを使用する.
//  (必要に応じてNewPageメソッドを使用)
//  印刷(描画)コードは本コンポーネントのCanvasを使用する.
//
//  2009年02月27日版
//  前版からの変更
//  ・InverseStringの引数に座標値を追加
//  ・変数の交換(入替え)関数を追加
//  ・描画文字列を変数に格納
//  ・TextOutで描画した文字列を追加
//  ・描画文字列を囲む枠を描画
//====================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
     AFont : TFont;
     X1    : Integer;
     X2    : Integer;
     Y1    : Integer;
     Y2    : Integer;
     L     : Integer;
     TestText : String;
begin
     TestText := 'テストデータ';

     plPrev1.plSetPrinter.Orientation:=poLandscape;
     plPrev1.BeginDoc;
     try
       AFont := TFont.Create;
       try
         X1 := 200;
         X2 := 2200;
         Y1 := 300;
         Y2 := Y1+500;

         //通常の文字の描画
         plPrev1.Canvas.Font.Height := Y2-Y1;
         plPrev1.TextOut(X1,Y1,TestText);
         //文字列の長さを求める
         L := plPrev1.Canvas.TextWidth(TestText);
         //文字列を囲む枠を描画
         plPrev1.Rectangle(X1,X1+L,Y1,Y2);

         //反転文字の描画
         AFont.Assign(plPrev1.Canvas.Font);
         AFont.Color := clGreen;
         plPrev1.Canvas.Pen.Color := clRed;
         Y1 := Y2+400;
         Y2 := Y1+500;
         InverseString(X1,Y1,X2,Y2,TestText,AFont);
         //文字列を囲む枠を描画
         plPrev1.Rectangle(X1,X2,Y1,Y2);
       finally
         FreeAndNil(AFont);
       end;
     finally
       plPrev1.EndDoc;
     end;
     plPrev1.ShowModal;
end;
//=============================================================================
//  左右の反転文字(ミラー文字列)作成メソッド
//  メタファイルに描画して,それを印刷プレビュー制御コンポーネントのCanvasに
//  描画する
//============================================================================
procedure TForm1.InverseString(X1,Y1,X2,Y2: Integer; Text: String; AFont: TFont);
var
    AMetaFile : TMetafile;
    ACanvas   : TMetaFileCanvas;
    AWidth    : Integer;
    AHeight   : Integer;
    ARect     : TRect;
begin
    AMetaFile      := TMetafile.Create;
    AMetaFile.Inch := 0;

    try
      ACanvas:=TMetafileCanvas.Create(AMetaFile,0);
      try
        //メタファイルに必要なサイズを求める
        ACanvas.Font.Assign(AFont);
        AWidth :=ACanvas.TextWidth(Text);
        AHeight:=ACanvas.TextHeight(Text);
        //一旦描画を終了してメタファイルのサイズを設定
        ACanvas.Free;
        AMetaFile.Width :=AWidth;
        AMetaFile.Height:=AHeight;
        //メタファイルCanvasを再生成
        ACanvas  :=TMetafileCanvas.Create(AMetaFile,0);
        ACanvas.Font.Assign(AFont);
        //フォントを正しく設定
        AdjustFont(ACanvas);

        ACanvas.Brush.Style:=bsClear;
        ACanvas.TextOut(0,0,Text);
      finally
        ACanvas.Free;
      end;

      //左右を反転させるために右と左の座標を入替える
      SwapIntValue(X1,X2);
      ARect.Left   := X1;
      ARect.Right  := X2;
      ARect.Top    := Y1;
      ARect.Bottom := Y2;
      plPrev1.StretchDrawMetaFile(ARect,AMetaFile);
    finally
      AMetaFile.Free;
    end;
end;
//=============================================================================
//  フォントの縦横サイズが正確に取得できない現象の回避関数
//  フォント幅が0の時に文字幅を設定する
//  中村拓男著「Delphi Graphic Secrets」P141のコードそのまま
//============================================================================
procedure TForm1.AdjustFont(Canvas: TCanvas);
var
    tm : TTextMetric;
    lf : TLogFont;
begin
    GetObject(Canvas.Font.Handle, SizeOf(lf), @lf);
    if lf.lfWidth=0 then begin
      GetTextMetrics(Canvas.Handle, tm);
      lf.lfWidth := -lf.lfHeight * tm.tmAveCharWidth div tm.tmHeight;
      Canvas.Font.Handle := CreateFontIndirect(lf);
    end;
end;
//=============================================================================
//  変数の交換(入替え)関数
//============================================================================
procedure TForm1.SwapIntValue(var A: Integer; var B: Integer);
var
    Temp : Integer;
begin
    Temp := A;
    A := B;
    B := Temp;
end;

end.

EXEファイルのダウンロードの内容も変更しておきました.
http://mrxray.on.coocan.jp/counter/DLCounterEx/lime.cgi?plPrev001


[2179] Re4:やってみて、質問です?返信 削除
2009/3/1 (日) 18:24:42 KSC 〔HomePage
▼ Mr.XRAYさん
> 少し考えながら,Q and A にカキコしながら,また考えたんですが,
> もしかしたら,こういうことではないのかと.
>
> 1. TextOutで描画した場合
>    描画開始始点は(X1,Y1)であるが,終点は文字列の長さとサイズに
>    によって違ってくる
> 2. StretchDrawMetaFileの場合
>    (X1,Y1)と(X2,Y2)で設定した範囲内にStretchDrawされている
>
> の違いかも知れません.


Mr.XRAYさんのソースより
>          X1 := 200;
>          X2 := 2200;(A)
>          Y1 := 300;
>          Y2 := Y1+500;
>
> ・
> ・
> ・
>          //文字列の長さを求める
>          L := plPrev1.Canvas.TextWidth(TestText);
>          //文字列を囲む枠を描画
>          plPrev1.Rectangle(X1,X1+L,Y1,Y2);(B)
>
> ・
> ・
> ・
> ・

この時、
 InverseString(X1,Y1,X2,Y2,TestText,AFont);
「X2」と「X1+L」が同一値なら表示は同一幅にならなければ理屈が合わないのですが?

前回、イメージ画像を送った際も上記で言う「X2」と「X1+L」は同一値になるように
計算して描画してもイメージ画像ような結果でした。

なぜなのでしょうか?


[2182] Re5:やってみて、質問です?返信 削除
2009/3/1 (日) 23:16:37 Mr.XRAY
▼ KSCさん

> 前回、イメージ画像を送った際も上記で言う「X2」と「X1+L」は同一値になるように
> 計算して描画してもイメージ画像ような結果でした。


う〜む.
ミラー文字を描画するときの,右端のX座標値を,
以下のように,TextOutで描画した時の右端の座標値とするというのは?

         //通常の文字の描画
         plPrev1.Canvas.Font.Height := Y2-Y1;
         plPrev1.TextOut(X1,Y1,TestText);
         //文字列の長さを求める
         L  := plPrev1.Canvas.TextWidth(TestText);
         X2 := X1+L;   //ここを追加
         //文字列を囲む枠を描画
         plPrev1.Rectangle(X1,X2,Y1,Y2);  //X1+LをX2にする

         InverseString(X1,Y1,X2,Y2,TestText,AFont); //前のまま


[2183] Re5:やってみて、質問です?(追記)返信 削除
2009/3/1 (日) 23:21:03 KSCHomePage
▼ Mr.XRAYさん
> ・
> ・
> ・
> ・
> この時、
>  InverseString(X1,Y1,X2,Y2,TestText,AFont);
> 「X2」と「X1+L」が同一値なら表示は同一幅にならなければ理屈が合わないのですが?
>
> 前回、イメージ画像を送った際も上記で言う「X2」と「X1+L」は同一値になるように
> 計算して描画してもイメージ画像ような結果でした。
>
> なぜなのでしょうか?


アプリ用のコンポにデバックモードを追加し、デバックモード時に矩形テキストを表示した際の
・「ARect」を二点鎖線の直線表示。
・左上と右下の座標値表示。
させるようにしました。

そのついでに上記の「X2」と「X1+L」が同一値なら...イメージできる画像を添付します。

何かの参考になりますか?

[2184] Re6:やってみて、質問です?(追記)返信 削除
2009/3/1 (日) 23:28:06 Mr.XRAY
▼ KSCさん

またまたう〜ん.
図をよくみて調べてみます.... ?

[2186] Re7:やってみて、質問です?(追記)返信 削除
2009/3/1 (日) 23:55:25 KSCHomePage
▼ Mr.XRAYさん
> ▼ KSCさん
>
> またまたう〜ん.
> 図をよくみて調べてみます.... ?


#2183の書き込みがMr.XRAYさんの#2182の書き込みとタイミングが前後したようです。

#2182の書き込みでやって頂いた結果でビンゴなのですが、
どうやら私のソースで指定している
 FPrev.TextOut(X1, Y1, str);の時のFont情報と
 FPrev.InverseString(X1, Y1, X2, Y2, str, FPrev.Canvas.Font);で指定した
 FPrev.Canvas.Fontが異なっているような気がしてきました。

Mr.XRAYさんのソースのように反転文字の描画用にAFontをCreateして、
a)AFont.Assign(plPrev1.Canvas.Font);を実施した時。
b)AFont.Height := Y2-Y1;を実施した時。

a)は従来どおりでした。
b)は幅方向の空間は空かずに逆に多少オーバー気味でした。(理想に近づいている)

質問
 私のソースが悪いのでしょうが、
 FPrev.InverseString(X1, Y1, X2, Y2, str, FPrev.Canvas.Font);と言う風に
 Font情報を渡すのは無理があるのでしょうか?


[2187] Re8:やってみて、質問です?(追記)返信 削除
2009/3/2 (月) 00:41:22 Mr.XRAY
▼ KSCさん

>  私のソースが悪いのでしょうが、
>  FPrev.InverseString(X1, Y1, X2, Y2, str, FPrev.Canvas.Font);と言う風に
>  Font情報を渡すのは無理があるのでしょうか?


いや,これはないと思います.
どこかでX1の値が変わっているうな気がします.

b)AFont.Height := Y2-Y1;を実施した時。

これをどこで設定しているかは分かりませんが,
StretchDrawMetaFile(ARect,AMetaFile)
は,StrechDraw(ARectに収まるように)に,メタファイルを描画しますから,
実際には,このメソッドを呼出し直前のフォントサイズは関係ありません.

例えば,以下のようにしても結果は全く同じです.
      plPrev1.Canvas.Font.Size :=10;
      plPrev1.StretchDrawMetaFile(ARect,AMetaFile);

上の図がStretchで,下がStretchでない場合(TextOutに相当)です.


[2185] ミラー文字テスト返信 削除
2009/3/1 (日) 23:34:29 Mr.XRAY
▼ KSCさん
[2183]の添付図は,左右と上下のミラーなんですね.
で,InverseStringの引数のY1とY2を入れ換えてやってみました.

  InverseString(X1,Y1,X2,Y2,TestText,AFont);
        ↓
  InverseString(X1,Y2,X2,Y1,TestText,AFont);

図のようになりました.
私,何か勘違いしているのな?


[2189] Re4:やってみて、質問です?返信 削除
2009/3/2 (月) 02:14:33 KSCHomePage
▼ Mr.XRAYさん
> procedure TForm1.InverseString(X1,Y1,X2,Y2: Integer; Text: String; AFont: TFont);
> ・
> ・
> ・
> ・
>     try
>       ACanvas:=TMetafileCanvas.Create(AMetaFile,0);
>       try
>         //メタファイルに必要なサイズを求める
>         ACanvas.Font.Assign(AFont);
>         AWidth :=ACanvas.TextWidth(Text);
>         AHeight:=ACanvas.TextHeight(Text);
>         //一旦描画を終了してメタファイルのサイズを設定
>         ACanvas.Free;
>         AMetaFile.Width :=AWidth;
>         AMetaFile.Height:=AHeight;
>         //メタファイルCanvasを再生成
>         ACanvas  :=TMetafileCanvas.Create(AMetaFile,0);
>         ACanvas.Font.Assign(AFont);
>         //フォントを正しく設定
>         AdjustFont(ACanvas);   → コメント化
>
>         ACanvas.Brush.Style:=bsClear;
>         ACanvas.TextOut(0,0,Text);
>       finally
>         ACanvas.Free;
>       end;
> ・
> ・
> ・


詳しくは、まだ調べていませんが上記の「AdjustFont(ACanvas);」の実行文を
コメント化する事でMr.XRAYさんの#2185のサンプル画面と同じ結果を得られました。

Mr.XRAYさんのソースと私のソースの何が違うのでしょうね?

また、何か気づければ書き込みします。



[2192] Re5:やってみて、質問です?返信 削除
2009/3/2 (月) 07:39:55 Mr.XRAY
▼ KSCさん

> 詳しくは、まだ調べていませんが上記の「AdjustFont(ACanvas);」の実行文を
> コメント化する事でMr.XRAYさんの#2185のサンプル画面と同じ結果を得られました。


ええっ?
ヤバイ.後で調べてみます.
AdjustFont(ACanvas);の中の条件文が... 何か違うのかも知れませんね.

[2196] Re6:やってみて、質問です?返信 削除
2009/3/2 (月) 08:18:46 KSCHomePage
▼ Mr.XRAYさん
> ▼ KSCさん
>
> > 詳しくは、まだ調べていませんが上記の「AdjustFont(ACanvas);」の実行文を
> > コメント化する事でMr.XRAYさんの#2185のサンプル画面と同じ結果を得られました。
>
> ええっ?
> ヤバイ.後で調べてみます.
> AdjustFont(ACanvas);の中の条件文が... 何か違うのかも知れませんね.


宜しくお願い致します。

[2197] Re7:やってみて、質問です?返信 削除
2009/3/2 (月) 10:23:43 Mr.XRAY
▼ KSCさん,ヤバイですよ.
やってみました.KSCさんと同じに,AdjustFontをコメントにして
(実行しないで)コンパイルした結果です.
なんと,KSCさんの言われる「多少オーバー気味でした」です.
KSCさんとは逆ですね.

さ〜て,どうなっているんでしょう.
スミマセンが,もう少しつきあっていただけますか?


[2198] Re8:やってみて、質問です?返信 削除
2009/3/2 (月) 10:48:59 KSCHomePage
▼ Mr.XRAYさん
> ▼ KSCさん,ヤバイですよ.
> やってみました.KSCさんと同じに,AdjustFontをコメントにして
> (実行しないで)コンパイルした結果です.
> なんと,KSCさんの言われる「多少オーバー気味でした」です.
> KSCさんとは逆ですね.
>
> さ〜て,どうなっているんでしょう.
> スミマセンが,もう少しつきあっていただけますか?


「逆?」ですか!

なぜですかね〜?

付き合う分には、全然、問題ありません。

宜しくお願い致します。

[2199] XPとVistaでも違う返信 削除
2009/3/2 (月) 11:22:15 Mr.XRAY
[2197]のEXE(AdjustFont無効)をVistaで実行してみました.
どうもAdjustFontの関係のようですね.

図のVistaで新規プロジェクト作成でEXE実行したものは,
デフォルトのフォントがtahomaのため,幅が小さくなっています.


[2200] Re:XPとVistaでも違う返信 削除
2009/3/2 (月) 13:00:21 KSCHomePage
▼ Mr.XRAYさん
> [2197]のEXE(AdjustFont無効)をVistaで実行してみました.
> どうもAdjustFontの関係のようですね.
>
> 図のVistaで新規プロジェクト作成でEXE実行したものは,
> デフォルトのフォントがtahomaのため,幅が小さくなっています.


すいません。
私はVistaのテスト環境を持っていないためテストできません。

#2183の記事の図より
 InverseString実行前に表示角0度のTextOut(図の上部)用に
 X1,Y1,X2,Y2の座標値を計算した上で、InverseStringに渡しています。

#2187でMr.XRAYさんも書かれているように
> StretchDrawMetaFile(ARect,AMetaFile)
> は,StrechDraw(ARectに収まるように)に,メタファイルを描画しますから,
> 実際には,このメソッドを呼出し直前のフォントサイズは関係ありません.


とあり、StretchDrawMetaFile直前で作成されたAMetaFileイメージをARectサイズ
に拡大・縮小するだけと考えAdjustFontをコメント化しました。

私の方で何か調べる事ありますか?
 

[2201] Re2:XPとVistaでも違う返信 削除
2009/3/2 (月) 14:05:49 Mr.XRAY
▼ KSCさん

> 私の方で何か調べる事ありますか?

いえいえ,情報としては十分です.
しばらくご静観くださいませ.
いろいろ調べてみます.このコンポを利用していただける方々のためにも.
これでまた1つ進歩しそうです.
でもダメだったりして ^^;

メールでの問い合わせも溜まっているけど.
喫茶店のほうだと多くの人に見られているから,こちらが優先ですね.
最初の頃は,掲示板に書き直してください,とかレスしていたんですけど.

それにしても,いろいろ問題がでてきますね.
でも,それで改良されていくんですから,感謝しないと.... (トホホ)

[2202] Re3:XPとVistaでも違う返信 削除
2009/3/2 (月) 17:36:49 KSCHomePage
▼ Mr.XRAYさん
> ▼ KSCさん
>
> > 私の方で何か調べる事ありますか?
>
> いえいえ,情報としては十分です.
> しばらくご静観くださいませ.


それでは、お言葉に甘えて静観させて頂きます。
私もその間に今回のアプリの改良をしていこうと思っています。

そうそう、サイト構築もまだ中途半端でした。
会社のサイトの公開先の変更もありつつの...。

... ... はぁ〜 ...。

> いろいろ調べてみます.このコンポを利用していただける方々のためにも.
> これでまた1つ進歩しそうです.
> でもダメだったりして ^^;
>
> メールでの問い合わせも溜まっているけど.
> 喫茶店のほうだと多くの人に見られているから,こちらが優先ですね.
> 最初の頃は,掲示板に書き直してください,とかレスしていたんですけど.
>
> それにしても,いろいろ問題がでてきますね.
> でも,それで改良されていくんですから,感謝しないと.... (トホホ)


大変でしょうが頑張って下さい!

[2205] Re4:XPとVistaでも違う返信 削除
2009/3/3 (火) 11:50:35 Mr.XRAY
▼ KSCさん
> 大変でしょうが頑張って下さい!

がんばりますです.
で,反転ミラー文字のスレッド変えました.[2203]にレスしました.
多分これでOKだと思います.
http://mrxray.on.coocan.jp/bbs/DelphiBBS/mrxray_delphifan_coffe.cgi?tree=s2203#2203

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