Mehrere Checkboxen?
-
Mein Computer hat mich nicht lieb!
Habe mir schon gedacht, dass Zeiger ins Spiel kommen werden. Soweit so gut. Irgendwas habe habe ich aber noch nicht bedacht.
if (... != ...) {
GetDlgItem(IDC_...)->SetCheck(TRUE);
oder auch
( (CButton*) GetDlgItem(....) )->SetCheck(TRUE);Er setzt die die Hacken nicht in die Boxen. Enable- bzw. ShowWindow funzt allerdings.
-
Hast du Wertevariablen für die Checkboxen? Dann kann dir ein UpdateData(FALSE) alles wieder durcheinander bringen.
Setz mal einen Breakpoint auf die Zeile und schreib mal, was der Debugger als Rückgabewert von GetDlgItem(....) angibt.

PS: Eigentlich soll man C-Casts in C++ nicht mehr nehmen, sondern an dieser Stelle dynamic_casts, aber du hast ja erstmal ein anderes Problem. Guck dazu bei Gelegenheit mal zur Suche.
-
Nun ja, für die 20 Checkboxen habe ich auch Variablen. Ich dachte mir aber, dass ich die an der Stelle nicht zwingend brauche, wenn ich mit einem Zeiger arbeite (Läuft doch über die ID?). Wenn ich die Hacken in den Checkboxen über die Variablen setzte und dann UpdateData klappt das jedenfalls.
Rückgabewert von GetDlgItem: IDC_... 1002
Da ich später noch eine ganze Reihe checkboxen hinzufügen möchte, will ich es umgehen für jede Checkbox eizeln True oder False zu setzen.
-
Setz bitte mal auf die Zeile wie vorhin einen Breakpoint und in DoDataExchange. Wird der in DDX angesprungen, nachdem der andere dran war und bevor das angezeigt wird - dann hast du einen UpdateData Aufruf drin und der vermurkst dir natürlich alles. Dann musst du entweder die Wertevariablen löschen (magst sie ja sowieso nicht) oder die Reihenfolge ändern.

-
Also ich habe keine Ahnung von DoDataExchange und was ich damit machen soll.
Warum bekomme ich bei ...->SetCheck(TRUE) bzw. Checked eine Fehlermeldung: 'SetCheck' : Ist kein Element von 'CWnd'? Damit seztze ich doch die Checkbox auf TRUE (Hacken)?
-
Schau nochmal in die MSDN: SetCheck ist ein Member von CButton - nicht CWnd.
Du musst also casten. Das hattest du vorhin ja auch schon gemacht.
Hier nochmal so, wie ich es schreiben würde:CButton* pBtn = dynamic_cast<CButton*>(GetDlgItem(IDC_....)); ASSERT(pBtn); // Zur Absturzvermeidung und leichtere Fehlersuche pBtn->SetCheck(TRUE);Wenn du, wie so viele hier das Assert weglassen möchtest, dann kann das auch so aussehen wie du schon hattest - ist nur unsicherer...
-
Nun passiert folgendes:
-> Debug Assertion Failed! Dann drück ich doch mal Ignorieren.
-> Fehler Zugriffsverletzung ....In der Zeile UpdateData bleibt er dann stehen.
In die MSDN hab ich auch schon geguckt (man ist die unübersichtlich). Das CButton und SetCheck war mir schon klar. Nur was versucht man nicht alles für unsinniges Zeugs wenn man nicht mehr weiter weiss!

-
1. Hast du RTTI in den Projekteigenschaften eingeschaltet? Sonst geht dynamic_cast nicht.
2. Drück beim ASSERT mal Wiederholen.
(das ist eine Hilfsmeldung, warum ignorieren die immer alle?
)Wenn er dann in der Zeile steht, die ich vorhin geschrieben habe, ist folgendes passiert:
Du versuchst etwas mit einem Fenster zu machen, was noch gar nicht existiert. Das kann daran liegen, dass CDialog::OnInitDialog noch nicht "durch" ist.3. Steht er woanders, zeig bitte den Code an der Stelle. Also in welcher Klasse, in welcher Funktion und die Zeile mit dem ASSERT.
-
Langsam bin ich richtig gefrustet und habe keinen Bock mehr auf C++. Den ganzen Tag sitz ich schon daran und es geht nichts vorwärts. NERV!
RTTI ist eingeschaltet. => Debug Assertion Failed!
Stehen bleibt er in der Zeile mit dem UpdateData(FALSE) und ein kleines grünes Dreieck erscheint an der Seite (Was auch immer das heissen mag, es ist bestimmt nichts Gutes!).So nun habe ich ein kleines Programm zum testen geschrieben. Ich lese zwei Werte aus der Registry ein (bei mir sind es später Strings aus einer Datei) und will entsprechend die Checkboxen auf True bzw False setzen, je nachdem ob der Dienst ein bzw. audgeschaltet ist:
void Cwcenter_testDlg::OnBnClickedLesen()
{
// Automatische Updates ein/aus?
CRegKey key;
DWORD dwValue;
key.Open( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\wuauserv", KEY_READ);
key.QueryValue( dwValue, "Start");
key.Close();if (dwValue == 4) {
GetDlgItem(IDC_CKAU)->????(TRUE);
}UpdateData(FALSE);
}So und genau das funktioniert eben nicht. Später habe ich viel viel mehr Checkboxen welche ich alle mit den entsprechenden Werten initialisieren muss.
Folgendes würde funktionieren, aber wenn ich das für 100 Checkboxen machen muss scheint mir das etwas mühseelig. Das muss doch effizienter gehen?
if (dwValue == 4) {
m_DAU = TRUE; //Variable für die Checkbox Auto Updates
}
-
In der Funktion brauchst du gar kein UpdataData(FALSE). Sowas brauchst du nur, wenn du mit Wertevariablen arbeitest und das machst du ja nicht.
Und die Zeile
GetDlgItem(IDC_CKAU)->????(TRUE);mach mal so:
((CButton*)GetDlgItem(IDC_CKAU))->SetCheck(TRUE);Wenn es dann immer noch nicht geht, schick mir das mal und ich gucke morgen früh mal drauf.
