Delphi печать с помощью Canvas, выравнивание текста вправо - PullRequest
0 голосов
/ 14 октября 2018

Я печатаю с использованием TPrinter.Canvas и пытаюсь выровнять текст вправо из-за цифр, отображающих деньги.

Текст печатается с таким кодом:

Printer.Canvas.Textout(800, 100, 250.00); //charge1
Printer.Canvas.Textout(800, 200,  10.00); //charge2
Printer.Canvas.Textout(800, 300, 260.00); //Total Amount

Sample image

Как настроить выравнивание линий для правильного отображения?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Вы можете использовать контекстные интерфейсы устройства нижнего уровня для более точного управления выводом текста, например DrawText(), как предложил Джерри.Однако для этого потребуется предварительно рассчитать / установить ограничивающий прямоугольник для текстового вывода, чтобы Windows знала область, к которой относится любое выравнивание.

Существует две потенциально более простых альтернативы:

Вариант 1 - ТОЛЬКО для шрифтов фиксированной ширины

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

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

Для этого выберите самую длинную строку, которую вы примете для вывода, а затем добавьте все необходимые пробелы слева от каждой строки, чтобы убедиться, что онивсе одинаковой длины.При использовании шрифта фиксированной ширины пробел занимает то же расстояние по горизонтали, что и любой другой символ, поэтому, сделав все строки одинаковой длины, вы получите «правильное выравнивание»:

procedure PrintRightJustified(const aX, aY, aMaxLen: Integer; aValue: String);
var
  s: String;
begin
  s := aValue;

  // Pad the string with spaces to the maximum length
  if Length(s) < aMaxLen then
    s := StringOfChar(' ', aMaxLen - Length(s)) + s;

  Printer.Canvas.Textout(aX, aY, s);
end;

Затем вызовите этот метод для выводастроки выровнены по правому краю до согласованной максимальной длины, например, если максимальная длина равна 6 (999,99):

PrintRightJustified(800, 100, 6, '250.00'); //charge1
PrintRightJustified(800, 200, 6, '10.00'); //charge2
PrintRightJustified(800, 300, 6, '260.00'); //Total Amount

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

Вариант 2 - для любого шрифта

Другой способ, который будет работать для шрифтов фиксированной ширины или переменной ширины (например, Arial), состоит в том, чтобы выбрать положение самого правого края строк и вычислитьположение X относительно этого на основе ширины устройства, рассчитанной для каждой выводимой строки:

procedure PrintRightJustified(const aRightX, aY; aValue: String);
var
  leftX: Integer;
begin
  leftX := aRightX - Printer.Canvas.TextWidth(aValue);

  Printer.Canvas.Textout(leftX, aY, aValue);
end;

Вам не нужно указывать максимальную ширину для этой версии, она работает независимо от используемого шрифта:

PrintRightJustified(900, 100, '250.00'); //charge1
PrintRightJustified(900, 200, '10.00'); //charge2
PrintRightJustified(900, 300, '260.00'); //Total Amount

Это означает, что текст может потенциально «кровоточить» слишком далеко влево без какого-либо механизмаTect и справиться с этим.Опять же, если это вызывает озабоченность, либо переместите правый край дальше, либо вам придется придумать способ справиться с ним (оставьте для вас упражнение, поскольку мы не знаем, каковы ваши точные требования).

0 голосов
/ 14 октября 2018

Вместо использования VCL TextOut, вы должны использовать Winapi DrawText и выбрать выравнивание по правому краю, используя его в данном прямоугольнике, в частности, используя DT_RIGHT.Например ...

DrawText(Canvas.Handle, PChar(T), Length(T), R, DT_SINGLELINE or DT_RIGHT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...