Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - TStringList.Count zählt falsch?
GU_Meyer - Do 16.01.14 12:27
Titel: TStringList.Count zählt falsch?
Hallo,
als Teil einer umfangreichen Client-Server-Dateiverwaltung verwende ich eine Stringliste (ServerDateiStrL) die ich mit Hilfe eines Streams vom Server an den Client übertrage (in Grundzügen nach den hier gefundenen Tuturials von "Narses" zu den Themen "Terminatorzeichen-Protokoll 1 und 2).
Die Übertragung funktioniert auch grundsätzlich, das Problem taucht erst auf, wenn ich die aus dem Stream geladene Stringliste im Client weiterverarbeiten will.
Im Debugger enthält die Stringliste (Client) 49 Elemente, allerdings steht in ServerDateiStrL.Count (auch auf der Clientseite) der Wert 70.
Passiert bei dem "skizzierten" Weg (alle Variablen sind jeweils entspr. in Server bzw. Client deklariert und initialisiert) von
(Server:) ServerDateiStrL --> MessageStream (:TStringStream) --> TServerSocket.SendText(MessageStream.DataString) --> (Client:) ServerDateiStrL.LoadFromStream(MsgStream) (MsgStream : TStringStream)
irgendwas mit der Anzahl der Elemente in ServerDateiStrL?
Danke und Gruss
GU_Meyer
jfheins - Do 16.01.14 12:43
Ein Link zu dem Tutorial wäre jetzt gut gewesen ;-)
Allgemeine gearentiert dir der Socket nur, dass die gleichen Daten ankommen, und in der richtigen Reihenfolge. Aber nicht, dass am anderen Ende nur genau ein Event ausgelöst wird!
Ein TServerSocket.SendText("Hallo") könnte also tatsächlich in einzelnen Buchstaben auf der anderen Seite ankommen. Hast du das bedacht?
GU_Meyer - Do 16.01.14 13:47
jfheins hat folgendes geschrieben : |
Ein Link zu dem Tutorial wäre jetzt gut gewesen ;-) |
Ok, das lässt sich machen :)
Teil 1 verlinke ich jetzt nicht, da es mir um den Teil 2 (
http://www.entwickler-ecke.de/topic_TerminatorzeichenProtokollTutorial++Teil+2+Sockets_65487.html) geht. Ichhabe praktisch die "Bildübertragung" durch meine Stringliste ersetzt.
jfheins hat folgendes geschrieben : |
Allgemeine gearentiert dir der Socket nur, dass die gleichen Daten ankommen, und in der richtigen Reihenfolge. Aber nicht, dass am anderen Ende nur genau ein Event ausgelöst wird!
Ein TServerSocket.SendText("Hallo") könnte also tatsächlich in einzelnen Buchstaben auf der anderen Seite ankommen. Hast du das bedacht? |
Nein, hab ich nicht (mehr) :oops:
Das würde dann bedeuten, dass ich entweder ein komplett anderes Verfahren brauche oder zumindest meine Stringliste nochmal auf der Clientseite eigenhändig neu zusammensetzen muss - was noch das kleinste Übel wäre.
Danke erstmal
Gruss
GU_Meyer
Narses - Do 16.01.14 14:29
Moin und :welcome: in der EE!
Wenn du dich an die in dem Tutorial behandelten Erkenntnisse gehalten hast, dann sollte eigentlich das dort aufgebaute Protokoll die Paketierung übernehmen, sprich: deine Stringliste kommt auch als ein Datenpaket auf der Empfängerseite an. :idea:
Allerdings ist deine Schilderung doch recht allgemein gehalten, so dass ohne weitere Informationen (oder gar die entsprechenden Codeabschnitte) keine weitere Aussage möglich ist. :lupe:
cu
Narses
GU_Meyer - Do 16.01.14 15:31
Narses hat folgendes geschrieben : |
Moin und :welcome: in der EE!
Wenn du dich an die in dem Tutorial behandelten Erkenntnisse gehalten hast, dann sollte eigentlich das dort aufgebaute Protokoll die Paketierung übernehmen, sprich: deine Stringliste kommt auch als ein Datenpaket auf der Empfängerseite an. :idea: |
Meine Stringliste kommt ja als Paket an. Alles, was ich auf der Serverseite "reinpacke", ist auf der Clientseite vorhanden. Das ist ja auch nicht, zumindest sehe ich das so, das Problem. Da ist dein Tutorial genial gemacht und hat mir viel Zeit gespart und meinen Wissenstand mindestens verdoppelt ;-) :zustimm:
Mich wundert einfach, dass meine empfangene Stringliste nach meiner Zählung 49 Elemente enthält, mit der Debugger für ServerDateiStrL.Count aber den Wert 70 anzeigt. Die 49 Elemente stimmen mit dem überein, was ich auf der Serverseite in die DateiStrL geschrieben habe. Wie kommt Pascal auf die 70, wenn ServerDateiStrL.Text nur 49 Elemente, getrennt durch #13#10, enthält? :?
Ich muss dazu sagen, dass meine Zählung so entstanden ist, dass ich den Inhalt von ServerDateiStrL.Text aus dem Debuggerfenster in einen Editor kopiert und dann die #13#10 jeweils durch einen Zeilenumbruch ersetzt habe. Dies hat mir dann 49 Zeilen ergeben. Aber unabhängig davon erhalte ich eine Zugriffsverletzung bei einer Schleife
Quelltext
1: 2: 3: 4: 5:
| for index:=0 to ServerDateiStrL.Count-1 do begin // hier greife ich auf die einzelnen Elemente // über den Index zu end; |
sobald der index den Wert 49 überschreitet.
Narses hat folgendes geschrieben : |
Allerdings ist deine Schilderung doch recht allgemein gehalten, so dass ohne weitere Informationen (oder gar die entsprechenden Codeabschnitte) keine weitere Aussage möglich ist. :lupe: |
Wie gesagt, ich habe frühestens heut abend wieder Zugriff auf meinen Code, dann kann ich aber gern die hierfür relevanten Teile posten.
Gruss
GU_Meyer
GU_Meyer - Do 16.01.14 22:26
Hallo,
hat sich geklärt. Weder die Stringliste zählt falsch, noch liegt der Fehler im Übertragungsverfahren. Der Fehler entsteht schon auf der Serverseite bei mir. Ich sammele die Dateien und Verzeichnisse rekursiv in einem Array. Dieses sortiere ich über eine etwas umständnliche Routine dann der Größe nach, wobei das Verzeichnis mit den meisten Einträgen an den Anfang kommt. Und bei diesem Sortieren entsteht der Fehler - und den habe ich vor ein paar Tagen selbst produziert und bis eben nicht gemerkt. Ergebnis ist, dass ich nicht eine Liste wie folgt (und ursprünglich geplant habe):
Delphi-Quelltext
1: 2: 3: 4: 5:
| Groesstes_Verzeichnis Dateiname_in_diesem_Verzeichnis Dateiname_in_diesem_Verzeichnis Naechst_kleineres_Verzeichnis Dateiname_in_diesem_Verzeichnis |
...usw.
sondern:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Groesstes_Verzeichnis Dateiname_in_diesem_Verzeichnis Dateiname_in_diesem_Verzeichnis Naechst_kleineres_Verzeichnis Dateiname_in_diesem_Verzeichnis Naechst_kleineres_Verzeichnis Dateiname_in_diesem_Verzeichnis Naechst_kleineres_Verzeichnis Dateiname_in_diesem_Verzeichnis Naechst_kleineres_Verzeichnis Dateiname_in_diesem_Verzeichnis |
usw.
Damit erklärt sich dann auch das ungewöhnliche Verhältnis der von mir gezählten und erwarteten Einträge und den real in der Stringliste vorhandenen.
Bitte entschuldigt, dass ich hier alles aufgeschreckt habe...! :oops:
Trotzdem vielen Dank fürs Mithelfen und Überlegen - ich verspreche, dass die nächste Frage vorher sorgfältiger durchdacht sein wird (dies ist mein erstes wirklich viel größeres Projekt, sozusagen wahrscheinlich mein Lebenswerk, wenn alles funktioniert und der Dateimananger nur noch ein Teil von ganz vielen ist).
Gruss
GU_Meyer
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!