Delphi Printer.Canvas.TextWidth свойство - PullRequest
1 голос
/ 29 июля 2011

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

Мой код

Printer.Canvas.TextWidth('M');

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

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

enter image description here

не так: enter image description here

Ответы [ 3 ]

3 голосов
/ 29 июля 2011

Попробуйте проверить 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]);
0 голосов
/ 29 июля 2011

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

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

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

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

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

0 голосов
/ 29 июля 2011

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

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

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

...