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