Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Springt nicht in die Schleife (https://www.delphipraxis.net/167310-springt-nicht-die-schleife.html)

Timbuktu 23. Mär 2012 10:29

Springt nicht in die Schleife
 
Hallo liebe DP-Mitglieder,

ich hab da ein Problem. Und zwar bin ich gerade dabei einen Code zu schreiben, der Daten aus einer .txt-Datei auslesen soll und später in eine MySQL Datenbank schreibt.
Momentan hängt es leider dadran, das er die unten aufgeführte if Bedingung zwar anläuft, aber nicht rein springt, obwohl die Bedingungen erfüllt sind :evil: Vor ca 1 Std lief das ganz noch :?:
Wenn ich einen Haltepunkt setze, dann wird er Olivgrün (die werden im Code doch immer übersprungen, soweit ich weiß)
Ich hoffe ihr könnte mir helfen. Benutze Delphi 7

Delphi-Quellcode:
try
  tmpS:= Copy(txt[I],1,4);
  tmpI:= StrToInt(Copy(txt[I],5,5));
  if (tmpS = '   ') and (txt[I,10]= ' ') then
  begin
    CurrentDebNr:= tmpI;
  end;

  I:= I+1;
  Continue;
except
  //Continue;
end;
P.S. Hoffe ihr habt alles, was ihr braucht :)

DeddyH 23. Mär 2012 10:31

AW: Springt nicht in die Schleife
 
Nicht ganz. Wo ist denn die besagte Schleife geblieben?

Timbuktu 23. Mär 2012 10:35

AW: Springt nicht in die Schleife
 
Sry. Ich meinte nicht Schleife, sondern die if Bedingung :oops:

DeddyH 23. Mär 2012 10:40

AW: Springt nicht in die Schleife
 
Wenn der ursprüngliche String mindestens 5 Zeichen hat, wie kann tmpS dann aus nur einem Leerzeichen bestehen, wenn Du die ersten 4 Zeichen kopierst? Oder ist das ein Darstellungsfehler der DP?

p80286 23. Mär 2012 10:42

AW: Springt nicht in die Schleife
 
Also mit der Farbenlehre hab ich es nicht so aber copy(irgendwas,1,4) ist im allg 4 Stellen lang dann ist der Vergleich auf ein Blank höchstwahrscheinlich immer falsch.

Ist aber Spekulation, da ich die Daten nicht kenne.

Und vllt. ist es sinnvoll den Breakpoint vor "if" zu setzen, um auch mal zu kontrollieren was in den Variablen steht

Gruß
K-H

generic 23. Mär 2012 10:42

AW: Springt nicht in die Schleife
 
Die Problematik mit der If-Schleife ist auf dieser Webseite erklärt:
http://www.if-schleife.de/

Timbuktu 23. Mär 2012 10:42

AW: Springt nicht in die Schleife
 
Zitat:

Zitat von DeddyH (Beitrag 1158119)
Wenn der ursprüngliche String mindestens 5 Zeichen hat, wie kann tmpS dann aus nur einem Leerzeichen bestehen, wenn Du die ersten 4 Zeichen kopierst? Oder ist das ein Darstellungsfehler der DP?

Eindeutig ein Darstellungsfehler. Hab eben extra nochmal nach geguckt ^^

Timbuktu 23. Mär 2012 10:44

AW: Springt nicht in die Schleife
 
Zitat:

Zitat von generic (Beitrag 1158121)
Die Problematik mit der If-Schleife ist auf dieser Webseite erklärt:
http://www.if-schleife.de/

Hatte das erst komplett verwechselt, aber vorhin schon geändert :P
"Geändert von Timbuktu (Heute um 11:36 Uhr) Grund: Nicht Schleife, sondern if-Bedingung"

DeddyH 23. Mär 2012 10:45

AW: Springt nicht in die Schleife
 
Dann mal anders: wie sieht so eine Zeile in der Textdatei aus?

Timbuktu 23. Mär 2012 10:52

AW: Springt nicht in die Schleife
 
Zitat:

Zitat von DeddyH (Beitrag 1158124)
Dann mal anders: wie sieht so eine Zeile in der Textdatei aus?

