Autor Beitrag
coocky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: 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:
ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP, Win 7, BS2000
D5
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: Do 21.02.08 22:06 
user profile iconbflegel 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" :wink:
bflegel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP, Win 7, BS2000
D5
BeitragVerfasst: Do 21.02.08 22:18 
Ok,

das "ungefähr" hab ich nicht gelesen... sorry

somit ist der Lerneffekt auch im Eimer :roll:

Schönen Abend noch

bye
bflegel

_________________
I know all the jokes about my name
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: Fr 22.02.08 06:29 
Hi
Ich weiß nicht, ob ihr das gesehen habt .....
Zitat:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: Fr 22.02.08 12:39 
müsste es nicht so sein?
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: 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