![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему то возникает ошибка - Stek Overlow
555 © (2005-09-30 12:01:00)Обрезаю строки по длине.
Делаю так:
procedure Format(Textlist: TRichedit; l,i: integer);
const
sc: Pchar = char(#13)+char(#10);
var
sp : integer;
s : String;
c : Char;
begin
if i = Textlist.Lines.count-1 then exit;
s := '';
form1.Caption := IntToStr(i);
if length(Textlist.Lines.Strings[i]) > l then
begin
s := Textlist.Lines.Strings[i];
for sp := l downto 1 do
begin
c := s[sp];
Application.ProcessMessages();
if c = ' ' then
begin
Insert(sc,s,sp);
Application.ProcessMessages();
Textlist.Lines.Strings[i] := s;
break;
end;
end;
Format(Textlist, l, i);
end else Format(Textlist, l, i+1);
end;
В чем ошибка?
Помогите плийз сделать как надо....
Оооочень нужно отфарматировать текст (более 5 тысяч строк и все разной длины) - выставив им максимальную длину строки не более 120 символов.
ПАМАГИТЕ пожалуйста.
TUser (2005-09-30 14:45:00) [1]
> procedure Push (S; TMaxString; C: char);
procedure Push ( varS; TMaxString; C: char);
TUser (2005-09-30 12:28:00) [2]Не тестировал
const
MaxLen = 120;
type
TMaxString =
record
Value: string[MaxLen];
Len: byte;
end;
procedure Init (var S: TMaxString);
var b: byte;
begin
for b:=1 to MaxLen do
S.Value[b]:=' ';
S.Len:=0;
end;
procedure Push (S; TMaxString; C: char);
begin
with S do begin
inc (Len);
if Len > MaxLen then
raise Exception.Create ('Overflow');
Value[Len]:=C;
end;
end;
procedure Copy (var D, S: TMaxString; Dest: TStrings);
var b: byte;
begin
if S.Len = 0 then Exit;
if D.Len + 1 + S.Len > MaxLen then begin
Dest.Add (copy(D.Value,1,D.Len));
Init (D);
end else Push (D,' ');
for b:=1 to S.Len do
Push (D,S.Value[b]);
Init (S);
end;
procedure Make120Lines (Dest, Source: TStrings);
var S, W: tmaxstring;
i: integer;
c: char;
begin
Init (S); Init(W);
Dest.BeginUpdate;
try
for i:=1 to length(Source.Text) do begin
c:=Source.Text[i];
if not (c in [ #10, #13]) then
if c = ' ' then begin
Copy (S,W,Dest);
end else Push (W,c)
end;
Dest.Add(copy(S.Value,1,S.Len));
finally
Dest.EndUpdate;
end;
end;
555 (2005-09-30 12:10:00) [3]
> TUser © (30.09.05 12:04) [1]
>
> Потому что у тебя бесконечная рекурсия.
>
А как надо?
TUser (2005-09-30 12:04:00) [4]Потому что у тебя бесконечная рекурсия.