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