Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выравнивание текста по ширине с задаными границами 
:(
    Опции темы
thug
Дата 25.1.2008, 16:50 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 25.11.2007

Репутация: нет
Всего: нет



сабж
есть допустим текст
Код

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


заданы границы 50 символов, после обработки текст должен быть примерно таков(теги глючат, короче текст должен быть как бы столбом, выравненый пробелами между словами):
Код

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



вообщем почти все готово, я за полчаса коекак сделал переносы и вывел кол-во пробелов которые надо вставлять после каждого слова в строке. ниже код юнита:
Код

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;
type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    RichEdit2: TRichEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
s,z,fin: string;
masc,q,k,i,a,spacez,ac,m: integer;
countrichstr: integer;
max,maxind,potok:integer;

templeng: integer;
neophspace: integer;
strokspace: integer;
finspace: integer;

mas: array [1..10000] of integer;

begin
memo1.Lines.clear;
s:=richedit1.Text+' ';
m:=length(s);
fin:=' ';

//удаляем лишние пробелы из строки
ac:=0;
while (ac<>m) do begin
for i:=1 to length(s) do
if (s[i]=' ') and (s[i+1]=' ') then delete(s,i,1);
inc(ac);
end;

richedit1.Text:=s;


//расставляем переносы по ограничению на кол-во символов
a:=0;
k:=0;
for i:=1 to length(s) do begin
        if s[i]=' ' then k:=i;

        if a=strtoint(edit1.Text) then
                if s[i] in ['A'..'z', 'А'..'я','0'..'9'] then begin
                 insert(#13,s,k); a:=0 end
                else begin insert(#13,s,i); a:=0 end
        else a:=a+1;
end;

richedit1.Text:=' '+s;


//заполняем массив кол-вом символов во всех строках
countrichstr:=richedit1.Lines.Count;

q:=0;
masc:=1;
while q<>countrichstr do begin
z:=richedit1.Lines[q];
mas[masc]:=length(z);
inc(masc);
inc(q);
end;

//находим индекс и кол-во символов максимальной строки
max:=mas[1];
for i:=1 to countrichstr do begin
if mas[i]>max then begin max:=mas[i]; maxind:=i; end;
memo1.Lines.Add(inttostr(mas[i]));
end;
memo1.Lines.Add('max: '+inttostr(max));
memo1.Lines.Add('maxind: '+inttostr(maxind));


//расставляем пробелы
{от длины максимальной строки вычитаем длину текущей, получаем кол-во пробелов, множим это число на два, получаем нужное для выравнивания кол-во пробелов, находим кол-во пробелов в текущей строке, делим число пробелов нужных для выравнивания на кол-во пробелов в даной строке, получаем число пробелов которое нужно добавить между каждым словом}

q:=0;
strokspace:=0;
while q<>countrichstr do begin
z:=richedit1.Lines[q];
templeng:=length(z);
neophspace:=max-templeng;

for i:=1 to templeng do begin
if z[i]=' ' then inc(strokspace);
end;
finspace:=trunc((neophspace*2)/strokspace);

//--------------------------------------------
//этот ущербный код необходимо заменить

for i:=2 to templeng do begin 
if z[i]=' ' then
for k:=1 to finspace
 do insert(#32,z,i);
end;
fin:=fin+z;
//---------------------------------------------


memo1.Lines.Add('strokspace['+inttostr(q)+']: '+inttostr(strokspace));
memo1.Lines.Add('finspace['+inttostr(q)+']: '+inttostr(finspace));
inc(q);
strokspace:=0;
end;

richedit2.Text:=fin;
end;
end.



читаем коменты, буду рад если ктото осилит и разберется, спобоб кривой, был придуман мною минут за 5, но мне покатит. я чето с будуна никак немогу проставить пробелы между словами  :blink: не откажусь и от более коретного способа выровнять текст по ширине))

ЗЫ:е
кому лень все читать: как проставить n-ое количество пробелов между словами в ричэдите))

Это сообщение отредактировал(а) thug - 25.1.2008, 18:23
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0389 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.