Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Schleife - tstringlist - Einträge einfügen und löschen (https://www.delphipraxis.net/79663-schleife-tstringlist-eintraege-einfuegen-und-loeschen.html)

Susanne 26. Okt 2006 09:29


Schleife - tstringlist - Einträge einfügen und löschen
 
Folgendes Problem

ich habe eine Stringliste mit x verschiedenen Einträgen
es gibt welche die mit @ anfangen - die sollen gelöscht werden
es gibt die Kombination @FOLDER und in der nächsten Zeile steht ^ - dies bedeutet für mich, es ist eine Seiten anfang - Zeile @FOLDER muss ich löschen
es gibt eine Zeile mit ^, - hier muss ich den String auseinanderbasteln und die 2-5 werte sollen nacheinander in 2-5 Zeilen weiter oben, wo ^ steht eingefügt werden.
die Zeile ^, soll am Ende dann natürlich auch gelöscht werden

mein Problem ist jetzt nur wie ich das in einer Schleife zusammenbasteln kann, da ich ja einfügen und löschen will. Jemand einen guten Tipp?


Hier einmal ein Beispiel:
vorher:
Delphi-Quellcode:
@x1                                                                                 
@x2,ANSI                                                                                      
@FOLDER
^                                                                                               

hallo 1
hallo 2
egal was hier steht, es ist die
   
.                        
^,^test1^,^heute^,^2^,^was auch immer^,^^,^^,^1^
nachher:
Delphi-Quellcode:
test1
heute
2
was auch immer




hallo 1
hallo 2
egal was hier steht, es ist die
                           
.

Luckie 26. Okt 2006 09:43

Re: Schleife - tstringlist - Einträge einfügen und löschen
 
Tipp: Zerleg dein Problem in Teilproblme (Hast du ja schon) und dann schreibst du für jedes teilproblem eine Routine, die das Teilproblem löst. Am Ende musst du das ganze nur noch zusammensetzen in der Schleife.

EWeiss 26. Okt 2006 09:48

Re: Schleife - tstringlist - Einträge einfügen und löschen
 
1. Stringliste in eine temporäre Datei speichern
2. Zeile für zeile aus der Temporären Datei einlesen mit dem ASC-Wert(@) vergleichen wenn gefunden überspringen.
3. Text nach ^ scannen wenn LENGTH(^) = 1 zeile überspringen.
4. Text nach ^ scannen wenn LENGTH(^) <> 1 zeile Spliten mit Delemiter ^.

Stringliste löschen und abhängig vom Split(Array) zur Stringliste(wert von Array.Index) addieren.

gruß

Muetze1 26. Okt 2006 11:25

Re: Schleife - tstringlist - Einträge einfügen und löschen
 
Zitat:

Zitat von EWeiss
1. Stringliste in eine temporäre Datei speichern

Wieso eine Datei?

@Susanne:
Die Schleife kannst du trotzdem machen. Ich würde mir eine Laufvariable anlegen und dann in einer While Schleife arbeiten. Diese untersucht die Bedingung mit jedem Durchlauf erneut und dadurch kannst du die sprachlichen Elemente Continue nutzen.

Grobes Beispiel zu der Schleifenproblematik:

Delphi-Quellcode:
Var
  lLine: Integer;
Begin
  lLine := 0;
  While ( lLine < stringlist.Count ) Do
  Begin
    If ( ZeileZuLöschen ) Then
    Begin
      stringlist.Delete(lLine);
      Continue;
    End;

    If ( ZeileEditieren ) Then
    Begin
      stringlist[lLine] := 'whatever' + stringlist[lLine];
    End
    Else If ( ZeileEinfügen ) Then // Else If, damit die vorher editierte Zeile nicht vllt. diese Bedingung erfüllt
    Begin
      stringlist.Insert(lLine, 'blubb');
      Continue; // oder Dec(lLine);
    End;

    Inc(lLine);
  End;
End;
Die einzelnen Bedingungen und Aktionen kannst du ja anhand deiner Schilderungen oben einfügen.

EWeiss 26. Okt 2006 11:40

Re: Schleife - tstringlist - Einträge einfügen und löschen
 
Zitat:

Wieso eine Datei?
Ja deine Variante ist schon sinnvoller!
War auch nur ein vorschlag ;)

gruß

marabu 26. Okt 2006 12:50

Re: Schleife - tstringlist - Einträge einfügen und löschen
 
Hallo Susanne,

hier mein Versuch:

Delphi-Quellcode:
uses
  StrUtils;

procedure DoProcess(Lines: TStrings);
var
  i, iLine: Integer;
  s: TStrings;
begin
  s := TStringList.Create;
  s.QuoteChar := '^';
  for iLine := Pred(Lines.Count) downto 0 do
  begin
    if AnsiStartsText('^,', Lines[iLine]) then
    begin
      s.DelimitedText := Copy(Lines[iLine], 3, MaxInt);
      Lines.Delete(iLine);
    end else
    if AnsiStartsText('^', Lines[iLine]) then
    begin
      Lines.Delete(iLine);
      for i := Pred(s.Count) downto 0 do
        Lines.Insert(iLine, s[i]);
      s.Clear; // substitute once
    end else
    if AnsiStartsText('@', Lines[iLine]) then
      Lines.Delete(iLine);
  end;
  s.Free;
end;
Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz