Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Выравнивание Justify (http://forum.oszone.net/showthread.php?t=49446)

Mavlyudov 18-05-2005 15:29 325297

Выравнивание Justify
 
Мне нужно написать свой модуль (на Delphi), где была бы реализована
возможность выравнивания текста (например, по левому краю или по центру..). не могу придумать и реализовать алгоритм.

Savant 18-05-2005 18:01 325368

Mavlyudov
Выравнивание внутри какого компонента ?

pva 19-05-2005 11:15 325608

Делается это в два этапа для каждой строчки:
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 325756

ну например есть модуль. и этот модуль создает на диске файл... в этот файл записывается какой-то текст (например пишет его туда все тот же модуль, а можно и вручную загнать туда текст). Потом, используя этот модуль, например при нажатии на кнопку, открываем созданный файл на чтение (reseset), выравниваем текст и перезаписываем в файл.
Но, если честно, я не понял, как реализовать алгоритм, предложенный pva.

Savant 24-05-2005 00:05 326736

Вложений: 1
Mavlyudov
Cм. аттач, выравнивание строк указанного файла на указанную ширину, в виде программы.

Mavlyudov 27-05-2005 18:39 327975

Спасибо, за выравнивание по ширине.
Буду разбираться.
Ну а если я выравниваю по правому краю, то мне,наверное, надо выбросить все пробелы вконце строки, а потом добавить слева (в начале строки) нужное количество пробелов до 80 символов?!.
только как это реализовать в делфи. подскажите, хотябы как удалить
все пробелы вконце строки.

Savant 28-05-2005 00:25 328047

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;


Savant 28-05-2005 12:25 328106

Вложений: 2
Вдруг неожиданно нашел применение данного кода и у себя в одном приложении... Правда пришлось слегка модифицировать...
В общем обновил аттач, добавил функцию String_To_SameWidth2(var strlist: TStringList; const w: Integer), которая обладает намного более солидными возможностями по выравниванию текста. Например, при возможности дополняет текущую строку словами из следующей или, наоборот, обрезает (при превышении нужной ширины). Так же корректно обрабатывает абзацы и прочие отступы. Побочным эффектом стала возможность размещать отформатированный (выровненный) текст в несколько столбцов.


Время: 10:18.

Время: 10:18.
© OSzone.net 2001-