das ist mein erster Beitrag hier und ich hoffe, ich gehe mit euren Regeln konform. Also, folgende Problematik habe ich:
Ich habe drei StringListen:
Code: Alles auswählen
V_LIST: StringList vom Vorzustand
N_LIST: StringList vom "Nachher-Zustand"
LIST: StringList mit den Änderungen
Zur Vorgeschichte: Das Programm soll die Ergebnisse von standardmäßigen DIR Befehlen unter Windows auswerten. Sprich: Via "dir c:\ /s" wird ein komplettes Verzeichnis indiziert und schlussendlich in einer Datei abgelegt. Das geschieht zuerst in der V_LIST. Dann werden Änderungen an der Dateistruktur unter Windows vorgenommen und schließlich wieder ein "DIR-Abbild" erzeugt. Die Ergebnis-Dateien vom Vorher- und Nachherzustand werden beide verarbeitet und in weiteren Listen zusammengefasst:
So sieht die Liste vom DIR-Befehl aus:
Code: Alles auswählen
Verzeichnis von c:\Dokumente und Einstellungen\All Users\Startmen\Programme\Lazarus
21.02.2010 23:51 <DIR> .
21.02.2010 23:51 <DIR> ..
21.02.2010 23:51 1.411 Lazarus (debug).lnk
21.02.2010 23:51 503 Lazarus entfernen.lnk
21.02.2010 23:51 1.229 Lazarus Forums.lnk
21.02.2010 23:51 1.243 Lazarus im Internet.lnk
21.02.2010 23:51 1.243 Lazarus Wiki Help.lnk
21.02.2010 23:51 1.346 Lazarus.lnk
6 Datei(en) 6.975 Bytes
So sieht die Ergebnisliste aus:
Code: Alles auswählen
c:\Dokumente und Einstellungen\All Users\Startmen\Programme\Lazarus\Lazarus (debug).lnk
c:\Dokumente und Einstellungen\All Users\Startmen\Programme\Lazarus\Lazarus entfernen.lnk
c:\Dokumente und Einstellungen\All Users\Startmen\Programme\Lazarus\Lazarus Forums.lnk
c:\Dokumente und Einstellungen\All Users\Startmen\Programme\Lazarus\Lazarus im Internet.lnk
c:\Dokumente und Einstellungen\All Users\Startmen\Programme\Lazarus\Lazarus Wiki Help.lnk
c:\Dokumente und Einstellungen\All Users\Startmen\Programme\Lazarus\Lazarus.lnk
V_LIST und N_LIST enthalten beide den letzten Stil an Daten. In N_LIST stehen allerdings mehr Einträge drin... es sind also Dateien hinzugekommen. Diese sollen nun ermittelt werden. Dazu habe ich verschiedene Lösungsansätze entwickelt:
Code: Alles auswählen
for I := 1 to N_LIST.Count do
begin
if V_LIST.Strings[V_LIST.IndexOf(N_LIST.Strings[I - 1])] = N_LIST.Strings[I - 1]
then LIST.Add(N_LIST.Strings[I - 1]);
end;
Das war die Nummer, die unter Delphi bis dato (mit Memo-Feldern) funktioniert hat. Hier kommt bei Lazarus die Meldung: Index out of Bound (-1).
Code: Alles auswählen
for I := 1 to N_LIST.Count do
begin
if V_LIST.IndexOf(N_LIST.Strings[I - 1]) = (-1)
then LIST.Add(N_LIST.Strings[I - 1]);
end;
Hier rennt der Kollege scheinbar in einer Endlosschleife. Es gibt eine konstante CPU-Auslastung bei 50%, Speichernutzung liegt bei 20 MB und das Programm reagiert auf Nichts mehr... lässt sich nur noch beenden über Lazarus oder Taskmanager.
Alternativ habe ich folgende Version getackert:
Code: Alles auswählen
for I := 1 to N_LIST.Count do
begin
if (V_LIST.IndexOf(N_LIST.Strings[I - 1]) <> (- 1))
and (V_LIST.Strings[V_LIST.IndexOf(N_LIST.Strings[I - 1])] = N_LIST.Strings[I - 1])
then LIST.Add(N_LIST.Strings[I - 1]);
end;
Auch hier wird das zur "never ending story".
Grundsätzlich zu Info: Bis auf ein paar einzelne Einträge (deren Standort unbekannt ist) sind V_LIST und N_LIST vollkommen identisch. Bloß alle Änderungen (in Form von Einträgen, die in N_LIST vorkommen und NICHT in V_LIST) sollen in LIST eingetragen werden.
Ich hoffe, ihr könnt mir helfen. Falls Ihr weitere Codestücke oder Beispiele braucht: Bekommt Ihr.
Besten Dank und liebe Grüße
Fabian