Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Выравнивание Justify

Ответить
Настройки темы
Выравнивание Justify

Пользователь


Сообщения: 74
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Mavlyudov


Отправлено: 15:29, 18-05-2005

 

Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 18:01, 18-05-2005 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Делается это в два этапа для каждой строчки:
1. замер текста w и вычисление смещения x (TCanvas.GetTextExtent)
2. печать текста (TCanvas.TextOut) со смещением x

для левого выравнивания x=0, для правого x:=w0-w, по центру: x:=(w0-w) div 2

Full Justify делается немного сложнее. Нужно разбить текст на слова, узнать сколько в строчке свободного места и равномерно разделить место (смещения) между пробелами.

Всё это можно не делать, а воспользоваться функцией (winapi) DrawText или DrawTextEx

Цитата:
внутри какого компонента
Неужели пару строчек написать лень?

Отправлено: 11:15, 19-05-2005 | #3


Пользователь


Сообщения: 74
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Mavlyudov


Отправлено: 18:40, 19-05-2005 | #4


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: zip justify.zip
(8.8 Kb, 20 просмотров)

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

Последний раз редактировалось Savant, 28-05-2005 в 12:25. Причина: обновление контента


Отправлено: 00:05, 24-05-2005 | #5


Пользователь


Сообщения: 74
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Mavlyudov


Отправлено: 18:39, 27-05-2005 | #6


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


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;

Отправлено: 00:25, 28-05-2005 | #7


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Изображения
Тип файла: png justify5.png
(37.1 Kb, 14 просмотров)
Тип файла: png justify6.png
(44.2 Kb, 14 просмотров)

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

Отправлено: 12:25, 28-05-2005 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Выравнивание Justify

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Delphi - выравнивание Tlabel SS3 Программирование и базы данных 4 18-10-2009 20:08
выравнивание в разных браузерах toro Вебмастеру 13 28-08-2008 13:43
CSS выравнивание элементов maaxiim Вебмастеру 14 19-06-2008 21:22
Верстка. Выравнивание в таблице. rim_muvies Вебмастеру 1 20-08-2007 12:11
c++.NET выравнивание матрицы bezumes Программирование и базы данных 4 22-04-2006 01:20




 
Переход