PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Variable ignoriert Änderung


WhiteVelvet
2006-04-24, 16:52:52
Ich habe eine GUI-Hauptklasse mit einer protected Variablen, die ich mittels einer Set-Methode von aussen setzen kann. Problem ist nur, dass das Setzen zwar funktioniert, aber danach wieder der alte Wert angenommen wird. Was mache ich falsch?

Gast
2006-04-24, 18:18:22
Könntest du den Code vielleicht mal posten?

Xmas
2006-04-24, 18:24:32
Ins Blaue geraten: Lokale Variable gleichen Namens verdeckt die Membervariable.

Neomi
2006-04-24, 19:13:04
class Dings
{
private:
int Wert;

public:
void Set (int Wert)
{
Wert = Wert; // falsch, Parameter wird neu gesetzt
this->Wert = Wert; // richtig, Member wird gesetzt
}
};

Entweder eine lokale Variable oder ein Parameter. Parameter sind ja eigentlich auch nichts anderes als lokale Variablen, die von außen vorinitialisiert wurden.

ScottManDeath
2006-04-24, 23:01:36
In der MFC gibts noch die Methoden Update(true/false) welches das GUI mit den Membern synchronisiert. Wenn Du das falsch machst, kann es sein, das Dir beim nächsten Call von Update() die Member mit den GUI Werten überschrieben werden.





Mein Beileid dass Du VC6 und MFC nehmen musst :comfort:

WhiteVelvet
2006-04-24, 23:09:14
Mein Beileid dass Du VC6 und MFC nehmen musst :comfort:

Danke ;)

Die Variable ist nur ein einziges Mal deklariert, also kann man Überdeckung ausschliessen. Code ist schwer zu posten, weils zuviel ist, wer weiss wo der Fehler steckt. Ich schau morgen mal wegen des Update(), sonst melde ich mich nochmal.

EDIT: Habe den Fehler gefunden. In der externen Klasse habe ich ausversehen eine Instanz der Hauptklasse erstellt... klar, dass die Variable "im Original" dann nicht gespeichert wird...

WhiteVelvet
2006-04-25, 16:02:52
... oder auch nicht gefunden. Ich dachte, ich hätte den Fehler, aber es klappt immernoch nicht :( Hier mal etwas Code:

Aus dem Hauptprogramm:

BOOL CToolboxApp::InitInstance()
{
AfxEnableControlContainer();

#ifdef _AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
#endif

CToolboxDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK) // exit program via the close button
{
// do nothing
}

return FALSE;
}



Aus dem GUI-Header:

public:
void CToolboxDlg::setEnabledBitmaps(int pos, int value);
...
protected:
int enabledBitmaps[BITMAPCOUNT];
...


Aus der GUI-cpp

void CToolboxDlg::setEnabledBitmaps(int pos, int value)
{
enabledBitmaps[pos]=value;
}


Aus der externen Klasse:

void myDialog1::OnCheck1()
{
CToolboxDlg test;
if (m_buttonCheck1.GetCheck() == 1)
test.setEnabledBitmaps(0,1);
else
test.setEnabledBitmaps(0,0);
}


Ich wünschte ich wüsste was ich falsch mache...

ScottManDeath
2006-04-25, 17:19:08
Bist Du mal im Debugger durchgesteppt?



AFAIK muss man Update() aufrufen, wenn man aus einem GUI Element was auslesen will, da erst die Daten von den Windows Controls in die C++ Klassen übertragen werden müssen.

WhiteVelvet
2006-04-25, 17:37:26
Das ist es ganz sicher nicht. Wo tausche ich denn im obigen Code Daten mit der GUI aus? Nein, mein Problem ist im Moment, dass ich irgendwas mit diesem dlg machen muss, ich komme bloss nicht drauf, was...

Gast
2006-04-25, 19:28:21
EDIT: Habe den Fehler gefunden. In der externen Klasse habe ich ausversehen eine Instanz der Hauptklasse erstellt... klar, dass die Variable "im Original" dann nicht gespeichert wird...

Die Vermutung ist schon richtig.
Mit CToolboxDlg test; erzeugst du eine neue Instanz vonCToolboxDlg.


Aus der externen Klasse:

void myDialog1::OnCheck1()
{
CToolboxDlg test;
if (m_buttonCheck1.GetCheck() == 1)
test.setEnabledBitmaps(0,1);
else
test.setEnabledBitmaps(0,0);
}

WhiteVelvet
2006-04-25, 19:38:18
Ich muss einen Pointer auf dlg bekommen, aber ich weiss nicht wie :(

Ich bin nun soweit:


CPMDToolboxDlg dlg;
m_pMainWnd = &dlg;
m_pDialog1 = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK) // exit program via the close button
{
// do nothing
}

return FALSE;


Das klappt aber nicht, weil
1) m_pDialog1 unbekannt ist, obwohl in myDialog.h deklariert
2) ich myDialog1.h nicht includen darf, weil ich es schon an anderer Stelle included habe

Gast
2006-04-25, 21:05:23
Das Problem ist doch das myDialog1 die Information nicht hat.
Wo rufst du den den auf?

Kannst du ihm den Pointer nicht übergeben? per Set
Ist das vll ein Unterdialog von CToolboxDlg ?