Registriert seit: 18. Feb 2005
286 Beiträge
Delphi 2010 Enterprise
|
Re: String in gleiche Bloecke teilen
16. Nov 2006, 01:23
Ehrlich gesagt habe ich mir deins nicht sehr intensiv angesehen. Vielleicht gefällt dir ja meine Lösung. Hier sind sind die benötigten Routinen:
Delphi-Quellcode:
{ Diese Funktion prüft, ob eine "Spalte" (alle 1., 2., 3.,...
Zeichen) gleich ist und gibt in diesem Fall True zurück, sonst
False. }
function ColumnEquals( const ColIndex: Integer; const CmpChar: Char; const Strings: TStrings): Boolean;
var
Index: Integer;
begin
Index:=Strings.Count-1;
Result:=Index <> -1;
while Result and ( Index > -1) do
begin
Result:=Strings[ Index][ColIndex] = CmpChar;
Dec( Index);
end;
end;
{ Folgende Routine hat die selbe Funktionalität wie die
Prozedur aus der System-Unit, gibt den geänderten String
jedoch als Funktionsergebnis zurück. }
function Insert( const InsertStr, Str: String; Pos: Integer): String;
begin
Result:=Str;
System.Insert(InsertStr,Result,Pos);
end;
{ InsertChar fügt ein bestimmtes Zeichen Ch in jeden String
von Strings an der Position Pos ein. }
procedure InsertChar( const Strings: TStrings; const Pos: Integer; Ch: Char = ' ');
var
Index: Integer;
begin
for Index:= 0 to Strings.Count-1
do Strings[ Index]:=Insert(Ch,Strings[ Index],Pos);
end;
{ Die eigentlich gewünschte Funktion: Das erzeugen der
"Textspalten". }
procedure DoColumns( const Strings: TStrings);
var
ColIndex: Integer;
ColEqual, ColEqualStage: Boolean;
begin
if Strings.Count = 0 then Exit;
ColEqualStage:=ColumnEquals(Length(Strings[0]),Strings[0][Length(Strings[0])],Strings);
for ColIndex:= Length(Strings[0]) downto 0 do
begin
ColEqual:=ColumnEquals(ColIndex,Strings[0][ColIndex],Strings);
{ Im Folgenden wird nichts anderes gemacht als auf den
Wechsel von Folgen von Spalten mit nur einem gleichen
Zeichen und Folgen von Spalten mit unterschiedlichen
Zeichen gewartet und jeweils die "Leerzeichen-Spalte"
eingefügt. }
if ColEqual xor ColEqualStage then
begin
InsertChar(Strings,ColIndex+1);
ColEqualStage:=ColEqual;
end;
end;
end;
Und hier noch ein Besipeilaufruf: DoColumns(Memo1.Lines);
Das Delphi-Projekt habe ich auch angehangen. Alles in allem ist darin aber nichts Neues.
Gruß,
Panthrax.
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
|
|
Zitat
|