Also die Zeilen sehen unterschiedlich aus. Es müssten insgesamt 9 verschieden Formen vorhanden sein. Durch dieses try except soll überprüft werden ob die Bedingungen für 1 der 9 Formen passen. Diese würde dann z.B. so Aussehen:

"_12345/1___________________1234_30.12.1899_____12_A_1____ _________1.234,56___________________1.234,56______ ____________________12"

Und die, die ich mit diesem Code erkenne will ist dieser Datensatz:

"____12345_ASDF_Movie_GMBH______________________1_ ____________________________123_456_78____________ ___________________"

Leider werden in der DP die ganzen Leerzeichen weg genommen, weswegen ich diese mit "_" ersetzt habe und natürlich hab ich die Daten in willkürliche Daten umgeändert.

DeddyH 23. Mär 2012 10:57

AW: Springt nicht in die Schleife
 
Das sieht nach einer Datei mit fixer Spaltenlänge aus. Falls das zutrifft und Dir die Länge der einzelnen Felder bekannt ist, dann würde ich versuchen, die Zeile in ihre Bestandteile aufzuspalten und die einzelnen Felder im Anschluss zu trimmen.

Timbuktu 23. Mär 2012 11:01

AW: Springt nicht in die Schleife
 
Zitat:

Zitat von DeddyH (Beitrag 1158128)
Das sieht nach einer Datei mit fixer Spaltenlänge aus. Falls das zutrifft und Dir die Länge der einzelnen Felder bekannt ist, dann würde ich versuchen, die Zeile in ihre Bestandteile aufzuspalten und die einzelnen Felder im Anschluss zu trimmen.

Nein, leider sind sie nicht mit fixer Spaltenlänge. Das waren jetzt ja nur 2 von den 9 verschiedenen Aufbauarten. Und ich versuche ja gerade mit diesen stückchen Code eine davon zu identifizieren.

DeddyH 23. Mär 2012 11:04

AW: Springt nicht in die Schleife
 
Alles innerhalb derselben Datei? Wer denkt sich denn so einen Blödsinn aus? Hast Du eine Dokumentation zu den Formaten?

vagtler 23. Mär 2012 11:10

AW: Springt nicht in die Schleife
 
Wo ist denn die ursprüngliche Zuweisung von i?

Timbuktu 23. Mär 2012 11:11

AW: Springt nicht in die Schleife
 
Zitat:

Zitat von DeddyH (Beitrag 1158130)
Alles innerhalb derselben Datei? Wer denkt sich denn so einen Blödsinn aus? Hast Du eine Dokumentation zu den Formaten?

Diese Daten kommen aus unserer/meiner Buchhaltung, die Offene Rechnungen bzw die letzten Bezahlung von Kunden beinhalten. Diese Datei wird ca 1 mal in der Woche generiert und per Hand gelesen und damit gearbeitet. Mein Abschlußprojekt ist jetzt halt, das das ganze automatisch von der .txt-Datei in eine SQL Datenbank eingelesen wird und dann von den Personen mit einem Programm begutachtet werden kann etc.
Leider gibt es dort anscheinend keine Dokumentation zu. Ich hab mich schon mit dem Personal aus der Buchhaltung auseinander gesetzt um den Aufbau etwas zu verstehen.

Timbuktu 23. Mär 2012 11:13

AW: Springt nicht in die Schleife
 
Zitat:

Zitat von vagtler (Beitrag 1158133)
Wo ist denn die ursprüngliche Zuweisung von i?

Die ist weiter oben in dem Code. Ich wollte jetzt nur nicht den ganzen Code hier rein kopieren, da es nur an dieser Stelle hapert.

Lemmy 23. Mär 2012 11:20

AW: Springt nicht in die Schleife
 
Welchen Typ hat eigentlich txt?

Timbuktu 23. Mär 2012 11:24

AW: Springt nicht in die Schleife
 
Zitat:

Zitat von Lemmy (Beitrag 1158137)
Welchen Typ hat eigentlich txt?

txt: TStringArray;
TStringArray = Array of String;

UliBru 23. Mär 2012 12:19

AW: Springt nicht in die Schleife
 
