Toon posts:

[vc++]Data vanuit een dialog naar een datastructuur.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi, ik ben bezig met een programmaatje en ik loop tegen een naar probleem aan. Mijn programma moet een soort van competitie manager worden. Nu wil ik met behulp van een dialogbox een nieuwe competitie kunnen toevoegen. Ik heb de layout van de dialog gemaakt en met een callback procedure is ook de functionaliteit aardig gelukt.
Er is een list, een edit vakje en knoppen voor toevoegen aan, verwijderen uit en leegmaken van de lijst. Dat gaat allemaal prima, echter wanneer ik op de OK knop klik zou ik toch willen dat de informatie uit de list ergens terecht komt. Bij voorkeur in een class Competition waarin een array of vector van strings zit. De callback procedure moet echter static zijn dus het probleem is eigenlijk hoe krijg ik dan toch die data in die class.

Ik had zelf bedacht om een globale variabele te maken met een pointer naar mn competitie, maar dat leek me nogal lelijk en ik kon me haast niet voorstellen dat er geen mooiere en betere oplossingen zijn.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07-05 10:04
Een level abstraction erbij :)

Maak een Competition Class waar de UI de data in kan pompen. Bij het openen van je dialog geef je een referentie mee naar het object waar je de data in wil hebben.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MisterData
  • Registratie: September 2001
  • Laatst online: 06-05 16:16
Je kunt ook bij het maken van een window (ik denk een dialog ook?) eventueel een pointer in de GWL_USERDATA stoppen (met SetWindowLong(hWnd, GWL_USERDATA, (LONG)jepointer);) dat gebruik ik nogal eens als ik classes+windows ga gebruiken om zo een hWnd aan een bepaalde controller-class te hangen :)

Uiteraard haal je em daarna weer op met GetWindowLong(hWnd, GWL_USERDATA);

[ Voor 12% gewijzigd door MisterData op 26-04-2005 17:29 ]


  • Obliterator
  • Registratie: November 2000
  • Laatst online: 30-04 16:09
Welke omgeving werk je mee? Pure win32 API, of MFC of iet anders?
Is het uberhaupt onder Windows?

[ Voor 98% gewijzigd door Obliterator op 26-04-2005 17:36 ]


Verwijderd

Topicstarter
het is inderdaad in windows, pure API. Ik zal voor de duidelijkheid even de code posten.

competition.h
code:
1
2
3
4
5
6
7
8
9
10
11
#include "windows.h"

class Competition {
private:
    int nTeamCnt ;
    char* teams[32] ;
    static BOOL CALLBACK newCompDlgProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) ;
    
public:
    Competition () ;
} ;


competition.cpp
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "competition.h"

#include "resource.h"

BOOL CALLBACK Competition::newCompDlgProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    int len ;
    char* cBuf ;
    int index ;

    switch (msg) {
        case WM_INITDIALOG :
            return TRUE ;
            break ;
        case WM_COMMAND :
            switch (LOWORD (wParam)) {
                case IDC_OK :
                    EndDialog (hWnd, IDC_OK) ;
                    break ;
                case IDC_CANCEL :
                    EndDialog (hWnd, IDC_CANCEL) ;
                    break ;
                case IDC_ADD :
                    len = GetWindowTextLength (GetDlgItem (hWnd, IDC_EDIT)) ;
                    if (len>0) {
                        cBuf = (char*) GlobalAlloc (GPTR, len+1) ;
                        GetDlgItemText (hWnd, IDC_EDIT, cBuf, len+1) ;
                        SendDlgItemMessage (hWnd, IDC_LIST, LB_ADDSTRING, 0, (LPARAM) cBuf) ;
                        GlobalFree ((HANDLE) cBuf) ;
                        SetDlgItemText (hWnd, IDC_EDIT, "") ;
                    }
                    break ;
                case IDC_REMOVE :
                    index = SendDlgItemMessage (hWnd, IDC_LIST, LB_GETCURSEL, 0, 0) ;
                    if (index != LB_ERR) {
                        SendDlgItemMessage (hWnd, IDC_LIST, LB_DELETESTRING, index, 0) ;
                    }


                    break ;
                case IDC_CLEAR :
                    SendDlgItemMessage (hWnd, IDC_LIST, LB_RESETCONTENT, 0, 0) ;
                    SetDlgItemText (hWnd, IDC_EDIT2, "0") ;
                    break ;
                case IDC_IMPORT :
                    MessageBox (hWnd, "Deze actie is nog niet beschikbaar", "info", MB_OK) ;
                    break ;
            }
            break ;
        default:
            return FALSE ;
    }
    return TRUE ;
}

Competition::Competition () {
    int ret = DialogBox (GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_NEWCOMP), NULL, newCompDlgProc) ;
}


Ik begrijp volgens mij wel ongeveer wat farlane bedoelt, maar ik zie het in de praktijk nog niet helemaal voor me.