喫茶XRAYトップページ

[スレッド全体
]

[2134] 印刷プレビュー制御コンポーネントのテキスト表示について返信 削除
2009/2/3 (火) 19:48:06 KSC 〔HomePage
ご無沙汰しております。
最近、やっとサイトのリニューアルを開始したKSCです。
(「Joomla」って、なかなか良いですよ...。)

印刷プレビュー制御コンポーネントのテキスト表示についてですが、
矩形テキスト(TextRect**)で向きが反転したテキスト(TextSpecialの「R=180」)
表示をする方法は、ありませんか?

当然、通常のテキストはTextSpecialメゾットで実現させています。

[2147] Re:印刷プレビュー制御コンポーネントのテキスト表示について返信 削除
2009/2/13 (金) 20:26:48 Mr.XRAY
▼ KSCさん

> 矩形テキスト(TextRect**)で向きが反転したテキスト(TextSpecialの「R=180」)
> 表示をする方法は、ありませんか?


大変遅くなりましたが,こんな方法はどうでしょう.
メタファイルで描画するやり方です.

ところで,印刷プレビューコンポって,プレビューフォーム関係がバグ
だらけなんですね.ハハハッ.

http://mrxray.on.coocan.jp/counter/DLCounterEx/lime.cgi?plPrev001
(665 kB Zipファイル)


[2162] Re2:印刷プレビュー制御コンポーネントのテキスト表示について返信 削除
2009/2/19 (木) 13:02:51 KSCHomePage
▼ Mr.XRAYさん
> ▼ KSCさん
>
> > 矩形テキスト(TextRect**)で向きが反転したテキスト(TextSpecialの「R=180」)
> > 表示をする方法は、ありませんか?
>
> 大変遅くなりましたが,こんな方法はどうでしょう.
> メタファイルで描画するやり方です.
>
> ところで,印刷プレビューコンポって,プレビューフォーム関係がバグ
> だらけなんですね.ハハハッ.
>
> http://mrxray.on.coocan.jp/counter/DLCounterEx/lime.cgi?plPrev001
> (665 kB Zipファイル)


色々と有難うございます。

ソースを参考にしてやってみたいと思います。

[2171] やってみて、質問です?返信 削除
2009/2/26 (木) 19:31:42 KSCHomePage
▼ KSCさん
> ▼ Mr.XRAYさん
> > ▼ KSCさん
> >
> > > 矩形テキスト(TextRect**)で向きが反転したテキスト(TextSpecialの「R=180」)
> > > 表示をする方法は、ありませんか?
> >
> > 大変遅くなりましたが,こんな方法はどうでしょう.
> > メタファイルで描画するやり方です.
> >
> > ところで,印刷プレビューコンポって,プレビューフォーム関係がバグ
> > だらけなんですね.ハハハッ.
> >
> > http://mrxray.on.coocan.jp/counter/DLCounterEx/lime.cgi?plPrev001
> > (665 kB Zipファイル)
>
> 色々と有難うございます。
>
> ソースを参考にしてやってみたいと思います。


「反転文字作成メソッド」をソースを参考して実装してみたのですが、

plPrev1.StretchDrawMetaFileのARectの座標値をちゃんと設定しているにも
関わらず、
 x方向の表示位置 → ○。
 x方向の表示幅  → ×。(狭い)
 y方向の表示位置 → ○。
 y方向の表示高さ → ○。

表示した状態を画像を見て見て下さい。

ACanvasとFPrev.FCanvasの解像度などが違うのでしょうか?

何が原因なのでしょうか?

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

[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


[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