Delphi-Quellcode:
try
  tmpline := txt[I];
  tmpI:= StrToInt(Copy(tmpline,5,5));

  tmpS:= Copy(tmpline],1,4);
  tmpSX := tmpline[10];

  if (tmpS = '   ') and (tmpSX = ' ') then
  begin
    CurrentDebNr:= tmpI;
  end;

  I:= I+1;
  Continue;
except
  //Continue;
end;
Ich würde mal den Code etwas umschreiben und dann lässt sich der Inhalt von tmpS und tmpSX auch besser debuggen, somit auch die if-Bedingung

EWeiss 23. Mär 2012 12:52

AW: Springt nicht in die Schleife
 
Acuh wenn es jetzt nicht besonders wichtig ist.
begin.. end kannst auch sparen. wenn nur eine zeile nach IF geschrieben wird.

Delphi-Quellcode:
if (tmpS = '') and (tmpSX = ' ') then
   CurrentDebNr:= tmpI;
gruss

Timbuktu 23. Mär 2012 12:55

AW: Springt nicht in die Schleife
 
Zitat:

Zitat von UliBru (Beitrag 1158149)
Delphi-Quellcode:
try
  tmpline := txt[I];
  tmpI:= StrToInt(Copy(tmpline,5,5));

  tmpS:= Copy(tmpline],1,4);
  tmpSX := tmpline[10];

  if (tmpS = '   ') and (tmpSX = ' ') then
  begin
    CurrentDebNr:= tmpI;
  end;

  I:= I+1;
  Continue;
except
  //Continue;
end;

Ich hab das ganze jetzt mal so umgeändert, aber weiter helfen tut mir das leider auch nicht wirklich, weil er trotzdem nicht in die IF-Prozedur rein springt, wenn die Bedingungen erfüllt sind


@EWeiss: Danke für den Tipp. Bin aber noch nicht beim kürzen vom Code ^^

EWeiss 23. Mär 2012 12:57

AW: Springt nicht in die Schleife
 
Zitat:

@EWeiss: Danke für den Tipp. Bin aber noch nicht beim kürzen vom Code ^^
Deshalb ja auch!

Zitat:

Auch wenn es jetzt nicht besonders wichtig ist.
PS:
Sorry! Und du bist sicher das beide erfüllt sind?

gruss

DeddyH 23. Mär 2012 13:04

AW: Springt nicht in die Schleife
 
Die Frage stelle ich mir auch. Wenn die Haltepunkte partout nicht wollen, mach doch einmal anderweitige Ausgaben (OutputDebugString, zur Not ShowMessage) und prüfe, ob da wirklich das drinsteht, was Deiner Meinung nach sollte.

Timbuktu 23. Mär 2012 13:10

AW: Springt nicht in die Schleife
 
Zitat:

Zitat von EWeiss (Beitrag 1158157)
Zitat:

Auch wenn es jetzt nicht besonders wichtig ist.
PS:
Sorry! Und du bist sicher das beide erfüllt sind?

gruss

Jap. Hab eben das extra noch 2 mal durchlaufen lassen und sogar die Bedingung abgeändert, falls ich einfach nur ein ' ' übersehen habe.

Problem gelöst. Im Compiler hat sich der optimierer aufgehangen. Hab ihn jetzt ausgeschaltet, das ganz nochmal neu gestartet, die ganzen unnötigen Dateien aus dem Verzeichnis des Programmes gelöscht und siehe da, es funktioniert wieder.
Trotzdem vielen Dank an alle :thumb:

EWeiss 23. Mär 2012 13:17

AW: Springt nicht in die Schleife
 
Zitat:

Im Compiler hat sich der optimierer aufgehangen
Hab mir angewöhnt den komplett abzuschalten wenn es um's debuggen geht.
Wird nichts angezeigt wenn die bedingung gerade optimiert wird.. sehr schlecht beim debuggen.

PS:
Meine die Optimierung unter den Compiler Option ;)

gruss

idefix2 26. Mär 2012 13:19

AW: Springt nicht in die Schleife
 
Einen Tipp hätte ich noch zum Lösungsansatz: Statt mit copy und Stringvergleichen und dergleichen zu arbeiten, um solche Zeilen zu analysieren, ist es sehr viel einfacher, reguläre Ausdrücke zu verwenden. Die Komplexität des Programms reduziert sich damit auf einen Bruchteil.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:46 Uhr.

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