Universelle Funktion für verschiedene Objecte: Wie Object absteuern?



  • Hi,
    ich habe sowas wie eine eigene Toolbar mit ca. 10+ Buttons die bei OnClick immer das gleiche machen: Es handelt sich um TImage Objecte.

    -bool togglen
    -abhängig vom bool wert das verwendete Bild ändern.

    Um den Code ein bißchen zu stutzen wollte ich die Funktion generalisieren aber weiss leider nicht wie ich die Information weiterleiten kann sodass ich auch weiss welches Object geklickt wurde um dann das neue Bild draufzukleben.

    Ich habe die Stellen die Wohl modifizierungsbedürftig sind dick gemacht.
    Ich würde die Funktion von der normalen fastcall OnClick Funktion ausrufen.

    z.b:

    void __fastcall TForm1::Img_ImprovementsClick(TObject *Sender)
    {
    char newimagename[256] = "Textures\\Buttons\\improvements_";
    SwitchImageAndToggle(show_improvements, newimagename, [b]TImage ????[/b])
    }
    
    void __fastcall TForm1::Img_ImprovementsClick(TObject *Sender)
    {
            string newimagename = "Textures\\Buttons\\improvements_";
            SwitchImageAndToggle(show_improvements,newimagename.c_str(),[b]Img_Improvements[/b]);
    }
    //---------------------------------------------------------------------------
    
    void TForm1::SwitchImageAndToggle(bool boolean,const char* imgpath, [b]TImage image[/b])
    {
        boolean^=true;
        string temp;
        char TempChar[256];
        sprintf(TempChar, "%s", imgpath);
        temp = TempChar;
    
        if(boolean)
             temp.append("on.jpg");
    else
             temp.append("off.jpg");
    
        [b]image[/b]->Picture->LoadFromFile(ProgramPath+stringTochar(temp));
    }
    

    Ansich ist das sicher sehr einfach aber auch nach einer Weile Forumsuche und Googlen habe ich nichts gefunden was mir weiterhilft. Kann das Problem schlecht mit einem Passenden Stichwort beschreiben.

    Danke vielmals..





  • wenn du den bcb verwendest, dann nimm der einfachheit halber AnsiString, dann kannst du dir ne menge unnuetzen code sparen.

    void __fastcall TForm1::Img_ImprovementsClick(TObject *Sender) 
    {  
      SwitchImageAndToggle(show_improvements, "Textures\\Buttons\\improvements_", Img_Improvements); 
    } 
    
    //--------------------------------------------------------------------------- 
    // Referenz auf Show uebergeben, damit das geaendert werden kann
    // Pfad zur Bilddatei
    // Zeiger auf das Bildobjekt
    //--------------------------------------------------------------------------- 
    void __fastcall TForm1::SwitchImageAndToggle(bool &Show, AnsiString ImgPath, TImage *Image) 
    { 
      if (!Image)
        return;
    
      // Status toggeln
      Show = !Show; 
    
      // Dateiendung je nach Ansicht
      AnsiString FileAppendix = Show ? AnsiString("on.jpg") : AnsiString("off.jpg);
    
      // Bilddatei laden
      Image->Picture->LoadFromFile(ProgramPath  + ImgPath + FileAppendix);
    }
    


  • Hallo

    du must den Parameter Sender des OnClick-Events auswerten.
    Außerdem versteh ich nicht, warum du die String-Behandlung so kompliziertmachst.

    void __fastcall TForm1::Img_ImprovementsClick(TObject *Sender)
    {
      AnsiString newimagename = "Textures\\Buttons\\improvements_";
      TButton *CurrButton = dynamic_cast<TButton *> (Sender);
      TImage *Img_Improvements = ...; // Hier anhand des Buttons das zugehörige Image auswählen, z.B. über TButton->Tag identifiziern
      SwitchImageAndToggle(show_improvements,newimagename.c_str(),Img_Improvements); // Wo kommt der erste Parameter des Aufrufs her?
      }
    //---------------------------------------------------------------------------
    
    void TForm1::SwitchImageAndToggle(bool boolean, Ansistring imgpath, TImage image)
    {
        boolean^=true;
    
        if(boolean)
             imgpath += "on.jpg";
    else
             imgpath += "off.jpg";
    
        image->Picture->LoadFromFile(ProgramPath+imgpath);
    }
    

    bis bald
    akari



  • naja Sender muss er nicht auswerten, da die Buttons ja eigentlich TImage's sind und er einfach dort OnClick ueberschrieben hat. daher kann er das Image direkt uebergeben.



  • danke ihr beiden, klappt super! Besonders gut fand ich das ihr euch die Mühe gemacht habt mir den Code zu modifizieren. Ich muss zugeben dass ich ganz schön mies mit den Strings rumgewurstelt habe.

    Das ich das TImage als Zeiger übergeben muss hätte ich mir auch denken können. 😉

    bis denne
    grey


Anmelden zum Antworten