Delphi Printer.Canvas.TextWidth свойство

Я пытаюсь установить ширину столбца для печати с моим приложением Delphi. Все, что я печатаю для строки, не уменьшает ширину. На самом деле я не понимаю, почему свойство возвращает строку, оно должно возвращать ширину в пикселях.

Мой код

Printer.Canvas.TextWidth('M');

Изменить: я понял, что не возвращает строку, но что означает "М"? я пытаюсь сделать колонку уже. мой код находится по адресу http://sudrap.org/paste/text/19688

Изменить: боюсь, я не мог объяснить проблему ясно, извините. я хочу напечатать так:

не так:

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]);

Если вы используете шрифт фиксированной ширины на холсте, вы должны получить одинаковый результат для всех односимвольных строк. Если вы используете шрифт переменной ширины, каждый символ будет иметь разную ширину.

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

Для разных шрифтов или разных размеров вы получите разные результаты.

Я не понимаю, как вы говорите, это возвращает текст. Если бы он возвращал текст, ваш код даже не скомпилировался, вы бы получили ошибки при попытке умножить число на текст. Вы даже конвертируете его в строку для отображения.

Вас вводит в заблуждение тот факт, что со шрифтом переменной ширины вы получите разные ответы для разных строк? Вы даже можете получить разные ответы на одни и те же буквы в другом порядке. Для некоторых шрифтов "WAM" даст ответ, отличный от "WMA" из-за того, что W и A подходят друг к другу.

Кроме того, вы просто предполагаете, что ваши метки уже, чем 15 М. Хотя обычно это так, это не очень хорошая практика программирования. Вместо этого вы должны спрашивать ширину каждой метки и использовать что-то немного выше самого большого ответа.

Наконец, ваше обращение с LineHeight ужасно. Просто добавьте 300 к y, если это то, что вы действительно хотите, хотя оно должно быть кратным вашей высоте строки, а не фиксированным значением. Вы получите ОЧЕНЬ разные результаты из своего кода на принтерах с разными настройками DPI.

Вы даже пытались пройти этот код с помощью отладчика, чтобы увидеть, что происходит внутри? Ваш вывод позиции на распечатку предполагает, что вы не используете отладчик.

Другие вопросы по тегам