Einzelnen Beitrag anzeigen

Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#3

Re: String in gleiche Bloecke teilen

  Alt 16. Nov 2006, 00: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.
Angehängte Dateien
Dateityp: rar docolumns_565.rar (1,6 KB, 3x aufgerufen)
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat