Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » controls array -> IDs bekommen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.05.2007, 19:19 Uhr
Lensflare



Halllo.

Ich habe eine dialogbasierte MFC anwendung und diese soll sehr viele Controls (zB Textfelder) enthalten.
Da diese Controls fast die selben Aufgaben erfüllen, lege ich sie in einem array an.

Um die Controls aus der Design-Ansicht im code zu "binden", könnte man jetzt für jedes Control im array folgendes machen:

C++:
a[0] = (CEdit*)GetDlgItem(IDC_EDIT1);
a[1] = (CEdit*)GetDlgItem(IDC_EDIT2);
a[2] = (CEdit*)GetDlgItem(IDC_EDIT3);
...


aber das ist umständlich, unflexibel und fehleranfällig. Besonders bei mehrdimensionalen arrays.

gibt es dafür etwas praktisches... vielleicht dass man die IDs in einem array erstellen lässt sodass man sowas machen kann:

C++:
for(int i=0; i<anzControls; i++)
  a[i] = (CEdit*)GetDlgItem(IDC_EDIT[i]);



Danke.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.05.2007, 19:55 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi,
wenns nur um Benachrichtigungen geht: ON_CONTROL_RANGE, die DDX-Teile gibts leider nicht für Arrays.

Ansonsten:

resource.h öffnen und deine Steuerelement-IDS neu sortieren - also


C++:
IDC_EDIT1 10000
IDC_EDIT2 10001



(keine IDs doppelt!)

usw.

dann kannste


C++:
for(int i=0; i<anzControls; i++)
  a[i] = (CEdit*)GetDlgItem(IDC_EDIT1+i);



schreiben. Sowas kannste natürlich dann auch in den DDX-Funktion schreiben, um z.b deine Member mit den Steuerelementen zu verknüpfen.
--
class God : public ChuckNorris { };

Dieser Post wurde am 23.05.2007 um 19:56 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.05.2007, 20:19 Uhr
Lensflare



was ist DDX?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.05.2007, 16:56 Uhr
mmc20
puss in boots


wird in DoDataExchange(..) benutzt

C++:
    DDX_Control(pDX, IDC_FILTER_KUNDE, m_cXEdits[filterKunde]);
    DDX_Control(pDX, IDC_FILTER_ARTIKEL, m_cXEdits[filterArtikel]);
    DDX_Control(pDX, IDC_FILTER_DRAWNR, m_cXEdits[filterDrawNr]);
    DDX_Control(pDX, IDC_FILTER, m_cXEdits[filterAll]);


hab ich auch schon oft so gemacht, und in .h

C++:
public:
    enum xEditIndex { firstEdit = 0,
        filterKunde = 0, filterArtikel, filterDrawNr, filterAll,
        fieldProgID, fieldArtikel, fieldDrawNr, fieldDrawIndex, fieldSonstIdent, fieldInfo,
        lastEdit
    } _xEditIndex;

    CEdit    m_cXEdits[lastEdit];


zugreifen kannste dann zB

C++:
    for ( int i = firstEdit; i < lastEdit; i++ )
        m_cXEdits[i].SetFont( &m.cfEdits );



übrigens ist deine variante nicht gerade gut, da GetDlgItem(..) nur ein temporäres object zurückgibt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.05.2007, 17:43 Uhr
Lensflare




Zitat von mmc20:
übrigens ist deine variante nicht gerade gut, da GetDlgItem(..) nur ein temporäres object zurückgibt.
Was meinst du mit temporär? Bzw. was wäre besser?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.05.2007, 17:49 Uhr
mmc20
puss in boots



MSDN:

CWnd::GetDlgItem  
CWnd* GetDlgItem( int nID ) const;

void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;

Return Value

A pointer to the given control or child window. If no control with the integer ID given by the nID parameter exists, the value is NULL.

[i]The returned pointer may be temporary and should not be stored for later use.[/i]


das heisst das der pointer irgendwann ungültig wird, und nicht mehr auf dein CEdit zeigt.

die bessere lösung ist imho über die DDX'es

Dieser Post wurde am 24.05.2007 um 17:50 Uhr von mmc20 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.05.2007, 20:37 Uhr
Lensflare



ok. danke für den Hinweis. Ich habs jetzt mit DDX gemacht und es geht auch
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: