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函数集来帮助您指定例如文本对齐、自动换行等。例如,如果您想在指定的矩形 [100;100] 中水平居中文本,[ 250;117] 您可以使用以下内容。

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

或者在你的情况下可能更有用的自动换行。这是一个矩形 [100;100], [200;134] 的示例,其中文本由TextRect函数自动换行。

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

如果您在画布上使用固定宽度的字体,您应该对所有单字符串得到相同的结果。如果您使用可变宽度字体,每个字符将返回不同的宽度。

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

对于不同的字体或不同的字体大小,你会得到不同的结果。

于 2011-07-29T01:46:27.183 回答
0

我不明白你怎么说它返回文本。如果它返回文本,您的代码甚至都无法编译,当您尝试将数字乘以文本时会出错。您甚至可以将其转换为字符串以供显示。

您是否被以下事实误导了:使用可变宽度字体,您会为不同的字符串得到不同的答案?您甚至可以以不同的顺序为相同的字母获得不同的答案。对于某些字体,“WAM”会产生与“WMA”不同的答案,因为 W 和 A 如何组合在一起。

此外,您只是假设您的标签比 15 M 窄。虽然这通常是这种情况,但它不是一个好的编程习惯。相反,您应该询问每个标签的宽度并使用略高于最大答案的东西。

最后,您对 LineHeight 的处理非常糟糕。如果这是您真正想要的,只需将 300 添加到 y ,尽管它应该是您的行高的一些倍数,而不是固定值。您将从具有不同 DPI 设置的打印机的代码中获得非常不同的结果。

您是否尝试过使用调试器单步执行此代码以查看内部发生了什么?您将位置输出到打印输出表明您没有使用调试器。

于 2011-07-29T03:28:08.570 回答