VC++, ODBC, MySQL, Member-Variablen und Dialoge

thekona

Mitglied
Hi Leute !

Problem:

Ich realisiere gerade ein Projekt, in dem ich eine MFC-Anwendung erstellt und mittels ODBC mit MySQL verbunden habe.
Ich habe einen Haupt-Dialog, in dem ich meine Werte aus der Datenbank(ID, Vorname,Nachname,Geburtstag,eMail,Telefonnummer) ausgeben lassen, neu anlegen oder löschen kann.
Wie stelle ich es jetzt an, in einem von mir erstellten Dialog die m_ID etc. Variablen mit den EDIT-Feldern zu verknüpfen ?
 
Du hast 2 Möglichkeiten:
1. Du legst im ClassWizard ganz normal Deine Variablen für die Anzeigeelemente an und füllst sie selber in der OnUpdate-Funktion Deiner Ansicht.
Code:
void CTestODBCView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
  {
  	m_cstrName = m_pSet->m_Name;
  }
2. Du legst im ClassWizard wie unter 1. Deine Variablen für die Anzeigeelemente an. Dann gehst Du zur Funktion DoDataExchange Deiner Ansicht und tauschst dort die automatisch angelegten Variablen gegen Membervariablen Deines Recordsets aus.
Vorher
Code:
void CTestODBCView::-)oDataExchange(CDataExchange* pDX)
           {
           	CRecordView::-)oDataExchange(pDX);
           	//{{AFX_DATA_MAP(CTestODBCView)
           	DDX_Text(pDX, IDC_EDIT_NAME, m_cstrName);
          	//}}AFX_DATA_MAP
           }
Nachher:
Code:
void CTestODBCView::-)oDataExchange(CDataExchange* pDX)
           {
           	CRecordView::-)oDataExchange(pDX);
           	//{{AFX_DATA_MAP(CTestODBCView)
           	DDX_Text(pDX, IDC_EDIT_NAME, m_pSet->m_Name);
           	//}}AFX_DATA_MAP
 }
Die automatisch erzeugten Variablendeklarationen im AFX_DATA-Block im Headerfile kannst Du dann wieder löschen (nicht die Initialisierungen im Konstruktor vergessen!).
P.S.: die Funktion oben heißt DoDataExchange(...).
 
OK.. Beispiel 1:

m_cstrName steht doch für den Namen des Konstruktors,ne?, m_pSet ist klar, m_Name ist demnach der Name der 1. Variable oder der neu angelegten, an die ich etwas übergeben möchte?
 
In meinem Beispiel 1 ist 'm_cstrName' die Variable, die ich mit demClass-Wizard für das Editfeld angelegt habe. 'm_Name' ist eine Membervariable des Recordset. Das Beispiel bedeutet, daß der Wert der Recordset-Membervariablen in die Stringvariable 'm_cstrName' übertragen wird. Das Framework (also das, was an Code in den MFC ist, was Du nicht siehst) sorgt dann dafür, daß mit DoDataExchange(...) der Wert aus m_cstrName im dazugehörigen Editfeld angezeigt wird. Im 2. Beispiel siehst Du, wie das in der DoDataExchange-Funktion aussieht. Der Eintrag
Code:
DDX_Text(pDX, IDC_EDIT_NAME, m_cstrName);
bedeutet, daß der Text aus der Variablen 'm_cstrName' in das Anzeigeelement (hier ein Editfeld) mit der ID 'IDC_EDIT_NAME' übertragen werden soll.
 
So, habe nun beide Möglichkeiten, doch leider ohne Erfolg, ausprobiert..

Mein DoDataExchange sieht folgendermaßen aus:

Code:
void CKonaReminderView::DoDataExchange(CDataExchange* pDX)
{
CRecordView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CKonaReminderView)
DDX_FieldText(pDX, IDC_EDIT_Geburtstag, m_pSet->m_Geburtstag, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_ID, m_pSet->m_Id, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_Nachname, m_pSet->m_Nachname, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_Telefon, m_pSet->m_Telefon_Nummer, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_Vorname, m_pSet->m_Vorname, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_Vorwahl, m_pSet->m_Telefon_Vorwahl, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_eMail, m_pSet->m_eMail_Adresse, m_pSet);
//}}AFX_DATA_MAP

Das Problem scheint zu sein, daß die Variablen aus einer ODBC-Quelle befüllt werden.
Probiere ich nun Möglichkeit 1 oder 2, so sagt er mir jedes Mal, daß ich versuche, eine ungültige Operation durchzuführen. Hmm..

Also die Variablen des neuen Dialogfensters (welches erscheint, wenn ich auf die Schaltfläche "Neu" meines Programmes klicke) heißen z.B. m_neu_Vorname, m_neu_eMail etc..
 
Sieht so eigentlich alles ganz richtig aus. Sogar richtiger als mein Beispiel, da ich gar nicht mehr wußte, daß einem da die Membervariablen des Recordset angeboten werden und dann das Makro ' DDX_FieldText' verwendet wird. Bei mir funktioniert das allerdings. Ich hänge Dir mein Testprojekt mal an, vielleicht hilft Dir das weiter....

P.S.: Bitte nicht auf die Form achten, es ist nur schnell zusammengestoppelt.

Ähem, ich wollte es Dir anhängen, ist aber zu groß. Wenn Du mir Deine Emil-Adresse als persönliche Nachricht schickst, dann schicke ich es Dir so.
 
Zurück