| Autor |
Beitrag |
coocky
      
Beiträge: 17
|
Verfasst: Do 21.02.08 21:08
hallo,
ich habe folgenden Quelltext entworfen. Dort werden gespeicherte Daten aus der Bücherliste in die ListBox eingefügt (Datum, Bücher, Name für ein Bibliotheksprogramm) und dann geht das Programm jede einzelne Zeile durch, guckt wo das Rückgabedatum überschritten ist und gibt eine Message aus. Dies funktioniert auch soweit. Allerdings ist es so, dass wenn das Ausleihedatum zum Beispiel 20 mal überschritten ist, 20 mal die Message erscheint. Ich habe schon einen Quelltext entworfen um das Problem zu lösen, allerdings funktioniert dieser nicht.
Quelltext ohne Änderung:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.FormCreate(Sender: TObject); var lIx , lInt : integer; begin if FileExists('Bücherliste1.txt') then ListBox1.Items.LoadFromFile('Bücherliste1.txt'); if FileExists('Bücherliste2.txt') then ListBox2.Items.LoadFromFile('Bücherliste2.txt'); if FileExists ('Bücherliste3.txt') then ListBox3.Items.LoadFromFile('Bücherliste3.txt'); for lIx := 0 to ListBox1.Items.Count-1 do begin lInt := StrToIntDef(ListBox1.Items.Strings[lIx], 0); if lInt<Now then showmessage('Ausleihdatum überschritten'); end; end; |
Quelltext mit meiner Änderung:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.FormCreate(Sender: TObject); var lIx , lInt : integer; begin if FileExists('Bücherliste1.txt') then ListBox1.Items.LoadFromFile('Bücherliste1.txt'); if FileExists('Bücherliste2.txt') then ListBox2.Items.LoadFromFile('Bücherliste2.txt'); if FileExists ('Bücherliste3.txt') then ListBox3.Items.LoadFromFile('Bücherliste3.txt'); Repeat for lIx := 0 to ListBox1.Items.Count-1 do begin lInt := StrToIntDef(ListBox1.Items.Strings[lIx], 0); if lInt<Now then showmessage('Ausleihdatum überschritten'); lIx:=1; end; until lIx:=1; end; end; |
|
|
nagel
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: Do 21.02.08 21:21
Ich würde einfach eine Boolean-Variable setzen, wenn mindestens einmal das Datum überschritten ist, und dann abhängig von dieser die Warnung ausgeben, also ungefähr so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.FormCreate(Sender: TObject); var lIx , lInt : integer; Ueberschritten: Boolean; begin Ueberschritten := False; if FileExists('Bücherliste1.txt') then ListBox1.Items.LoadFromFile('Bücherliste1.txt'); if FileExists('Bücherliste2.txt') then ListBox2.Items.LoadFromFile('Bücherliste2.txt'); if FileExists ('Bücherliste3.txt') then ListBox3.Items.LoadFromFile('Bücherliste3.txt'); for lIx := 0 to ListBox1.Items.Count-1 do begin lInt := StrToIntDef(ListBox1.Items.Strings[lIx], 0); if lInt<Now then Ueberschritten := True; end; If Ueberschritten Then ShowMessage('Ausleihdatum überschritten'); end; |
Edit: Hm komisch, wieso highlighted der da falsch?
Zuletzt bearbeitet von nagel am Do 21.02.08 21:40, insgesamt 1-mal bearbeitet
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Do 21.02.08 21:36
Tipp: rel. bzw keine Pfade in den Dateiangaben bringen früher oder später nur Fehlermeldungen und damit Ärger!
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
bflegel
      
Beiträge: 193
Erhaltene Danke: 1
Win XP, Win 7, BS2000
D5
|
Verfasst: Do 21.02.08 21:55
@nagel:
Ich würde allerdings in Deine if-Abfrage noch ein break einbauen, da schon ein Treffer genügen sollte um die Message auszugeben.
Etwa so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure TForm1.FormCreate(Sender: TObject); var lIx , lInt : integer; Ueberschritten: Boolean; begin Ueberschritten := False; if FileExists('Bücherliste1.txt') then ListBox1.Items.LoadFromFile('Bücherliste1.txt'); if FileExists('Bücherliste2.txt') then ListBox2.Items.LoadFromFile('Bücherliste2.txt'); if FileExists ('Bücherliste3.txt') then ListBox3.Items.LoadFromFile('Bücherliste3.txt');
for lIx := 0 to ListBox1.Items.Count-1 do begin lInt := StrToIntDef(ListBox1.Items.Strings[lIx], 0); if lInt<Now then begin Ueberschritten := True; break; end; end; If Ueberschritten Then ShowMessage('Ausleihdatum überschritten'); end; |
Damit wird nicht die ganze Liste durchgearbeitet, was bei sehr vielen Einträgen durchaus einen Geschwindigkeitsvorteil bringen kann.
bye
bflegel
_________________ I know all the jokes about my name
|
|
nagel
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: Do 21.02.08 22:06
bflegel hat folgendes geschrieben: | @nagel:
Ich würde allerdings in Deine if-Abfrage noch ein break einbauen, da schon ein Treffer genügen sollte um die Message auszugeben.
|
Deshalb auch mein "ungefähr" 
|
|
bflegel
      
Beiträge: 193
Erhaltene Danke: 1
Win XP, Win 7, BS2000
D5
|
Verfasst: Do 21.02.08 22:18
Ok,
das "ungefähr" hab ich nicht gelesen... sorry
somit ist der Lerneffekt auch im Eimer
Schönen Abend noch
bye
bflegel
_________________ I know all the jokes about my name
|
|
Muetze1
      
Beiträge: 346
|
Verfasst: Fr 22.02.08 03:26
Ich würde nebenbei noch empfehlen die if FileExists() durch else if ersetzen. Grund: LoadFromFile() löscht die ListBox vor dem Laden, somit wäre es bei einer existierenden Bücherliste1 und Bücherliste3 reine Zeitverschwendung vorher noch Bücherliste1 zu laden um sie dann wieder weg zu werfen.
_________________ 49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
|
|
oldmax
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: Fr 22.02.08 06:29
Hi
Ich weiß nicht, ob ihr das gesehen habt .....
| Zitat: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| Repeat for lIx := 0 to ListBox1.Items.Count-1 do begin lInt := StrToIntDef(ListBox1.Items.Strings[lIx], 0); if lInt<Now then showmessage('Ausleihdatum überschritten'); lIx:=1; end; until lIx:=1; | |
Eine For Schleifenvariable zu manipulieren.... sehr gefährlich.....
Gruß oldmax
_________________ Zier dich nich so, ich krieg dich schon....
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Fr 22.02.08 12:39
müsste es nicht so sein?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| Repeat for lIx := 0 to ListBox1.Items.Count-1 do begin lInt := StrToIntDef(ListBox1.Items.Strings[lIx], 0); if lInt<Now then showmessage('Ausleihdatum überschritten'); lInt :=1; end; until lInt :=1; |
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Muetze1
      
Beiträge: 346
|
Verfasst: Fr 22.02.08 15:44
Ok, wenn wir mal genauer hinschauen, dann noch folgende 2 Dinge:
1. For Schleifenvariablen nicht verändern. Du bekommst auch einen entsprechenden Hinweis vom Compiler (Die man immer beachten sollte!)
2. Until braucht eine Bedingung und keine Zuweisung, auch dies wird durch einen Fehler vom Compiler hingewiesen.
_________________ 49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
|
|