Hej,
Czy ma ktoś pomysł na podzielenie ciągu znaków na linie o ustalonej długości, ale bez dzielenia wyrazów?
Czy jest może na to gotowa funkcja?
Taki kod dzieli ciąg znaków na podciągi o ustalonej długości - ale ucina wyrazy!
Ma ktoś pomysł jak to poprawić? A może ktoś przypadkiem robił coś takiego?
procedure StrToStringList(const aSource: String;
const aList: TStrings;
const aFixedLen: Integer);
var
idx: Integer;
srcLen: Integer;
begin
aList.Capacity := (Length(aSource) div aFixedLen) + 1;
idx := 1;
srcLen := Length(aSource);
while idx <= srcLen do
begin
aList.Add(Copy(aSource, idx, aFixedLen));
Inc(idx, aFixedLen);
end;
end;
procedure TEST;
var
SL_LIST : TStringList;
sLine : string;
i : Integer;
begin
sLine := 'Ubiegłej nocy pod moim kierunkiem siły zbrojne w północno-zachodniej Syrii z powodzeniem przeprowadziły operację antyterrorystyczną, aby chronić obywateli Ameryki i naszych sojuszników oraz' + ' ' + 'uczynić świat bezpieczniejszym miejscem" - czytamy w oświadczeniu Joe Bidena, które po południu polskiego czasu opublikowano na stronie Białego Domu.' + ' ' + 'Jak stwierdzono dalej, przywódca ISIS Abu Ibrahim al-Kurajszi został "zdjęty z pola bitwy". "Wszyscy Amerykanie wrócili bezpiecznie z operacji" - przekazano w oświadczeniu.';
SL_LIST := TStringList.Create;
try
StrToStringList(sLine, SL_LIST, 100);
// RESULT
for i:= 0 to SL_LIST.Count-1 do
begin
ShowMessage('Line ' + Inttostr(i+1) + '. ' + #10#13 + SL_LIST.Strings[i]);
end;
finally
SL_LIST.Free;
end;
end;
W powyższym przykładzie mam 3 sytuacje z problemem dzielonego wyrazu:
Linia 1. przeprowadz[iły]
Linia 2. św [iat]
Linia 3. czas [u]
Jeśli nie ma na to gotowej funkcji, to co radzicie? Cofnąć się w każdej linii o ostatni wyraz (ten ucięty, szukając spacji), czy może czytać go ponad ustalony limit znaków (do pierwszej spacji)...
-Pawel