Denkfehler? If Abfrage
-
Ich hab ein Kleines Problem und komm einfach nicht dahinter wo der Fehler ist.
Ich klicke im Menü auf Optionen
//Optionen void __fastcall Tcarrace::optionenClick(TObject *Sender) { // Das Menü wird ausgeblendet menue_ausblenden(hintergrundbild, starten, levelauswahl, optionen, hilfe, beenden, zurueck, highscore); sound(sound_an, sound_off); sound_an->Visible=true; }
Die Funktion sound ruft das hier auf
// Buttons Sound void sound(TImage* sound_an, TImage* sound_off) { sound_an->Picture->LoadFromFile("Images/sound_an.jpg"); sound_off->Picture->LoadFromFile("Images/sound_aus.jpg"); sound_an->Width=290; // Breite = 290 sound_an->Height=50; // Höhe = 50 sound_an->Left=0; // Links = 0 sound_an->Top=270; // Oben = 270 sound_off->Width=290; // Breite = 290 sound_off->Height=50; // Höhe = 50 sound_off->Left=0; // Links = 0 sound_off->Top=270; // Oben = 270 }
So also wenn ich auf Optionen klick soll der Button sound_an auf Visible=true gesetzt werden.
Ich will jetzt den Sound mit der Taste s an und auschschalten und der Button soll sich dadurch immer wechseln
if((Key=='s' || Key=='S') && (sound_an->Visible==true)) { sound_off->Visible=true; sound_an->Visible=false; musik->Stop(); // Musik aus } if((Key=='s' || Key=='S') && (sound_an->Visible==false)) { sound_an->Visible=true; sound_off->Visible=false; musik->Play(); // Musik an }
Aber das funzt einfach nicht...
Finde den Fehler auch nicht.
Bitte um Hilfe
Gruß stetze
-
stetze schrieb:
... kompletter Post zitiert
Was funktioniert nicht? Springt er nicht wie erwartet in die Fälle?
Bist Du mit dem Debugger mal Step by Step durch gegangen und hast Dir die
Werte dabei genau angeschaut?/Edit akari : Bitte keine unnötigen langen Zitate
-
Wenn ich auf Optionen klicke und 's' drücke passiert nichts, also der Button wechselt nicht zu sound_off.
Ich weiß leider net wie der Debugger funktioniert...
-
Hallo
Auf jedenfall fehlt ein else, damit sound_an nicht sofort wieder angeschaltet wird. Du solltest den Block so umstellen :
if (Key=='s' || Key=='S') { if (sound_an->Visible) { sound_off->Visible=true; sound_an->Visible=false; musik->Stop(); // Musik aus } else { sound_an->Visible=true; sound_off->Visible=false; musik->Play(); // Musik an } }
bis bald
akari
-
if((Key=='s' || Key=='S') && (sound_an->Visible==true)) { sound_off->Visible=true; sound_an->Visible=false; musik->Stop(); // Musik aus } if((Key=='s' || Key=='S') && (sound_an->Visible==false)) { sound_an->Visible=true; sound_off->Visible=false; musik->Play(); // Musik an }
Ok, kann auch nicht wirklich funktionieeen. Schau Dir doch mal genau an, was passiert. Die erste if-Bedingung wird nur ausgeführt, wenn sound_an sichtbar ist. dann wird die Soundwiedergabe gestoppt. Bei der zweiten if-Bedingung ist sound_an bereit unsichtbar und die Bedingung ist ebenfalls wahr, also wird die Soundwiedergabe wieder gestartet.
Versuch es mal so:
if(Key=='s' || Key=='S') { sound_off->Visible = !sound_off->Visible; sound_an->Visible = !sound_an->Visible; if (sound_an->Visible) musik->Play(); // Musik an else musik->Stop(); // Musik aus }
Allerdings würde ich nur einen Button verwenden und außerdem die Images nur einemal beim Programmstart in eine ImageList laden und dann immr nur das entsprechende Bild zuweisen.
[EDIT] Ab sofort betrachte ich das nicht mehr als zu langsam, wenn akari vor mit postet, sondern ich betrachte es ab sofort so, dass ich das letzte Wort hab. So. :p
-
danke
habs jetzt so gemachtif((Key=='s' || Key=='S')&&(starten->Visible==false)) { sound_off->Visible = !sound_off->Visible; sound_an->Visible = !sound_an->Visible; if (sound_an->Visible) musik->Play(); // Musik an else musik->Stop(); // Musik aus }
Wie ist das mit der ImageList, ich hab jetzt 18 Bilder ganz normal reingeladen
mitbsp->Picture->LoadFromFile("");
Und mach halt immer wie ichs grad brauch mit visible auf true und false...
ist das mit der image list besser? ^^
-
Aber so funktioniert es jetzt nur ein einziges mal. Und zwar wenn die Musik aus ist, lässt sich sich einschalten, aber nicht mehr ausschalten. Schau Dir noch mal die if-Bedinung in akaris und meinem Beispiel an. Du musst doch an der Stelle gar nicht prüfen, ob die Musik an oder aus ist, da der Buttonzustand einfach getoggelt (gibt es dafür ein deutsches Wort?) wird. Anschließen wird einfach geprüft, ob sound_an sichtbar ist, oder nicht. Wenn er sichtbar ist, wird die Musik abgespielt, sonst gestoppt.
Das Laden der Bilder von der Festplatte mittels LoadFromFile kostet mehr Zeit, als das Laden von Bildern aus dem Speicher mittels ImageList. Schau einfach mal unter TImageList in die Hilfe. Wenn Du nicht klarkommst, mach bitte einen neuen Thread für das neue Thema auf.
Grüße Joe
[EDIT]
Ups, dummer Fehler muss natürlich heisenn:if (sound_an->Visible) musik->Stop(); // Musik aus else musik->Play(); // Musik an
Da, wenn sound_an sichtbar, muss ja die Wiedergabe zur Zeit aus sein und sie soll eingeschaltet werden, wenn man den Button klickt...
-
Hallo
Ja TImageList ist besser da dann die Bilddaten gleich im Programm integriert werden. Du brauchst also die einzelnen Originaldateien nicht mit dem Programm weiterzugeben.
Zu TImageList findest du genug in der BCB-Hilfe und über die Forumssuche.bis bald
akari
-
Joe_M. schrieb:
... getoggelt (gibt es dafür ein deutsches Wort?) ...
Na klar: engl: to toggle - dt: umschalten / hin- und herschalten (lt. leo)
-
Bei einem Tastendruck entstehen immer zwei Interupts, einer beim Drücken und einer beim Loslassen der Taste.
Fang einen der beiden Interups ab, dann sollte es laufen.Gruß Stephan