Membervariablen als Array m_XXX[...]



  • Kann man Membervariablen in MSVC++6 mittels Assistent als Array m_XXX[...] anlegen? Z.B., wenn man Folgendes erreichen möchte:

    void CMembervariablen_mit_ArrayDlg::OnButton1() 
    {
    	for(int i=1; i<=4; ++i) m_B[i].SetWindowText("");
    	m_B[1].SetWindowText("geklickt");
    }
    
    void CMembervariablen_mit_ArrayDlg::OnButton2() 
    {
    	for(int i=1; i<=4; ++i) m_B[i].SetWindowText("");
    	m_B[2].SetWindowText("geklickt");
    }
    
    void CMembervariablen_mit_ArrayDlg::OnButton3() 
    {
    	for(int i=1; i<=4; ++i) m_B[i].SetWindowText("");
    	m_B[3].SetWindowText("geklickt");
    }
    
    void CMembervariablen_mit_ArrayDlg::OnButton4() 
    {
    	for(int i=1; i<=4; ++i) m_B[i].SetWindowText("");
    	m_B[4].SetWindowText("geklickt");
    }
    

    Bisher muss man "händisch" die vom Assistenten angelegten Membervariablen z.B. m_Button1 gegen m_Button[1] tauschen und die Definition im Header der Klasse entsprechend anpassen, also z.B. alle m_Button1, m_Button2, ... löschen und durch m_Button[5] (z.B.: 5 = 4 Buttons + 1 ) ersetzen. Das ist aber lästig und bei komplexen Systemen auch fehlerträchtig.



  • Afaik geht das nicht (ich lasse mich aber gerne eines Besseren beleeren).

    btw, warum verschwendest du denn Platz? Wenn du nur 4 Buttons hast, brauchst du auch nur ein 4-elementiges Array zu reservieren.



  • Man zählt aus logischen Gründen manchmal bevorzugt von 1 bis n anstelle 0 bis n-1; daher lieber n+1 Platz anlegen, bevor es klemmt. Soviel Platz muss sein!



  • Und was passiert dann bei

    m_B[5].SetWindowText("geklickt");
    

    ?


  • Administrator

    connan schrieb:

    Und was passiert dann bei

    m_B[5].SetWindowText("geklickt");
    

    ?

    Bei ihm wäre das wohl eher so:
    was passiert bei

    m_B[0].SetWindowText("geklickt");
    

    ^^

    Und zudem wir sind in der Programmierung und Informatik, da ist es eher logisch, dass man von 0 bis n-1 zählt, alles andere ist doch nur normal denkendes Volk 😃

    Grüssli



  • Wie so oft hier: Thema verfehlt! 👎
    Geht das jetzt mit dem Assi oder nicht, wenn nein, warum eigentlich nicht?


  • Administrator

    CStoll hat es ja oben geschrieben dass es nicht geht. Ich weiss auch nichts davon, dass es geht. Und wieso nicht? Frag Microsoft!

    Grüssli



  • Man muss die Arrays jeweils außerhalb des Assistentenbereichs händisch selbst anlegen und pflegen (geht leicht), weil sich sonst der Parser verschluckt.
    Beispiel:

    //im Header:
    // Dialogfelddaten
    	//{{AFX_DATA(CSAPI001Dlg)
    	enum { IDD = IDD_SAPI001_DIALOG };
    	CEdit	m_ctlEdit1;
    	FooButton	m_ctlButtonKBDelay3;
    	FooButton	m_ctlButtonKBDelay2;
    	FooButton	m_ctlButtonKBDelay1;
    	FooButton	m_ctlButtonKBDelay0;
    	FooButton	m_ctlButtonKBFast;
    	FooButton	m_ctlButtonKBMiddle;
    	FooButton	m_ctlButtonKBSlow;
    
    	CSliderCtrl	m_ctlSpeed;
    	CSliderCtrl	m_ctlVolume;
    	CButton	m_ctlButton_Stimme;
    
    	CButton	m_ctlButton_Clear;
    	CButton	m_ctlButton_Speak;
    	CString	m_Edit1;
    	CString	m_Edit_Statuszeile;
    	int		m_Speed;
    	int		m_Volume;
    	//}}AFX_DATA
    
    	FooButton	m_ctlButtonKat[7]; //außerhalb AFX_DATA
    	FooButton	m_ctlButton_Nr[11];
    //....
    
    //Implementierung:
    void CSAPI001Dlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CSAPI001Dlg)
    	DDX_Control(pDX, IDC_BUTTONKBDELAY3, m_ctlButtonKBDelay3);
    	DDX_Control(pDX, IDC_BUTTONKBDELAY2, m_ctlButtonKBDelay2);
    	DDX_Control(pDX, IDC_BUTTONKBDELAY1, m_ctlButtonKBDelay1);
    	DDX_Control(pDX, IDC_BUTTONKBDELAY0, m_ctlButtonKBDelay0);
    	DDX_Control(pDX, IDC_EDIT1, m_ctlEdit1);
    	DDX_Control(pDX, IDC_BUTTONKBFAST, m_ctlButtonKBFast);
    	DDX_Control(pDX, IDC_BUTTONKBMIDDLE, m_ctlButtonKBMiddle);
    	DDX_Control(pDX, IDC_BUTTONKBSLOW, m_ctlButtonKBSlow);
    	DDX_Control(pDX, IDC_SLIDER_SPEED, m_ctlSpeed);
    	DDX_Control(pDX, IDC_SLIDER_VOLUME, m_ctlVolume);
    	DDX_Control(pDX, IDC_BUTTON_VOICE, m_ctlButton_Stimme);
    	DDX_Control(pDX, IDC_BUTTON_CLEAR, m_ctlButton_Clear);
    	DDX_Control(pDX, IDC_BUTTON_SPEAK, m_ctlButton_Speak);
    	DDX_Text(pDX, IDC_EDIT1, m_Edit1);
    	DDX_Text(pDX, IDC_EDIT_STATUSZEILE, m_Edit_Statuszeile);
    	DDX_Slider(pDX, IDC_SLIDER_SPEED, m_Speed);
    	DDX_Slider(pDX, IDC_SLIDER_VOLUME, m_Volume);
    	//}}AFX_DATA_MAP
    
            //außerhalb AFX_DATA_MAP
    	DDX_Control(pDX, IDC_BUTTON_KAT6, m_ctlButtonKat[6]);
    	DDX_Control(pDX, IDC_BUTTON_KAT5, m_ctlButtonKat[5]);
    	DDX_Control(pDX, IDC_BUTTON_KAT4, m_ctlButtonKat[4]);
    	DDX_Control(pDX, IDC_BUTTON_KAT3, m_ctlButtonKat[3]);
    	DDX_Control(pDX, IDC_BUTTON_KAT2, m_ctlButtonKat[2]);
    	DDX_Control(pDX, IDC_BUTTON_KAT1, m_ctlButtonKat[1]);
    
    	DDX_Control(pDX, IDC_BUTTON_NR10, m_ctlButton_Nr[10]);
    	DDX_Control(pDX, IDC_BUTTON_NR9, m_ctlButton_Nr[9]);
    	DDX_Control(pDX, IDC_BUTTON_NR8, m_ctlButton_Nr[8]);
    	DDX_Control(pDX, IDC_BUTTON_NR7, m_ctlButton_Nr[7]);
    	DDX_Control(pDX, IDC_BUTTON_NR6, m_ctlButton_Nr[6]);
    	DDX_Control(pDX, IDC_BUTTON_NR5, m_ctlButton_Nr[5]);
    	DDX_Control(pDX, IDC_BUTTON_NR4, m_ctlButton_Nr[4]);
    	DDX_Control(pDX, IDC_BUTTON_NR3, m_ctlButton_Nr[3]);
    	DDX_Control(pDX, IDC_BUTTON_NR2, m_ctlButton_Nr[2]);
    	DDX_Control(pDX, IDC_BUTTON_NR1, m_ctlButton_Nr[1]);
    }
    

    Es ist erstaunlich, dass dieses praktische Feature im Assistenten fehlt.


Anmelden zum Antworten