Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - case of anweisung erst nacheinander
ultraz06 - Di 27.01.09 19:54
Titel: case of anweisung erst nacheinander
hi ich habe folgendes problem ich will dass wenn ich einen mausklick mache ein image verschwindet
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:
| procedure tform1.munition; var n:integer; image:integer; anz:integer; begin anz:=5 ; anz:=anz+1; for n:=0 to anz do begin begin case n of 0: begin image1.visible:=false; image2.visible:=true; image3.visible:=true; image4.visible:=true; image5.visible:=true; end; 1: begin image2.visible:=false; image1.visible:=false; image3.visible:=true; image4.visible:=true; image5.visible:=true; end; if image1.visible=false then 1; |
also soll nach jedem einzelnen mausklick ein image verschwinden nach dem jetzigen quelltext vrschwinden aber beide images 1&2
die munition procedure habe ich in eine timer routine gesetzt
Moderiert von
Narses: Topic aus Multimedia / Grafik verschoben am Di 27.01.2009 um 22:02
Delete - Di 27.01.09 20:04
Wie ich bereits im anderen Thread gesagt hatte: ich verstehe Deinen Code überhaupt nicht. Wozu die Schleife? Wo steht das mit dem ButtonClick bzw. wieso nutzt Du nicht das entsprechende Event? Was meinst Du mit "beide" Images, ich seh 5 davon im Code?
Tachoron - Di 27.01.09 20:08
Ich glaube du solltest dich nocheinmal in den Grundlagen vertraut machen,
denn das was du so geschrieben hast wird nicht zum Ziel führen.
In deinem Fall durchläufst du nunmal in der Schleife alle case-Fälle und führst
dementsprechend den gesamten Code aus.
Da aber nur bei jedem Klick etwas passieren soll, darfst du auch nur einmal
wenn der Klick ausgelöst wird ein Bild verschwinden lassen. Dafür brauchst du keine Schleife sondern musst nur global speichern wieviele Bilder noch sichtbar sind.
Gruß
ultraz06 - Di 27.01.09 20:18
also es sind 5 patronen wie bei einem moorhuhnspiel
bei jedem mausklick soll eine patrone ,als image dargestellt, verschwinden.
mit der schleife wollte ich die image anzahl von 0 auf 5 zählen und bei jedem punkt der case of anweisung ein image verschwinden lassen
nun will ich die bedingugn einbauen das wenn imagex.visible=false erst dann der 2 punkt aus der case of anweisung setzen soll
Horschdware - Di 27.01.09 20:36
Mein Tip wie immer:
schreibe erst einmal Pseudocode und werde dir darüber klar, was das Programm machen soll, bevor du anfängst Code zu schreiben. Dann Schaut das ungefähr so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Programmstart: zähler auf 5 setzen alle bilder anzeigen -----
Mausklick: ein bild verdecken zähler verringern ----
Unterproblem "bild verdecken": wenn zähler = 5 => bild 5 verdecken wenn zähler = 4 => bild 4 verdecken ... ----- |
Ich möchte mich übrigens meinen Vorrednern anschliessen, dass du dir dringend nochmals die Grundlagen ansehen solltest.
MfG
ultraz06 - Di 27.01.09 20:46
ja und wie kann ich das verwirklichen?
Delete - Di 27.01.09 20:53
Schau Dir mal ein Set (=Menge) an. Da kannst Du Elemente einfügen und rauslöschen.
jaenicke - Di 27.01.09 20:56
ultraz06 hat folgendes geschrieben : |
| ja und wie kann ich das verwirklichen? |
Versuche es doch erst einmal. Wie soll man auf eine so allgemeine Frage sinnvoll antworten? Frage direkt. Zum Beispiel "Wie kann ich denn etwas direkt nach dem Programmstart ausführen?", die Antwort wäre "Das geht mit OnCreate, klicke einfach doppelt auf das Formular, dann bist du in dem Code für das Ereignis.".
Aber ohne konkrete Frage weiß ich nicht was ich überhaupt erklären muss...
DeddyH hat folgendes geschrieben : |
| Schau Dir mal ein Set (=Menge) an. Da kannst Du Elemente einfügen und rauslöschen. |
Das könnte eher für noch mehr Verwirrung sorgen glaube ich. ;-) Auch wenn es natürlich passend ist.
ultraz06 - Di 27.01.09 20:57
wenn ich das aufgreifen will
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| Programmstart: zähler auf 5 setzen alle bilder anzeigen -----
Mausklick: ein bild verdecken zähler verringern ----
Unterproblem "bild verdecken": wenn zähler = 5 => bild 5 verdecken wenn zähler = 4 => bild 4 verdecken ... |
dann weiß ich nicht wie ich den quelltext gestalten soll
Horschdware - Di 27.01.09 21:10
ultraz06 hat folgendes geschrieben : |
wenn ich das aufgreifen will
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| Programmstart: zähler auf 5 setzen alle bilder anzeigen -----
Mausklick: ein bild verdecken zähler verringern ----
Unterproblem "bild verdecken": wenn zähler = 5 => bild 5 verdecken wenn zähler = 4 => bild 4 verdecken ... |
dann weiß ich nicht wie ich den quelltext gestalten soll |
Überlegungen in Kommentaren
ultraz06 - Di 27.01.09 21:15
Programmstart: // wie komme ich in den Code-Abschnitt, der bei Programmstart aufgerufen wird?
zähler auf 5 setzen // wie realisiere ich einen zähler? welcher datentyp eignet sich? welche werte kann dieser zähler annehmen?
alle bilder anzeigen // wieviele bilder habe ich? wie zeige ich ein bild an?
-----
Mausklick: // wie komme ich in den Code-Abschnitt, der bei Mausklick aufgerufen wird?
ein bild verdecken
zähler verringern // wie verringere ich den Wert eines Zählers um 1?
----
Unterproblem "bild verdecken":
wenn zähler = 5 => bild 5 verdecken // wie prüfe ich, welchen wert mein zähler hat? wie verstecke ich ein bild?
wenn zähler = 4 => bild 4 verdecken
in programmstart mit form1.create
meine variable zb i:=5;
alle imeges auf visible true setzen;
maus klick in dem fall paintbox1.click
i:=i-1;
beim unterproblem bin ich überfragt :D
Horschdware - Di 27.01.09 21:19
if..then..else..
jaenicke - Di 27.01.09 21:24
Wenn i dein Zähler ist:
Delphi-Quelltext
1: 2: 3: 4:
| Image1.Visible := i >= 1; Image2.Visible := i >= 2; Image3.Visible := i >= 3; ... |
So blendest du die Bilder ein, wenn der Zähler noch genauso groß oder größer als die Nummer des Bildes ist.
DaKirsche - Di 27.01.09 21:29
Also was du jetzt gerade machst ist ja nun folgendes:
Du hast einen Timer, den du startest, wenn eine "Kugel abgefeuert" wurde, oder nicht?
In diesem Timer startest du die procedure TForm1.munition.....
D.h.:
Jedesmal, wenn du abfeuerst wird das ganze Magazin abgefeuert, weil du in der Prozedur munition folgende Schritte machst:
Du initialisierst deine Variablen...
Delphi-Quelltext
1: 2: 3:
| var n:integer; image:integer; anz:integer; |
...legst die Anzahl der Kugeln fest und erhöhst die nochmal um 1?!?!?...
und dann machst du bei JEDEM "Schuss"...
Delphi-Quelltext
1: 2:
| for n:=0 to anz do begin |
die Prüfung, ob n = 0, 1, ... ist...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| case n of 0: begin image1.visible:=false; image2.visible:=true; image3.visible:=true; image4.visible:=true; image5.visible:=true; end; 1: begin image2.visible:=false; image1.visible:=false; image3.visible:=true; image4.visible:=true; image5.visible:=true; end; |
und dann lässt du die Bilder verstecken....
In Worten macht dein Quellcode folgendes:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Setze Anzahl auf 5; Erhöhe Anzahl um 1;
Für JEDEN Wert zwischen einschliesslich 0 und einschliesslich 6 als n prüfe nacheinander, ob n = 1 ist. wenn ja: verstecke Kugel 1 wenn nein: prüfe, ob n = 2 ist. wenn ja: verstecke Kugel 1 UND Kugel 2 [...] Wenn n bei 6 angekommen ist beende die Prozedur |
Was du machen solltest ist eher sowas:
In Worten macht dein Quellcode folgendes:
Quelltext
1: 2: 3: 4: 5: 6:
| Lese Anzahl ein (z.B. von einer globalen oder übergeordneten Variable o.ä.);
Wenn Anzahl kleiner oder gleich der Magazingröße ist verstecke die Kugeln, die verschossen sind (z.B. wie im Beitrag von jaenicke beschrieben)
Ansonsten zeige an, dass nachgeladen werden muss |
Erst wenn die Prozedur bei n = 6 angekommen ist wird dir das Ergebnis angezeigt...
Also nutzt du eine "Waffe", die pro Betätigung des Abzugs ein ganzes Magazin verschiesst....
Das wäre ja mal Munitionsverschwendung ;)
ultraz06 - Di 27.01.09 21:33
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure tform1.munition; var n:integer; image:integer; anz:integer; begin anz:=5 ; anz:=anz-1;
Image1.Visible := i >= 1; Image2.Visible := i >= 2; Image3.Visible := i >= 3; |
muss ich da noch ne schleife rein bauen die anz runterzählt?
DaKirsche - Di 27.01.09 21:38
ultraz06 hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure tform1.munition; var n:integer; image:integer; anz:integer; begin anz:=5 ; anz:=anz-1;
Image1.Visible := i >= 1; Image2.Visible := i >= 2; Image3.Visible := i >= 3; |
muss ich da noch ne schleife rein bauen die anz runterzählt? |
Die
markierten Zeilen gehören da nicht rein....
Du setzt jedes Mal, wenn die Prozedur aufgerufen wird...also bei jedem Schuss, die anzahl wieder auf 5 und ziehst dann einen ab....
Also wird anz immer 4 sein.
ausserdem solltest du statt i anz mit 1, 2 oder so vergleichen....i hast du doch garnicht in der Prozedur definiert...
//Edit: Die Variale anz musst du von woanders holen und in munition immer nur um 1 runterzählen.
bei einer Prozedur oder Funktion nachladen als Beispiel füllst du die Munition wieder auf und machst alle Munitionsbilder wieder sichtbar.
Delete - Di 27.01.09 21:47
Definiere anz als privates Feld der Klasse TForm1 und setz sie im OnCreate auf 5.
ultraz06 - Di 27.01.09 21:49
so wie kann die festlegeung der anzahl auf 5 in eine andere procedure legen das sie nicht ständig auf 5 gefixt wird?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure tform1.munition; var anz:integer; begin anz:=5 ; anz:=anz-1;
Image1.Visible := anz >= 1; Image2.Visible := anz >= 2; Image3.Visible := anz >= 3; |
Moderiert von
Narses: Delphi-Tag repariert
Delete - Di 27.01.09 21:50
Guck mal einen Post höher ;)
jaenicke - Mi 28.01.09 03:48
Ich kann auch nur den Crashkurs empfehlen...
http://crashkurs.christian-stelzmann.de
Es bringt doch nix irgendwas zusammenzukopieren ohne zu verstehen was die Zeilen jeweils machen...
Wenn du etwas von dem Quelltext nicht verstehst, dann musst du das erstmal herausfinden. Du kannst ja auch fragen, wenn du das nicht selbst herausbekommst.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!