Показать полную графическую версию : Выравнивание Justify
Mavlyudov
18-05-2005, 15:29
Мне нужно написать свой модуль (на Delphi), где была бы реализована
возможность выравнивания текста (например, по левому краю или по центру..). не могу придумать и реализовать алгоритм.
Mavlyudov
Выравнивание внутри какого компонента ?
Делается это в два этапа для каждой строчки:
1. замер текста w и вычисление смещения x (TCanvas.GetTextExtent)
2. печать текста (TCanvas.TextOut) со смещением x
для левого выравнивания x=0, для правого x:=w0-w, по центру: x:=(w0-w) div 2
Full Justify делается немного сложнее. Нужно разбить текст на слова, узнать сколько в строчке свободного места и равномерно разделить место (смещения) между пробелами.
Всё это можно не делать, а воспользоваться функцией (winapi) DrawText или DrawTextEx
внутри какого компонента
Неужели пару строчек написать лень?
Mavlyudov
19-05-2005, 18:40
ну например есть модуль. и этот модуль создает на диске файл... в этот файл записывается какой-то текст (например пишет его туда все тот же модуль, а можно и вручную загнать туда текст). Потом, используя этот модуль, например при нажатии на кнопку, открываем созданный файл на чтение (reseset), выравниваем текст и перезаписываем в файл.
Но, если честно, я не понял, как реализовать алгоритм, предложенный pva.
Mavlyudov
Cм. аттач, выравнивание строк указанного файла на указанную ширину, в виде программы.
Mavlyudov
27-05-2005, 18:39
Спасибо, за выравнивание по ширине.
Буду разбираться.
Ну а если я выравниваю по правому краю, то мне,наверное, надо выбросить все пробелы вконце строки, а потом добавить слева (в начале строки) нужное количество пробелов до 80 символов?!.
только как это реализовать в делфи. подскажите, хотябы как удалить
все пробелы вконце строки.
Mavlyudov
По правому краю вообще в три строчки пишется (s - строка для выравнивания, w - необходимая ширина):
function StringRight(const s: String; const w: Integer): String;
var
i: Integer;
begin
// Вырезаем пробемы и прочее ненужное справа (и заодно слева)
// (если только справа, то - TrimRight(s))
Trim(s);
// Добавляем необходимое количество пробелов слева
Result := '';
for i := 1 to (w - Length(s)) do
Result := Result + ' ';
Result := Result + s;
end;
Или можно слегка оптимизировать и каждые 8 пробелов заменять на табулятор, например так :
function StringRight2(const s: String; const w: Integer): String;
var
i: Integer;
begin
Trim(s);
Result := '';
for i := 1 to (w - Length(s)) div 8 do
Result := Result + #9; // ASCII код Tab'a - 0x09
for i := 1 to (w - Length(s)) mod 8 do
Result := Result + ' ';
Result := Result + s;
end;
Вдруг неожиданно нашел применение данного кода и у себя в одном приложении... Правда пришлось слегка модифицировать...
В общем обновил аттач, добавил функцию String_To_SameWidth2(var strlist: TStringList; const w: Integer), которая обладает намного более солидными возможностями по выравниванию текста. Например, при возможности дополняет текущую строку словами из следующей или, наоборот, обрезает (при превышении нужной ширины). Так же корректно обрабатывает абзацы и прочие отступы. Побочным эффектом стала возможность размещать отформатированный (выровненный) текст в несколько столбцов.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC