Abfragen in schleife



  • Unsauber: Du setzt die IDs in der resource.h von Hand hintereinander.
    Dann kannst du mit for und GtDlgItem arbeiten.

    Sauber: Du machst ein Array, das du abläufst.
    Entweder eines mit den IDs oder gleich eines mit den CButton*.

    🙂

    PS: Steck das in eine Funktion, der du Name, Buffer und path übergibst.
    Und den Namen kann man auch in ein const Array stopfen. 😉



  • da faellt mir ein einfall ein

    ein struct mit nem array

    static const struct
    {
        CButton cbCheckbox;
        UINT uiItemID;
        UINT uiItemString;
    }items[]=
    {				
        m_One,    IDC_CBONE,    IDS_ONE,
        m_Two,    IDC_CBTWO,    IDS_TWO,
        m_three,  IDC_CBTHREE,  IDS_THREE,
    };
    const int iSize = sizeof(items) / sizeof(items[0]);
    

    und dann mit einer schleife die creates aufrufen, die strings und weiss der geier, kann das array ja erweitern
    was haltet ihr von dieser idee ?

    CString csText = _T("");
    for(int i=0; i<iSize; i++)
    {
        csText.LoadString(items[i].uiItemString);
        items[i].cbCheckbox.Create(csText, CBSTYLES, rect, this, items[i].uiItemID)
    }
    


  • hmm - funzt doch irgendwie nicht so wie ich das moechte - mein problem is es in die View klasse zu kapseln /=



  • Sag mal genauer, was nicht klappt.



  • Eventuell solltest du anstelle von Kopien deiner CButtons lieber Referenzen oder Zeiger darauf in das Array packen.



  • estartu schrieb:

    Sag mal genauer, was nicht klappt.

    die deklaration und initialation des ganzen

    wenn ich nur

    static const struct
    {
        CButton m_Button;
        UINT m_CBId;
        UINT m_CBName;
    }m_sCheckBoxes[];
    

    in der klasse deklarier - meckert er wegen der leeren klammer [] aber auhc wenn ich da einen festen wert eintrag kann ich im konstruktor keine werte zuweisen /=



  • Erstens ist es vermutlich nicht erwünscht, das Array statisch zu machen (außer du bist dir sicher, nur eine Instanz der Klasse anzulegen).

    Zweitens initialisiert man statische Elemente nicht im Konstruktor, sondern seperat:

    class View
    {
      static const struct Button_data
      {
        CButton m_Button;
        UINT m_CBId;
        UINT m_CBName;
      }m_sCheckBoxes[];
      ...
    }
    
    const struct View::Button_data View::m_sCheckBoxes = {...};
    

    (wenn du das Array nicht-statisch machst, müsstest du es in einer Schleife im Ctor befüllen)

    Drittens solltest du mal über meinen letzten Beitrag nachdenken. In deinem Array landen Kopien der Membervariablen.



  • ich weiss, wenn die buttons vorher shcon in der klasse deklariert wurden - nur ich moechte das die buttons NUR in der struct deklariert werden

    deinen beispielcode kann cih ne ganz nachvollziehen

    static const struct Button_data
    {
        CButton m_Button;
        UINT m_CBId;
        UINT m_CBName;
    }m_sCheckBoxes[];
    

    in der klasse ist klar, aber die zuweisungen funktionieren nie

    const struct CFR2View::Button_data CFR2View::m_sCheckBoxes =
    {
    

    = 'm_sCheckBoxes' : redefinition; different type modifiers

    hab auch schon andere varianten probiert
    {die zeile hab ich global in der dazugehoerigen cpp datei direkt nach dem konstruktor}



  • class View
    {
        static const struct Button_data
        {
            CButton &m_Button;
            UINT m_CBId;
            UINT m_CBName;
        };
    };
    const struct View::Button_data m_sCheckBoxes[] =
    {
        View::m_One, ID_ONE, IDS_ONE,
        View::m_Two, ID_TWO, IDS_TWO,
        View::m_Three, ID_THREE, IDS_THREE,
    };
    

    nun sagt er "unresolved external symbol" fuer jeden button ?!



  • Mr Evil schrieb:

    ich weiss, wenn die buttons vorher shcon in der klasse deklariert wurden - nur ich moechte das die buttons NUR in der struct deklariert werden

    Dann solltest du vermutlich nur das Array als nichtstatisches Element der Klasse anlegen (und alle Vorkommen von m_One etc durch m_sCheckBoxes[x].m_Button im Quelltext ersetzen*).

    deinen beispielcode kann cih ne ganz nachvollziehen

    Sorry, mein Fehler - ans Ende der Definition sollten auch die Array-Klammern []

    * Oder du setzt ein paar #defines dafür unter die Klassendeklaration:

    #define m_One m_sCheckBoxes[0].m_Button;
    #define m_Two m_sCheckBoxes[1].m_Button;
    ...
    

    Aber in Zusammenarbeit mit dem Klassenassistenten solltest du lieber die Buttons so lassen und in deinem Array drauf verweisen.



  • die einzigste deklaration in der schleife funzt auch nicht

    class View
    {
        struct Button_data
        {
            CButton m_Button;
            UINT m_CBId;
            UINT m_CBName;
        };
    };
    struct View::Button_data m_sCheckBoxes[] =
    {
        CButton m_One, ID_ONE, IDS_ONE,
        CButton m_Two, ID_TWO, IDS_TWO,
        CButton m_Three, ID_THREE, IDS_THREE,
    };
    

    = 'CButton' : illegal use of this type as an expression
    ohne m_One usw sagt er selbstverstaendlich das er m_One usw nicht kennt


  • Mod

    Man kann keine statische liste (denn m_sCheckBoxes ist static) mit membern eines nicht statischen Objektes initialisieren! Wie sl das gehen. Jedes View Objekt hat doch seine eigenen Member m_one... etc.

    Warum überhaupt die m_one, m_two Variablen verwenden?
    Einfach nur die ID in den Array und in der Schleife GetDlgCtrl verwenden und den cast auf CButton*. Wenn die Items noch per Create erzeugt werden müssen dann eben einen Array von Buttons definieren und nur den Index verwenden.



  • Ja, innerhalb des Arrays brauchst du auch die Bezeichner nicht mehr. Schließlich sprichst du die Buttons dort über ihren Index an.

    PS: Übrigens ist es imho nichtmal nötig, die Buttons selber in dem Array einzulagern - du hast dort die IDs und kannst dir per GetDlgItem() die zugehörigen Buttons besorgen:

    struct Button_Data
    {
      UINT m_ID;
      UINT m_Name;
    };
    
    Button_Data Buttons[] = {...};
    
    ...
    for(int i=0;i</*Größe des Arrays*/;++i)
    {
      iCfg = dynamic_cast<CButton*>(pView->GetDlgItem(Buttons[i].m_ID))->GetCheck();
      csBuffer.Format(_T("%d"),iCfg);
      csName.LoadString(Buttons[i].m_Name);
      WritePrivateProfileString(_T("CheckBoxes"),csName,csBuffer,path);
    }
    

    WritePrivateProfileInt



  • also das hab ich bisher

    in der klasse

    class CView
    {
        CButton m_One;
        CButton m_Two;
        CButton m_Three;
    
        struct Button_data
        {
            CButton &m_Button;
            UINT m_CBId;
            UINT m_CBName;
        };
        int m_iSize;
    

    und in der OnCreate funktion

    int CView::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        Button_data m_sCheckBoxes[] =
        {
            m_One,   ID_ONE,   IDS_ONE,
            m_Two,   ID_TWO,   IDS_TWO,
            m_THREE, ID_THREE, IDS_THREE,
        };
        m_iSize = sizeof(m_sCheckBoxes) / sizeof(m_sCheckBoxes[0]);
    
        for(int i=0; i<m_iSize; i++)
        {
            m_sCheckBoxes[i].m_Button.Create(m_cLocalization.LoadLocalizedString(m_sCheckBoxes[i].m_CBName), CBSTYLES, rect, this, m_sCheckBoxes[i].m_CBId);
        }
    }
    

    so funzt alles - das Create wirft brav 1 zurueck - was mich aber stoert ist das diese struktur nur lokal bekannt ist - sobald ich es bekannt machen will das ich es in allen moeglichen funktionen benutzen kann bekomm ich probleme }=

    danke fuer die gute hilfe {=



  • mein gedanke war, die zuweisung in eine eigene funktion auszulagern, da hab ich aber dann auch ein problem

    global zuweisen geht nicht, wenn ich es in eine funktion auslager brauch ich noch eine ziel variable, da weiss ich nicht wie ich die anleg

    ps. wenn ich das mit den GetDlgItem mach wirfts immer eine exception, vermutlich weil das objekt noch nicht mit create erstellt wurde, und genau das moechte ich ja auch machen


Anmelden zum Antworten