1

Delphi アプリケーションで印刷用の列幅を設定しようとしています。文字列に何を入力しても、幅が狭くなりません。実際、プロパティが文字列を返す理由がわかりません。幅をピクセル単位で返す必要があります。

私のコードは

Printer.Canvas.TextWidth('M');

編集:文字列を返さないことは理解しましたが、「M」とはどういう意味ですか? 私がやろうとしているのは、列を狭くすることです。私のコードはsudrap.org/paste/text/19688にあります

編集:申し訳ありませんが、問題を明確に説明できませんでした。私はそれを次のように印刷したい:

ここに画像の説明を入力

このようではありません: ここに画像の説明を入力

4

3 に答える 3

3

TextRect関数を確認してみてください。この関数を使用すると、テキストを印刷する対象の四角形を指定できるため、列を狭めることができます。

uses Graphics;

var
  Text: string;
  TargetRect: TRect;
begin
  Printer.BeginDoc;

  Text := 'This is a very long text';

  // now I'll specify the rectangle where the text will be printed
  // it respects the rectangle, so the text cannot exceed these coordinates
  // with the following values you will get the column width set to 50 px

  TargetRect := Rect(Margin, Y, Margin + 50, Y + LineHeight);

  Printer.Canvas.Font.Size := 11;
  Printer.Canvas.Font.Name := 'Arial';
  Printer.Canvas.Font.Style := [fsBold];
  Printer.Canvas.TextRect(TargetRect, Text);

  Printer.EndDoc;
end;

これを除いて、TextRect関数セットを使用して、テキストの配置、ワード ラップなどを指定するのに役立つフォーマット フラグを取得できます。 250;117] 以下を使用できます。

Text := 'Centered text';
TargetRect := Rect(100, 100, 250, 117);
Printer.Canvas.TextRect(TargetRect, Text, [tfCenter]);

または、あなたの場合、ワードラップの方が便利かもしれません。テキストがTextRect関数によって自動的にラップされる四角形 [100;100]、[200;134] の例を次に示します。

Text := 'This is a very long text';
TargetRect := Rect(100, 100, 200, 134);
Printer.Canvas.TextRect(TargetRect, Text, [tfWordBreak]);
于 2011-07-29T02:30:05.033 に答える
0

キャンバスで固定幅フォントを使用すると、すべての1文字の文字列で同じ結果が得られるはずです。可変幅フォントを使用する場合、各文字は異なる幅を返します。

Printer.Canvas.Font.Name = 'Courier New';
Printer.Canvas.Font.Size = 13;
ColumnWidth := Printer.Canvas.TextWidth('M');

異なるフォントまたは異なるフォントサイズでは、異なる結果が得られます。

于 2011-07-29T01:46:27.183 に答える
0

テキストを返すと言っているのかわかりません。テキストを返す場合、コードはコンパイルさえされず、数値をテキストで乗算しようとするとエラーが発生します。表示目的で文字列に変換することもできます。

可変幅フォントを使用すると、異なる文字列に対して異なる答えが得られるという事実に誤解されていますか? 同じ文字でも順番が違うと違う答えが返ってきます。一部のフォントでは、W と A がどのように適合するかにより、"WAM" は "WMA" とは異なる答えを生成します。

また、ラベルが 15 M よりも狭いと単純に想定しています。これは一般的に当てはまりますが、良いプログラミング方法ではありません。代わりに、各ラベルの幅を尋ねて、最大の回答よりも少し上のものを使用する必要があります。

最後に、あなたの LineHeight の扱いはひどいものです。それが本当に必要な場合は、単に y に 300 を追加しますが、固定値ではなく、行の高さの倍数にする必要があります。DPI 設定が異なるプリンターでは、コードから非常に異なる結果が得られます。

内部で何が起こっているかを確認するために、デバッガーを使用してこのコードをステップ実行してみましたか? プリントアウトへの位置の出力は、デバッガーを使用していないことを示しています。

于 2011-07-29T03:28:08.570 に答える