Button aktivieren nach str_Eintrag
-
ich möchte wenn ich in einem eingabefeld m_str_SN1 eine 11 eingegeben habe, das der button IDOK aktiv wird. vorher soll er deaktiviert sein. was mach ich falsch ?
BOOL CRegistrierungDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Zusätzliche Initialisierung hier einfügen SetWindowText(" Registrierung"); SetIcon(m_hIcon, true); UpdateData(false); UpdateData(true); if (m_str_SN1 == "11") { GetDlgItem(IDOK)->EnableWindow(true); } else { GetDlgItem(IDOK)->EnableWindow(false); } UpdateData(false); return TRUE; }
-
Lass das UpdateData(false) weg.
Und evtl. lohnt es sich die Killfocus für das Editfeld zu überschreiben,
und dort das ein/ausschalten des Buttons zu erledigen.Devil
-
du, ganz langsam , bin erst seid 2 monaten am programmieren. bitte etwas genauer
-
also soweit hab ichs gelöst.
void CRegistrierungDlg::OnChangeSn1() { // TODO: Wenn dies ein RICHEDIT-Steuerelement ist, sendet das Steuerelement diese // Benachrichtigung nicht, bevor Sie nicht die Funktion CDialog::OnInitDialog() // überschreiben und CRichEditCrtl().SetEventMask() aufrufen, wobei // eine ODER-Operation mit dem Attribut ENM_CHANGE und der Maske erfolgt. // TODO: Fügen Sie hier Ihren Code für die Benachrichtigungsbehandlungsroutine des Steuerelements hinzu UpdateData(true); if (m_str_SN1 =="11") { GetDlgItem(IDOK)->EnableWindow(true); } else { GetDlgItem(IDOK)->EnableWindow(false); } UpdateData(false); }nun hab ich nurnoch den fehler das wenn nichts im eingabefeld steht beim ersten aufruf ist der button trotzdem aktiv
-
habs gelöst:
BOOL CRegistrierungDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Zusätzliche Initialisierung hier einfügen UpdateData(true); m_str_SN1 =""; if (m_str_SN1 =="") { GetDlgItem(IDOK)->EnableWindow(false); } SetWindowText(" Registrierung"); SetIcon(m_hIcon, true); UpdateData(false); return TRUE; } void CRegistrierungDlg::OnChangeSn1() { UpdateData(true); if (m_str_SN1 =="11") { GetDlgItem(IDOK)->EnableWindow(true); } else { GetDlgItem(IDOK)->EnableWindow(false); } UpdateData(false); }
-
Wie wärs mit:
BOOL CRegistrierungDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Zusätzliche Initialisierung hier einfügen UpdateData(true); m_str_SN1 =""; OnChangeSn1(); SetWindowText(" Registrierung"); SetIcon(m_hIcon, true); UpdateData(false); return TRUE; }Warum machst du eigentlich UpdateData(TRUE)? Ich kann da keinen Sinn erkennen.
Und das m_str_SN1 = ""; wäre doch im Konstruktor besser aufgehoben.
Außerdem werden CStrings von ihrem eigenen Konstruktor mit "" initialisiert. Du kannst das also sogar weglassen.
EDIT:
Achja, du kannst die Beschriftung in der Titelzeile eines Dialoges auch im Resourcceeditor festlegen.
Genauso kannst du dort festlegen ob ein Control zu Beginn aktiviert oder deaktiviert sein soll. (Statt SetWindowText und OnChangeSn1 in OnInitDialog.)
-
wenn ich das nicht einbaue
UpdateData(true); m_str_SN1 =""; if (m_str_SN1 =="") { GetDlgItem(IDOK)->EnableWindow(false); }ist der IDOK button beim 1. aufrufen des dialogs sichtbar
konstruktor ? hilf mir mal auf die sprünge, bin ja anfänger
-
Konstruktoren sind die Funktionen, die keinen Rückgabewert haben und genauso heißen wie die Klasse selbst. Sie werden aufgerufen sobald du eine Instanz dieser Klasse anlegst.
CRegistrierungDlg dlg;Sämliche Variablen, die sich nicht über den eignenen Konstruktor selbst mit einem gültigen Wert initialisieren sollten dort einen Wert bekommen.
Guck mal in ein Buch zu OOP Grundlagen (C++ und nicht MFC), da drin wird das erklärt.

Was mich auch iritiert:
m_str_SN1 =""; // Mach es leer if (m_str_SN1 =="") // ist es wirklich leer? { GetDlgItem(IDOK)->EnableWindow(false); }Das ist doch (harmlos ausgedrückt) doppelt gemoppelt. lass die if weg.
m_str_SN1 =""; GetDlgItem(IDOK)->EnableWindow(false);Das mit UpdateData finde ich komisch, aber wenn du es sagst...
-
aha, ok. vielen dank. werde es gleich mal ausprobieren.
