Member-Variable zu einer Steuerelement ID



  • Hallo,

    Anfängerfrage:
    Wie kann ich mir zu einer Steuerelement-ID eines Dialogs die zugehörige Member-Variable holen?

    Ich suche also etwas in der Art:

    pEdit->GetMemberVariable(IDC_EDIT1);
    


  • Soweit ich weiß: Gar nicht.
    Was hast du vor? Mit GetDlgItem kriegst du einen Zeiger auf das Control, den du nur noch casten musst. Das ist sowas ähnliches...

    Schick mal *GetDlgItem* durch die Forensuche, dann solltest du reichlich Beispiele bekommen. 🙂



  • Hem, also casten usw. ist schlechter Stil und ist Fehleranfällig. Was ist wenn sich der Typ des Controlls irendwann ändert? Dann bekommt man keinen Compiler-Fehler sondern einen Laufzeitfehler -> viel Spaß beim Bug suchen! 😃

    Leg dir in deinen Dialog einen Membervariable an, geht am einfachsten mit dem Klassenassi. Und dann erstellst du dir eine Get-Methode, die dir den richten Wert zurück gibt.



  • Artchi, dafür gibts doch dynamic_cast - das gibt dir NULL. Musste nur noch artig prüfen und schon ist das auch nicht mehr so gefährlich. 😉



  • Aber selber prüfen vergisst man gerne mal. 😉



  • estartu schrieb:

    dafür gibts doch dynamic_cast

    Dazu wird aber RTTI benötigt... und wenn Du schon MFC verwendest (welche kein RTTI benötigt), dann kannst Du auch einfach "IsKindOf" aufrufen... das geht auch ohne RTTI...

    OT: Oder am besten .NET, da hat man Reflection...



  • Jochen Kalmbach schrieb:

    estartu schrieb:

    dafür gibts doch dynamic_cast

    Dazu wird aber RTTI benötigt... und wenn Du schon MFC verwendest (welche kein RTTI benötigt), dann kannst Du auch einfach "IsKindOf" aufrufen... das geht auch ohne RTTI...

    Stimmt, das hattest du hier doch grade erst irgendwo geschrieben.

    Naja, ich habs nunmal mit dynamic_cast gelernt - was drin ist, ist drin. 😉



  • Zunächst mal danke für die vielen Antworten. Ist ja in eine regelrechte Diskussion ausgeartet, das war eigentlich nicht beabsichtigt 😉

    Da mich eure Antworten leider noch nicht wirklich weiter bringen (teilweise auch ein wenig überforderen) beschreibe ich noch einmal ein wenig detaillierter, was ich vorhabe:

    Ich habe einen Dialog mit einigen Drehfeldern samt zugehörigen Buddies/Eingabefeldern, die int-Werte enthalten. Nach Betätigung eines Buttons möchte ich in einer Schleife auf die in den Buddies eingetragenen Werte zugreifen. Dazu hatte ich mir folgendes überlegt:
    Ich habe die Eingabefelder mit fortlaufenden IDs versehen (kann sie also in der Laufvariablen der Schleife inkrementieren), jedem Feld eine Member-Variable zugewiesen und würde mir jetzt gerne den Wert der Member-Variablen über die ID des entsprechenden Feldes holen.

    Artchi schrieb:

    Leg dir in deinen Dialog einen Membervariable an, geht am einfachsten mit dem Klassenassi.

    Genau das habe ich also bereits getan.

    Artchi schrieb:

    Und dann erstellst du dir eine Get-Methode, die dir den richten Wert zurück gibt.

    ...und genau daran scheitere ich.

    estartu schrieb:

    Was hast du vor? Mit GetDlgItem kriegst du einen Zeiger auf das Control, den du nur noch casten musst.

    Einen solchen Zeiger bekomme ich doch folgendermaßen:

    CEdit* pEdit = (CEdit*) GetDlgItem(IDC_EDIT1);
    

    Soweit so gut, allerdings ist mir unklar, wie ich über diesen Zeiger an die Member-Variable komme bzw. direkt auf den eingetragenen int-Wert zugreife. Wenn ich mir die Class Members von CEdit anschaue, verstehe ich nicht, welche Methode mich hier weiterbringt.

    Edit:
    Ich glaube, jetzt habe ich doch etwas gefunden. Mit:

    GetDlgItemInt(IDC_EDIT1);
    

    scheint das zu funktionieren. Vielleicht kann mir trotzdem nochmal jemand sagen, ob das eine gute/korrekte/sinnvolle Vorgehensweise ist...



  • CEdit* pEdit = (CEdit*) GetDlgItem(IDC_EDIT1);
    

    Wie von mir bereits gesagt, casten macht man dann, wenn man schlechtes Design hat oder es wirklich nicht anders geht. Ich bin der Meinung, das du hier etwas machst, was nicht nötig ist. Warum willst du dieses Element haben? Weil du es außerhalb von deinem Dialog benutzen bzw. lesen willst, richtig?

    Dafür solltest du dir eine Getter Methode in deinem Dialog bauen, bei dem du auch nicht mehr casten muß:

    class CMyDialog : public CDialog 
    {
    private:
        CEdit m_ctlMyEdit; // IDC_EDIT1
    public:
        const CEdit& GetMyEdit()
        {
            return m_ctlMyEdit; 
        }
    };
    

    Wenn sich dein CEdit irgendwann mal z.B. zu einem... sagen wir mal CButton ändert, wird dir der Compiler Fehlermeldungen ausspucken, für alle Codestellen die GetMyEdit() benutzen. Und dann kannst du reagieren. Mit deiner cast-Vorgehensweise wird dir der Compiler keine einzige Meldung ausspucken, zur Laufzeit würde es aber ein cast Exception geben, die im schlimmsten Fall nur dann auftritt, wenn man eine bestimmte Programmfunktion aufruft.


Anmelden zum Antworten