Ein Buddy-Feld für SpinControl überwachen?



  • Hi Forum,
    wie kann ich ein BuddyFeld das zu einem SpinControl gehört auf Wert überwachen, ich meine, ich habe das SpinControl so erstellt:

    mySpinCtrl.SetRange(1,31); // Monatstage, min 1 und max 31!
    m_iTag = 1; // Das BuddyFeld, ein normales CEdit Control, ist mit dieser Integer Variable veknüpft, 
    //wird gesetzt beim laden des Dialogs so dass das BuddyFeld mit 1 schon vorbelegt ist!
    

    Leider kann der Benutzer auch den 32 Tag eingeben, ich möchte das wenn ein üngültiger Wert eingegeben wird das BuddyFeld,
    auf 1 zurückgesetzt wird, es geht um TaskPlaner, beim Original Windows TaskPlaner ist es auch so!
    Wer kann mir da helfen, wo muß die überwachung stattfinden??
    Ich möchte nicht unbedingt den ClassWizard benutzen um den Wingabewert zu beschränken!
    danke
    mirsad



  • Ich würde für das Eingabefeld eine Funktion für die Nachricht EN_UPDATE einfügen und darin die Variable überwachen.



  • Hallo Panschev,
    würde ich ja gerne, nur das dies Fehler verursacht, so hab ich das versucht:

    // im OnInitDialog()
    
    m_SpinTag.SetRange(1,31); // 1 bis 31 Tage im Monat
    m_iTag = 1; // das ist das CEdit Feld das mit dem Spin verbunden ist, gleich mit 1 vorbelegen
    

    Dann in der Update so versucht:

    void CTaskDlg::OnUpdateBuddytag()
    {
     // m_iTagBuddy ist Controlvariable (Buddy)
     if(m_iTagBuddy.GetModify())
    	{
    		UpdateData(TRUE);
                       // m_iTag ist der Wert der im Editfeld steht, 
                       // heist das ich für ein Element 2 Variablen hab
                       // einmal als CEdit: m_iTagBuddy und einmal als Integer: m_iTag
                      // vieleicht ist das auch falsch, denn ich benutze ja nicht das : m_iTagBuddy.SetWindowText(text);
                      // sondern direkt über die m_iTag???
    		if(m_iTag < 1 || m_iTag > 365)
    		{
    			m_iTag = 1;
    			UpdateData(FALSE);
    		}
    	}
    }
    // so hat es fast geklapt, mit dem Unterschied das beim öffnen des Dialogs
    // Fehlermeldung kommt: Debug Assertion Failed, 
    // wenn ich die Eigenschaft von dem Spin: SetBuddyInteger deaktiviere dann ist
    // auch die weg aber dann had das Buddyfeld keine Werte mehr!
    

    Ich hab eigendlich schwierigere Aufgaben erledigt, das hab ich mir als
    spielerei aufgehoben für das ende des Projekts!!! 😕 🤡, und jetzt so was!!!
    mfg
    mirsad



  • gut, ich programmiere ja seit anfang diesem januar 🙄 , vieleicht hab ich die EN_UPDATE falsch eingesetzt???



  • Ich bin selbst Anfänger :). So müsste es klappen:

    void CTaskDlg::OnUpdateBuddytag()
    {
     UpdateData(TRUE);
     if(m_iTag < 1 || m_iTag > 365)
     {
         m_iTag = 1;
         UpdateData(FALSE);
     }
    }
    


  • Hi panschev,
    leider Fehlermeldung: Debug Assertion Failed, beim debuggen zeigt mir er mit auf diese Zeilen in der dlgdata.cpp:

    void AFXAPI DDV_MinMaxUInt(CDataExchange* pDX, UINT value, UINT minVal, UINT maxVal)
    {
    	ASSERT(minVal <= maxVal);
    	if (value < minVal || value > maxVal)
    		_AfxFailMinMaxWithFormat(pDX, minVal, maxVal, _T("%I64u"),
    //------->>>>>>	AFX_IDP_PARSE_INT_RANGE);
    }
    

    Die Anweisungen UpdateData(); machen Probeme, es wird einfach zu früh verwendet, wenn ich die deaktiviere dann gibts keine Fehlermeldungen, aber auch kein Efekt!! 😞
    mfg
    mirsad



  • Na dann, neuer Versuch ohne UpdateData() 🙂

    void CTaskDlg::OnUpdateBuddytag()
    {
     m_iTag = GetDlgItemInt(DIE ID DEINES EINGABEFELDS);
     if(m_iTag < 1 || m_iTag > 365)
     {
         SetDlgItemText(DIE ID DEINES EINGABEFELDS, "1");
     }
    }
    


  • Hi Panschev,
    vielen Dank so funktioniert es! 👍
    Gruß
    Mirsad



  • eigentlich habe ich gedacht dass das OnInitDialog() wo ich die erstmalige vorbelegung mit 1 des Buddyfeldes vornehme zurest ausgeführt wird, und dann erst alle anderen Dialog und Kontrolls Eigenschaften geprüft werden so wi EN_UPDATE oder EN_CHANGE, ähm so wie im beispiel Code:

    BOOL CTaskDlg::OnInitDialog()
    {
     CDialog::OnInitDialog();
    ...
    ...
    ....
    // usw.
    // jetzt:
    m_SpinTag.SetRange(1,365); // Spin(Drehfeld)
    m_iTag = 1; // int Variable die mit dem Buddyfeld varknüpt ist
    
    ..
    ..
    ..
    
    }
    
    // und dan irgendwo im Quelltext die überprüfung auf Wert mit 
    // EN_UPDATE oder EN_CHANGE 
    
    void CTaskDlg::OnUpdateBuddytag() 
    {
     // hier den Inhalt des Buddys prüfen!
     // darum habe ich gedacht das das mit dem UpdateData() oder GetWindowText()
     // funktionieren kann! Aber der Wert wird geprüft bevor das Dialog überhaupt 
     // geladen wird, dann natürlich Fehler, weil zu dem Zeitpunkt im Buddy ja 
     // garnichts steht  :confused: und ein Hinweis das eine unzulässige Operation
     // vesucht wurde!!!  :( 
    }
    

    Sorry leute aber das hab ich jetzt rauslassen müssen! 🙂
    mfg
    Mirsad


Anmelden zum Antworten