![]() |
verschachtelte for to do schleife
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich möchte für ein Warenwirtschaftsprogramm beim Artikel anlegen vermeiden, dass ein und der selbe Hersteller mehrfach angelegt wird. Man gibt also den Hersteller in Form A ein, drückt enter und es öffnet sich Form B mit allen Ähnlichen Herstellern. --> Knorr AG Knorr GmbH Knorr und lecker Knorrirgendwas Dann den richtigen Hersteller auswählen und chick. Die Datenbank soll also durchsucht werden und dann geprüft werden ob dieser Hersteller bereits in Form B steht, wenn ja dann nichts machen, wenn nein, dann auflisten. Das Prüfen ist notwendig, damit nicht 70x Knorr steht, weil ich 70 Artikel von dieser Firma habe (in Grafik wie es nicht sein soll) Hier der Quellcode mit dem Problem, dass die J Schleife nie durchlaufen wird. Ich verstehe nicht warum :-(
Delphi-Quellcode:
begin
listview1.Clear; Ini:=TIniFile.create(einstellungen.artikelreg); //---------------------------------------------------- //Datenbankpfad zuweisen db_ar_index:=ini.readstring('DB_AR', 'index', db_ar_index); // Anzahl Datenbankeinträge lesen ean_hersteller_suche:=pflege.edit8.text; //herstellerfeld // Herstellerbezeichnung in aktuelle Form reinholen for I := 0 to strtoint(db_ar_index)do // von 0 bis Ende der DB Einträge begin showmessage('beginne i schleife'); Ini:=TIniFile.create(einstellungen.artikelreg); ean_hersteller_db:= ini.readstring(inttostr(I), 'hersteller', ean_hersteller_db); // Hersteller aus 1. Datensatz lesen ean_hersteller_suche:=uppercase(ean_hersteller_suche); // in Großbuchstaben umwandeln ean_hersteller_db_short:= copy(ean_hersteller_db,1,(length(ean_hersteller_suche))); ean_hersteller_db_short:=uppercase(ean_hersteller_db_short); if (Pos(ean_hersteller_suche,ean_hersteller_db_short)>0) // wenn Herstellereingabe von Benutzer mit Datenbankeintrag übereinstimmt then begin showmessage('i: suchwort enthalten'); for J := 0 to listview1.items.Count - 1 do // --> listview durchsuchen ob Hersteller schonmal gelistet ist begin showmessage('beginne J schleife'); if (ListView1.Items.Item[J].Caption = ean_hersteller_db) // prüfen ob Hersteller schon einmal aufgeführt then begin exit; // Schleife verlassen end else begin list:= listview1.Items.add; //Eintrag erzeugen list.caption:=ean_hersteller_db; end; end; end; end;// schleife I |
AW: verschachtelte for to do schleife
So, wie der Quelltext dort steht, ist es klar, dass es nicht funktioniert:
Delphi-Quellcode:
Fällt dir was auf? Wobei ich anhand der starken Einrückungen davon ausgehe, dass du einige Zeilen Quelltext weggelassen hast, um nur das Wichtige zu zeigen (was ja richtig ist).
listview1.Clear;
... for J := 0 to listview1.items.Count - 1 do Davon abgesehen erzeugst du in der for-Schleife mit jedem Durchlauf eine Instanz von TIniFile, ohne diese zu zerstören. Besser diesen Aufruf in der Schleife weglassen, vor der Schleife erzeugen und danach (oder wenn nicht mehr benötigt) wieder zerstören. MfG Dalai |
AW: verschachtelte for to do schleife
Sieht aus also ob Listview1 leer ist ...
|
AW: verschachtelte for to do schleife
Zitat:
Delphi-Quellcode:
for J := 0 to listview1.items.Count - 1 do // --> listview durchsuchen ob Hersteller schonmal gelistet ist
begin showmessage('beginne J schleife'); if (ListView1.Items.Item[J].Caption = ean_hersteller_db) // prüfen ob Hersteller schon einmal aufgeführt then begin exit; // Schleife verlassen end else begin list:= listview1.Items.add; //Eintrag erzeugen list.caption:=ean_hersteller_db; end; end; end; if listview1.items.Count = 0 then //das hier fehlt! begin list:= listview1.Items.add; //Eintrag erzeugen list.caption:=ean_hersteller_db; end; |
AW: verschachtelte for to do schleife
Warum so viel Code in einer einzigen Methode?
Das ist nicht gut! Schreibe mal eine Funktion/Methode die nur Folgendes macht: Inputparameter sind ein TStrings-Objekt mit allen Firmen und der Suchstring. Die Funktion befüllt ein 2. TStrings-Objekt mit allen zum Suchstring passenden Treffern. Man könnte das auch mit einer SQL-Abfrage mit dem Operator LIKE ermitteln. Auf jeden Fall: nicht Alles in eine Funktion packen sondern das Problem zerlegen und mit Unterfunktionen lösen. |
AW: verschachtelte for to do schleife
Prüf' auch mal die ini.Create***
Delphi-Quellcode:
Edit: Dalai war schneller
listview1.Clear;
Ini := TIniFile.create(einstellungen.artikelreg); // *** db_ar_index := ini.readstring('DB_AR', 'index', db_ar_index); ean_hersteller_suche := pflege.edit8.text; for I := 0 to strtoint(db_ar_index) do begin Ini := TIniFile.create(einstellungen.artikelreg); // *** ??? |
AW: verschachtelte for to do schleife
Danke das war die Lösung!
@ Bjoerk: das 2. Tinifile.create habe ich entfernt, das war überflüssig. Danke dafür! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 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