Autor Beitrag
delphineuling
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 113

XP
wat dat
BeitragVerfasst: Fr 24.02.06 21:07 
Könnt ihr mir den Fehler sagen, oder das richtg umbauen?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Button1Click(Sender: TObject);
var mode:integer;
 begin
 if listbox1.ItemIndex= (0then showmessage ('Geben Sie bitte Namen ein');
 end;
 begin
  randomize;
  mode:=random(2)+1;
 if mode=2 then
  begin
  label17.Caption:='Wer muss Trinken? ' + listbox1.Items[random(listbox1.items.count)]+' muss ' + listbox4.Items[random(listbox4.Items.Count)]+ ' ' + listbox2.items[random(listbox2.Items.Count)]+ ' trinken !';
  end
 else begin
  label17.Caption:='Wer muss Trinken? ' + listbox1.Items[random(listbox1.items.count)]+' muss einen Kurzen ' + listbox3.items[random(listbox3.Items.Count)]+ ' trinken !';
 end;
 Button1.Caption:='Pause';
end;
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Fr 24.02.06 21:08 
Du hast keine Kommentare in deinem Code und erwartest, dass ihn ohne Erklärung irgendjemand versteht? :roll:

AXMD
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Fr 24.02.06 21:13 
Naja, du solltest uns schon sagen wo der Compiler einen Fehler meldet und welchen Fehler er meldet.

Ich habe den Code jetzt mal ein bisschen angepasst. Vielleicht war deine seltsame Syntax ja auch nur das Problem ;-)
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:
procedure TForm1.Button1Click(Sender: TObject);
var mode:integer;
begin
 if listbox1.ItemIndex=0 then 
  begin
   showmessage ('Geben Sie bitte Namen ein');
  end
 else
  begin
   randomize;
   mode:=random(2)+1;
    if mode=2 then
     begin
      label17.Caption:='Wer muss Trinken? ' + listbox1.Items[random(listbox1.items.count)]+' muss ' + listbox4.Items[random(listbox4.Items.Count)]+ ' ' + listbox2.items[random(listbox2.Items.Count)]+ ' trinken !';
     end
   else 
     begin
      label17.Caption:='Wer muss Trinken? ' + listbox1.Items[random(listbox1.items.count)]+' muss einen Kurzen ' + listbox3.items[random(listbox3.Items.Count)]+ ' trinken !';
     end;
  Button1.Caption:='Pause';
 end;
end;
delphineuling Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 113

