我正在尝试使用我的 Delphi 应用程序设置列宽以进行打印。无论我为字符串键入什么内容都不会减少宽度。实际上我不明白为什么该属性返回一个字符串,它应该返回以像素为单位的宽度。
我的代码是
Printer.Canvas.TextWidth('M');
编辑:我知道它不会返回字符串,但“M”是什么意思?我想做的是使列变窄。我的代码位于sudrap.org/paste/text/19688
编辑:恐怕我无法清楚地解释问题,对不起。我希望它像这样打印:
不是这样的:
我正在尝试使用我的 Delphi 应用程序设置列宽以进行打印。无论我为字符串键入什么内容都不会减少宽度。实际上我不明白为什么该属性返回一个字符串,它应该返回以像素为单位的宽度。
我的代码是
Printer.Canvas.TextWidth('M');
编辑:我知道它不会返回字符串,但“M”是什么意思?我想做的是使列变窄。我的代码位于sudrap.org/paste/text/19688
编辑:恐怕我无法清楚地解释问题,对不起。我希望它像这样打印:
不是这样的:
尝试检查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]);
如果您在画布上使用固定宽度的字体,您应该对所有单字符串得到相同的结果。如果您使用可变宽度字体,每个字符将返回不同的宽度。
Printer.Canvas.Font.Name = 'Courier New';
Printer.Canvas.Font.Size = 13;
ColumnWidth := Printer.Canvas.TextWidth('M');
对于不同的字体或不同的字体大小,你会得到不同的结果。
我不明白你怎么说它返回文本。如果它返回文本,您的代码甚至都无法编译,当您尝试将数字乘以文本时会出错。您甚至可以将其转换为字符串以供显示。
您是否被以下事实误导了:使用可变宽度字体,您会为不同的字符串得到不同的答案?您甚至可以以不同的顺序为相同的字母获得不同的答案。对于某些字体,“WAM”会产生与“WMA”不同的答案,因为 W 和 A 如何组合在一起。
此外,您只是假设您的标签比 15 M 窄。虽然这通常是这种情况,但它不是一个好的编程习惯。相反,您应该询问每个标签的宽度并使用略高于最大答案的东西。
最后,您对 LineHeight 的处理非常糟糕。如果这是您真正想要的,只需将 300 添加到 y ,尽管它应该是您的行高的一些倍数,而不是固定值。您将从具有不同 DPI 设置的打印机的代码中获得非常不同的结果。
您是否尝试过使用调试器单步执行此代码以查看内部发生了什么?您将位置输出到打印输出表明您没有使用调试器。