Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Stringlist in Memorybox schreiben


Samarek - Fr 28.08.09 18:27
Titel: Stringlist in Memorybox schreiben
Tach zusammen,
folgendes ....
ich will eine Textdatei in eine Stringlist auslesen, bis zu einer bestimmten Markierung zeilenweise löschen und dann den Inhalt bis zur nächsten Markierung zeilenweise in eine Memorybox schreiben
eigentlich weiss ich wie das geht, mit 2 while-Schleifen sollte es kein Problem sein, klappt aber irgendwie nicht, allerdings bekomm ich auch keine Fehlermeldung, er schreibt immer nur die erste Zeile in die Memorybox

hat jemand eine Idee woran das liegen könnte, vielleicht ist das Problem ja bekannt oder jemand erkennt es grad wieder

desweiteren ist meine Lösung sicher nicht besonders "schön", daher wüsst ich auch gerne mal ne "schöne" Lösung für mein Problem


Lannes - Fr 28.08.09 20:02

Hallo,


user profile iconSamarek hat folgendes geschrieben Zum zitierten Posting springen:
hat jemand eine Idee woran das liegen könnte
ja, hab ich, Dein Code ist fehlerhaft. :wink:

Ich würde das auch mit while-Schleifen oder mit IndexOf arbeiten, wenn die Art der Markierung das erlaubt.

Wie sieht denn Dein Code aus, denke das man den/die Fehler findet.


Samarek - Sa 29.08.09 13:25

joa, der Quellcode ist fehlerhaft, denk ich auch ;)

hab mir das auch nochmal genauer angeguckt und der Fehler muss eigentlich bei der Ausgabe in die Memory-Box liegen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
zeile:=html_bearb[0];
zeil_count:=0;
while zeile <> bearb_en do
                        begin
                        mem_inhalt.lines[zeil_count]:=zeile;
                        html_bearb.Delete(0);
                        zeile:=html_bearb[0];
                        zeil_count:=zeil_count+1;
                        end;


html_bearb ist die Stringliste, mem_inhalt ist die Memory-Box, zeil_count ist eine integer-Variable die er beim durchlaufen hochzählen soll, damit er bei jedem Durchlauf in eine neue Zeile der Memory-Box schreibt, bearb_en ist eine string-Variable in der steht bis zu welcher Zeile er gehen soll, also, die "Zielzeile"

solange die aktuelle Zeile ungleich der "Zielzeile" ist soll er die aktuelle Zeile in die Memory-Box schreiben, die oberste Zeile in der Stringliste löschen und dann die oberste Zeile der Stringliste in die Variable für die aktuelle Zeile laden und zum Schluss den Zeilenzähler um 1 erhöhen
aber, wie gesagt, er gibt immer nur die oberste Zeile der Stringliste in die Memory-Box aus


SvenAbeln - Sa 29.08.09 14:23

Ich nehme mal an deine Memory-Box ist ein TMemo?
Hat dein Memo denn genug Zeilen? Denn dieser Teil von deiner Funktion geht nur, wenn es auch eine Zeile mit dem Index 'zeil_count' in dem Memo gibt.

Delphi-Quelltext
1:
mem_inhalt.lines[zeil_count]:=zeile;                    


So sollte es gehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
zeile:=html_bearb[0];
mem_inhalt.clear;               // Memo löschen
while zeile <> bearb_en do
begin
  mem_inhalt.lines.add(zeile);  // neue Zeile ans Memo anhängen
  html_bearb.Delete(0);
  zeile:=html_bearb[0];
end;


Samarek - Sa 29.08.09 15:51

Ausgezeichnet
Ich wusste doch dass es etwas saublödes war
herzlichen Dank für die Hilfe
jetzt funktioniert es

.... womit ich dann direkt beim nächsten "Problem" bin
es ist nicht wirklich ein Problem im Sinne von "das Programm läuft nicht"
es ist mehr ein Problem im Sinne von "Quellcode verschönern"

und zwar arbeite ich mit 3 Stringlisten, eine enthält den Anfang der Datei, eine das Ende und die dritte enthält den veränderten Teil, der, wie sich bereits vermuten lässt, zwischen den Anfang und das Ende soll
bisher mach ich das mit einer vierten Stringlist in die ich nacheinander alle 3 Stringlisten schreibe, aber das muss doch auch einfacher bzw. schöner gehen.

Hat da jemand mal nen Tip für mich ???


Lannes - Sa 29.08.09 18:37

Hallo,

vermute das Du einen Teil eines Textes(HTML?) austauschen willst, dann kannst Du doch alles mit einer StringList realisieren.
Überschreib doch die Zeilen in der Stringlist und falls der einzufügende Bereich größer ist bietet Dir die Stringlist auch insert.
Eventuell hilft dir auch Stringlist.AddStrings weiter.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
//überschreiben
StrList[Index] := 'Hallo';
//einfügen
StrList.insert(Index,'Hallo');
//StringList an andere hängen
StrList.AddStrings(QuellStrList);


Samarek - Sa 29.08.09 19:13

ok, das AddStrings hat mir jetzt schonmal 32 Zeilen Code gespart
"Wer lesen kann ist klar im Vorteil"

wie genau überschreibe ich denn Strings in einer Stringlist???

und ... mit dem Index-Befehl füge ich einen Index ein oder lege ich damit einen Index fest???


Lannes - Sa 29.08.09 20:11

Hallo,

so wie ich es in dem Code steht, etwas ausführlicher:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var Index : Integer;
begin
  Index := 3;
  StrList[Index] := 'Hallo'//in der vierten Zeile steht jetzt 'Hallo'
                             //vorrausgesetzt Count ist mindestens 4 
end;




user profile iconSamarek hat folgendes geschrieben Zum zitierten Posting springen:
ok, das AddStrings hat mir jetzt schonmal 32 Zeilen Code gespart
Da würde mich Dein ursprünglicher Code jetzt aber interessieren :?