Variable im Namen eines Objekts / einer Methode



  • Hallo,
    eigentlich eine einfache Frage, aber ist sehr schwer danach zu suchen und etwas aussagekräftiges zu finden:

    Ich habe ein GUI erstellt mit sehr vielen Eingabefeldern (Dropboxen und Textboxen)
    zum Auslesen verwende ich z.B diesen Code

    MarshalString(cb_A1->SelectedItem->ToString(),a);
    			gpio_A1.set_funtion(a);
    			gpio_A1.set_gpio("A1");
    			if (a=="Not Used" || "Peripherie")
    			{
    				cb2_A1->Enabled=false;
    				tb_A1->Enabled=false;
    			}
    			if (a=="GPIO")
    			{
    				cb2_A1->Enabled=true;
    				tb_A1->Enabled=true;
                                }
    

    soweit soeinfach.

    Das selbe brauche ich jetzt für cb_A1 bis cb_A16, cb2_A1 bis cb2_A16 und tb_A1 bis tb_A16.

    Ich könnte natürlich in jeden Eventhandler diesen Code kopieren und die Zahlen verändern,
    aber dachte mir dass es doch auch eine Möglichkeit geben muss, wie ich diese Methode so verändere, dass die Zahl eine Variable ist,
    und der Methode beim Aufruf übergeben wird.

    Sitze jetzt schon ne Weile an google, Büchern, und dem Compiler, aber habe leider noch keine Möglichkeit gefunden, die funktioniert.

    Wäre für jeden Lösungshinweis sehr dankbar.
    Merci schonmal fürs durchlesen !



  • ganz easy 😉

    entweder selber zusammenbauen (solange die zahl einstellig ist:

    char buffer[32] = "cb_Ax"; // x platzhalter für die ziffer
    
    const unsigned pos = 4;
    
    unsigned neue_ziffer = 8;
    
    buffer[pos] = neue_ziffer + '0'
    

    => "cb_A8

    gibt auch eine funktion dafür (geht auch mit zahlen):

    char buffer[32];
    
    unsigned neue_zahl = 25521;
    
    sprintf(buffer, "cb_A%d", neue_zahl); // %d ist der platzhalter
    

    => "cb_A25521"

    mit %c kannst du auch buchstaben ersetzen


  • Administrator

    @helferlein,
    1. Er braucht nicht einen String, sondern eine Variable, welche so heisst.
    2. Bitte das nächste Mal C++ Funktionen im C++ Forum vorschlagen.

    @zitroneneis,
    Wo ist das Problem?

    void foo(TypeVon_cb_Ax& cbAx, TypVon_cb2_Ax& cb2Ax, TypVon_tb_Ax tbAx)
    {
      // ...
    }
    

    Da ich die Typen nicht kenne, habe ich mal Pseudonamen verwendet. Aber du solltest die Typen schliesslich kennen, nehme ich an. Und womöglich reicht sogar die Übergabe eine const Referenz.

    Grüssli

    PS: Wenn du aus allen Variablen Listen machen würdest, wäre die Handhabung womöglich deutlich einfacher!



  • also vielen Dank schonmal für die Antworten.

    @helferlein

    ich bin mir nicht sicher ob du mich richtig verstanden hast (oder ich deine Lösung nicht verstehe) aber:

    ich habe 16 Dropboxen die durchnummeriert sind.
    Jedesmal wenn in eine dieser 16 Dropboxen was verändert wird, muss die selbe
    Verarbeitung der Daten erfolgen.

    So in etwa

    MarshalString((cb_A1)->SelectedItem->ToString(),a);
    			gpio_A1.set_funtion(a);
    			gpio_A1.set_gpio("A{b}");
    			if (a=="Not Used" || "Peripherie")
    			{
    				cb2_A1->Enabled=false;
    			.........
    }
    

    dasselbe bei der nächsten Box

    MarshalString((cb_A2)->SelectedItem->ToString(),a);		
    			gpio_A2.set_funtion(a);
    			gpio_A2.set_gpio("A{b}");
    			if (a=="Not Used" || "Peripherie")
    			{
    				cb2_A2->Enabled=false;
    			........
                            }
    

    dasselbe bei der nächsten Box

    MarshalString((cb_A3)->SelectedItem->ToString(),a);
    			gpio_A3.set_funtion(a);
    			gpio_A3.set_gpio("A{b}");
    			if (a=="Not Used" || "Peripherie")
    			{
    				cb2_A3->Enabled=false;
    				.............
                            }
    

    Da der Code noch deutlich länger ist dachte ich nur es wäre schön,
    wenn ich ihn nicht 16 mal kopiere und nur die Zahlen austausche, sondern das ganze verallgemeinere.

    @Dravere

    das was du gepostet hast hört sich schon ganz gut an aber klappt bei mir (sofern ich deine Lösung richtig verstehe leider auch nicht ganz)

    Soll ich der Methode einfach Referenzen auf meine Objekte übergeben ?
    Ich habs mal so probiert:

    void set_function(System::Windows::Forms::ComboBox cb_Ax,
    System::Windows::Forms::ComboBox cb2_Ax, 
    System::Windows::Forms::MaskedTextBox tb_Ax)
    		{
    			string a;
    			MarshalString(cb_Ax->SelectedItem->ToString(),a);
                            ..............
                    }
    

    Hierbei ist es aber so, dass ich wenn ich dann

    cb_Ax->
    

    schreibe, die Fehlermeldung

    IntelliSense: '. oder -> Falsch verwendet'

    angezeigt wird (ich benutze in diesem Fall VisalStudioExpress2008 von MS)

    Irgendjemand ne Idee ?



  • Ganz einfach: Pack die Checkboxes in ein Array, eine Hashmap etc. etc.

    Das was du willst geht so in C++ nicht. C++ ist statisch getyped. Es gibt z.b. auch kein eval(), was einen String an Befehlen ausführen kann.



  • hab nochmal ein bisschen rumprobiert, und jetzt klappt das so wie ich das will. (soweit ich das bis jetzt überprüft habe)

    der code falls es jemand interessiert:

    void set_function(System::Windows::Forms::ComboBox^cb_Ax,
    System::Windows::Forms::ComboBox^cb2_Ax, 
    System::Windows::Forms::MaskedTextBox^ tb_Ax)
    		{		
    			string a;		
    			MarshalString(cb_Ax->SelectedItem->ToString(),a);
    			gpio_A[b].set_funtion(a);
    			if (a=="Not Used" || "Peripherie")
    			{
    				cb2_Ax->Enabled=false;
    				tb_Ax->Enabled=false;
                            }
                     }
                     ................
    

    und im jeweiligen Eventhandler

    private: System::Void cb_A7_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e) 
                     {
    			 set_function(cb_A7,cb2_A7,tb_A7);
    		 }
    

    Tausend Dank für die Unterstützung !


Anmelden zum Antworten