Вы можете использовать контекстные интерфейсы устройства нижнего уровня для более точного управления выводом текста, например 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 и справиться с этим.Опять же, если это вызывает озабоченность, либо переместите правый край дальше, либо вам придется придумать способ справиться с ним (оставьте для вас упражнение, поскольку мы не знаем, каковы ваши точные требования).