Problem mit Timer



  • Hallo,
    ich versuche gerade nach einer Eingabe in ein Edit-Feld einen Trigger zu feuern. Also es kommen innerhalb von vielleicht 0,2 Sekunden Zeichen in dem Editfeld an, und ich will wenn alles da is den gesamten String automatisch ohne Button oder so verarbeiten. Nun weis ich nicht, wie ich es realisiere, dass der Timer ca. 05 Sekunden wartet, währenddessen aber das Editfeld weiter befüllt werden kann. Wenn der Timer abgelaufen ist, soller OnButtonAbschicken() ausführen, wodurch der ganze String verarbeitet wird.
    Hab ja nun schon hier und da ein paar Beispielcodes gesehen und bisher hab ich das so ein wenig zusammengefrickelt

    void CScannerfixDlg::OnChangeEdit1() 
    {
    
    	SetTimer(1, 500, 0);
    
    }
    

    und:
    BEGIN_MESSAGE_MAP(CScannerfixDlg, CDialog)
    //{{AFX_MSG_MAP(CScannerfixDlg)
    ON_BN_CLICKED(IDC_BUTTON_ABSCHICKEN, OnButtonAbschicken)
    ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
    ON_WM_TIMER(OnButtonAbschicken)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    Aber das funzt nicht ganz so, wie ich das gerne hätte.
    Also wenn SetTimer abgelaufen is, schickt er WM_Timer los und das fange ich ab. Aber das Abfangen funktioniert anscheinend so nicht, und ich hab das gefühl, dass wenn der Timer "läuft" oder "zählt" das ganze Programm blockiert ist.
    Fällt jemandem evtl. dazu was brauchbares ein?
    Liebe Grüße
    Basti



  • Aber das Abfangen funktioniert anscheinend so nicht,

    Was heisst das?



  • das sagt der Compiler dazu:
    too many actual parameters for macro 'ON_WM_TIMER'
    und in der Hilfe gibts das Makro nich...


  • Mod

    Korrekt! ON_WM_TIMER kanst Du nicht mit einem eigenen Handler überlagern.
    Der Makro erwartet keinen Funktionsnamen.
    Dein Handler muss so aussehen

    void CMyClass::OnTimer(UINT nIDEvent)
    ...
    


  • Ich hab noch einmal etwas rumprobiert:
    Wenn der BarcodeScanner was in das Editfeld reinschreibt feuert zumindest schonmal der Trigger und die Messagebox wird ausgegeben. Es wird auch OnButtonAbschicken() ausgeführt, jedoch wird der Timer nicht gestoppt. Also jede Sekunde kommt eine neue Messagebox und der "Button" wird neu gedrückt. Wie stoppe ich jetzt den Timer?

    BEGIN_MESSAGE_MAP(CScannerfixDlg, CDialog)
    	//{{AFX_MSG_MAP(CScannerfixDlg)
    	ON_BN_CLICKED(IDC_BUTTON_ABSCHICKEN, OnButtonAbschicken)
    	ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
    	ON_WM_TIMER(nIDEvent)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    

    bzw.:

    BEGIN_MESSAGE_MAP(CScannerfixDlg, CDialog)
    	//{{AFX_MSG_MAP(CScannerfixDlg)
    	ON_BN_CLICKED(IDC_BUTTON_ABSCHICKEN, OnButtonAbschicken)
    	ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
    	ON_WM_TIMER()    //warning, dass sonst zuviele Parameter übergeben werden
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    class CScannerfixDlg : public CDialog
    {
    // Construction
    public:
    	CScannerfixDlg(CWnd* pParent = NULL);	// standard constructor
    
    // Dialog Data
    	//{{AFX_DATA(CScannerfixDlg)
    	enum { IDD = IDD_SCANNERFIX_DIALOG };
    	CStatic	m_static_menge;
    	CStatic	m_static_gewicht;
    	CStatic	m_static_port;
    	CStatic	m_static_ip;
    	CListBox	m_listbox_ausgabe;
    	CEdit	m_edit_eingabe;
    	//}}AFX_DATA
    
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CScannerfixDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
    	//}}AFX_VIRTUAL
    
    // Implementation
    protected:
    	HICON m_hIcon;
    
    	// Generated message map functions
    	//{{AFX_MSG(CScannerfixDlg)
    	virtual BOOL OnInitDialog();
    	afx_msg void OnButton1();
    	afx_msg void OnButtonAbschicken();
    	afx_msg void OnChangeEdit1();
    	afx_msg void OnTimer(UINT);
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    

    und:

    void CScannerfixDlg::OnTimer(UINT nIDEvent) 
    {
    	MessageBox(_T("OnTimer"),_T("Timer"),MB_OK);
    	KillTimer(nIDEvent);
    	OnButtonAbschicken();
    
    }
    

  • Mod

    Vor der MessagebOx natürlich den KillTimer!

    Was nützt er denn nach der MessageBox?



  • man kann übrigends auch mit einem eigenen handler auf den timer reagieren...
    im messagemap:

    ON_MESSAGE(WM_TIMER, OnMyTimerMessage)
    

    dann:

    afx_msg LRESULT OnMyTimerMessage(WPARAM,LPARAM);
    

    dann wird allerdings auf alle timer reagiert, wenn man mehrere hat 😉



  • Supi, danke, das funktioniert soweit, jetzt hat sich nur leider noch n kleines Problem ergeben:

    OnChange feuert ja immer, wenn Edit1 verändert wird.
    Nun wird aber dummerweise innerhalb des OnButtonAbschicken() das Editfeld gelöscht, damit die nächste Eingabe kommen kann. Gibt es eine Möglichkeit den inhalt des Editfeldes zu leeren, OHNE dass der OnChange-Trigger losgeht?
    Weil ich kann mir nicht vorstellen wie ich das sonst machen kann.
    Liebe Grüße
    Basti


  • Mod

    Es gibt viele!
    Die einfachste ist, Du setzt Dir ein Flag das sagt: "Dieser Change Event ist nichts für Dich!"


Anmelden zum Antworten