XP
wat dat
BeitragVerfasst: Fr 24.02.06 21:19 
Also ich hab oben diesen Teil neu eingebaut und das soll bewirken, dass wenn man in die Listboxen(in dem Fall erst noch eine) noch nichts eingegeben hat, halt eine Nachricht kommen soll das man dies noch tun soll!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
begin
 if listbox1.ItemIndex= (0then showmessage ('Geben Sie bitte Namen ein');
 { (So solls dann weiter gehen) if listbox2.ItemIndex= (0) then .... ;    }
 end;

Was ist darn falsch oder wie kann oder muss ich das anders machen?
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Fr 24.02.06 21:21 
Wenn noch nichts ausgewählt wurde, ist der ItemIndex aber -1 und nicht 0. Die Zählung des ItemIndex beginn bei 0, nicht bei 1.

AXMD
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Fr 24.02.06 21:30 
user profile icondelphineuling hat folgendes geschrieben:
Also ich hab oben diesen Teil neu eingebaut und das soll bewirken, dass wenn man in die Listboxen(in dem Fall erst noch eine) noch nichts eingegeben hat, halt eine Nachricht kommen soll das man dies noch tun soll!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
begin
 if listbox1.ItemIndex= (0then showmessage ('Geben Sie bitte Namen ein');
 { (So solls dann weiter gehen) if listbox2.ItemIndex= (0) then .... ;    }
 end;

Was ist darn falsch oder wie kann oder muss ich das anders machen?


Also willst du eine Fehlerüberprüfung einbauen?

Ist doch dann ganz einfach:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
if listbox1.ItemIndex=-1 then
 begin
  showmessage('name');
 end
else if listbox2.itemsindex=-1
 begin
  showmessage('bla');
 end
else
 begin
  //Code der eigentlichen Anwendung
 end;


Achja, sollte man nicht itemindex durch items.count ersetzen? Achtung: Dann ist der Wert wieder 0: listbox1.items.count=0 !!!
Miri
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: Fr 24.02.06 21:55 
user profile icondelphineuling hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Button1Click(Sender: TObject);
var mode:integer;
 begin
 if listbox1.ItemIndex= (0then showmessage ('Geben Sie bitte Namen ein');
 end;
 begin
  randomize;
  mode:=random(2)+1;
 if mode=2 then
  begin
  label17.Caption:='Wer muss Trinken? ' + listbox1.Items[random(listbox1.items.count)]+' muss ' + listbox4.Items[random(listbox4.Items.Count)]+ ' ' + listbox2.items[random(listbox2.Items.Count)]+ ' trinken !';
  end
 else begin
  label17.Caption:='Wer muss Trinken? ' + listbox1.Items[random(listbox1.items.count)]+' muss einen Kurzen ' + listbox3.items[random(listbox3.Items.Count)]+ ' trinken !';
 end;
 Button1.Caption:='Pause';
end;



Bin mir nicht sicher und werds auch nicht ausprobieren, aber kann das Problem daran liegen, dass der Compiler "denkt", die Prozedur wäre nach dem end zu ende? Oder macht dem das nichts aus, wenn in einer Procedure mehrere begin ... end blöcke sind (hintereinander, das man verschachteln kann ist ja klar ;) )?!
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Fr 24.02.06 21:59 
user profile iconMiri hat folgendes geschrieben:

Bin mir nicht sicher und werds auch nicht ausprobieren, aber kann das Problem daran liegen, dass der Compiler "denkt", die Prozedur wäre nach dem end zu ende? Oder macht dem das nichts aus, wenn in einer Procedure mehrere begin ... end blöcke sind (hintereinander, das man verschachteln kann ist ja klar ;) )?!


Genau daran liegt es und deshalb habe ich den obigen Code auch angepasst ;-)
bms
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 735

Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
BeitragVerfasst: Fr 24.02.06 22:00 
Also delphineuling, zuerst eine kleine Bitte an dich. Achte drauf wie wo was eingerückt ist. Sowas wie hier:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
begin
 if listbox1.ItemIndex= (0then showmessage ('Geben Sie bitte Namen ein');
 { (So solls dann weiter gehen) if listbox2.ItemIndex= (0) then .... ;    }
 end;


erschwert nur die Fehlersuche. Bei den drei Zeilen ist das nicht wild. Wenn du aber 20 Zeilen hast und das abschließende end ist eingerückt, dann denkt man zuerst, daß ein end zuwenig ist. Passiert das mitten im Code, dann kommt man richtig durcheinander. Also immer schön aufpassen und am besten nicht nur ein Zeichen einrücken, sondern mindestens zwei.

Jetzt aber zu deinem Problem:

Also, bei ListBoxen sollte man immer zwei Anfragezeilen einbauen. Und ich meine es nicht gelegentlich, sondern IMMER. Regel No 1 bei ListBox: kommt im Code Listbox vor, dann zwei Sicherheitsabfragen einbauen. Am besten immer gleich am anfang des Blocks, dann vergißt man es nicht.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
begin
  if ListBox1.Items.Count = 0 then Exit;
  if ListBox1.Items.ItemIndex = -1 then Exit;

  ...


Die kann man sich nur dann sparen wenn es zum Code gehört irgendwo später auf die Punkte einzugehen. Count = 0 Abfrage verhindert, daß Zugriffe im Code auf ein Item Wert ins leere gehen und das Programm eine Fehlermeldung ausgibt. Wenn die ListBox leer ist, dann brint es nichts weiter im Code zu gehen. Wo nichts ist, da kann nichts verarbeitet werden. Die zweite Abfrage ItemIndex = -1 verhindert, daß man z.B. über with ListBox1 do Items[ItemIndex] versucht einen Wert auszulesen wo nichts gewählt ist.

Also, am besten immer als erstes diese zwei Zeilen einbauen. Sollte später ein leerer Count oder ein nicht gesetzter ItemIndex eine Rolle spielen, dann kann man die Zeile immmer noch entfernen. Aber so erspart man sich böse Überaschungen.

Aber zu deinem Problem. In deinem Fall würde ich es so machen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var
  MyString: String;
begin
  if ListBox1.Items.Count = 0 then 
  begin
    if InputQuery('Geben Sie bitte Namen ein''Eingabeaufforderung', MyString) then
    begin 
      if Trim(MyString) = '' then Exit //Eventuell eine Mitteilung
        else 
      begin
        ListBox1.Items.Add(MyString);
        ListBox1.Items.ItemIndex := 0// Setzt die Auswahl auf den ersten Item
      end;
    end
      else
    begin
      Exit //Eventuell eine Mitteilung
    end;
  end;

  ...


Das kann man noch verfeinern, aber es reicht zumindest.

_________________
VORSICHT: Ich behersche seit heute die Fünf-Finger-Handflächen-Herz-Explodier-Schlag-Kampf-Technik >:(
delphineuling Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 113

XP
wat dat
BeitragVerfasst: Fr 24.02.06 22:05 
Jo danke das hab ich jetzt alles hinbekommen.