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 gemacht

    if((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
    mit

    bsp->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


Anmelden zum Antworten