Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему то возникает ошибка - 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]

Потому что у тебя бесконечная рекурсия.


Наверх

Титульная страница Поиск, карта сайта Написать письмо