Funktion zusammenbasteln



  • Erst einmal ein Hallo an alle, ich bin neu hier im Forum und bräuchte Hilfe von erfahrenen Programmierern. Um mal eben zu erklären worum es geht:

    Ich habe ein simples Dialogfeld erstellt mit drei EditControl Feldern. Darin soll mal ein Key eingegeben werden. Das Eingeben (nur Großbuchstaben und Zahlen) funktioniert soweit, wird etwas anderes eingegeben so erscheint eine Fehlermeldung.

    Jetzt habe ich im Prinzip für jedes der drei Eingabefelder die selbe Lösung verwendet, würde das aber gerne auslagern und meiner Meinung nach bieten sich dann Übergaben in Form von Referenzen an. Jedoch steh ich (vielleicht liegt es am Wetter :D) irgendwie auf dem Schlauch und komme nicht weiter.

    Hier mal mein Quellcode:

    KeyProg.cpp

    // KeyProgDlg.cpp : Implementierungsdatei
    //
    
    #include "stdafx.h"
    #include "KeyProg.h"
    #include "KeyProgDlg.h"
    
    #include <string.h>
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    #define MAXCHARS 6
    
    // CAboutDlg-Dialogfeld für Anwendungsbefehl "Info"
    
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
    
    // Dialogfelddaten
    	enum { IDD = IDD_ABOUTBOX };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    
    // Implementierung
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()
    
    // CKeyProgDlg-Dialogfeld
    
    CKeyProgDlg::CKeyProgDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CKeyProgDlg::IDD, pParent)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CKeyProgDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Text(pDX, IDC_KEY1, m_sField1 );
    	DDV_MaxChars(pDX, m_sField1, MAXCHARS);
    	DDX_Text(pDX, IDC_KEY2, m_sField2 );
    	DDV_MaxChars(pDX, m_sField2, MAXCHARS);
    	DDX_Text(pDX, IDC_KEY3, m_sField3 );
    	DDV_MaxChars(pDX, m_sField3, MAXCHARS);
    
    }
    
    BEGIN_MESSAGE_MAP(CKeyProgDlg, CDialog)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    	ON_EN_CHANGE(IDC_KEY1, &CKeyProgDlg::OnEnChangeKey1)
    	ON_EN_CHANGE(IDC_KEY2, &CKeyProgDlg::OnEnChangeKey2)
    	ON_EN_CHANGE(IDC_KEY3, &CKeyProgDlg::OnEnChangeKey3)
    END_MESSAGE_MAP()
    
    // CKeyProgDlg-Meldungshandler
    
    BOOL CKeyProgDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
    	// IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
    	//  wenn das Hauptfenster der Anwendung kein Dialogfeld ist
    	SetIcon(m_hIcon, TRUE);			// Großes Symbol verwenden
    	SetIcon(m_hIcon, FALSE);		// Kleines Symbol verwenden
    
    	// TODO: Hier zusätzliche Initialisierung einfügen
    
    	return FALSE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    
    void CKeyProgDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialog::OnSysCommand(nID, lParam);
    	}
    }
    
    // Wenn Sie dem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie 
    //  den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das 
    //  Dokument/Ansicht-Modell verwenden, wird dies automatisch ausgeführt.
    
    void CKeyProgDlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // Gerätekontext zum Zeichnen
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// Symbol in Clientrechteck zentrieren
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Symbol zeichnen
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
    
    // Die System ruft diese Funktion auf, um den Cursor abzufragen, der angezeigt wird, während der Benutzer
    //  das minimierte Fenster mit der Maus zieht.
    HCURSOR CKeyProgDlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    
    int InputControl(int m_sField1, int m_sField2, int m_sField3)
    {
    
    	return m_sField1;
    }
    
    void CKeyProgDlg::OnEnChangeKey1()
    {
    	// TODO:  Falls dies ein RICHEDIT-Steuerelement ist, wird das Kontrollelement
    	// diese Benachrichtigung nicht senden, es sei denn, Sie überschreiben die CDialog::OnInitDialog()-
    	// Funktion und rufen CRichEditCtrl().SetEventMask() auf
    	// mit dem ENM_CHANGE-Flag ORed in der Eingabe.
    
    	// TODO:  Fügen Sie hier Ihren Code für die Kontrollbenachrichtigungsbehandlung ein.
    
    	if(!UpdateData(TRUE))
    	{
    		return;
    	}
    
    	nLength = m_sField1.GetLength();
    
    	LPCTSTR lpsz = m_sField1;
    
    	for(int nAnzahl=0; nAnzahl<nLength; nAnzahl++)
    	{
    
    		TCHAR cH;
    		cH = lpsz[nAnzahl];
    
    		if((cH < 'A' || cH > 'Z') && (cH < '0' || cH > '9'))
    
    		{
    			AfxMessageBox(IDS_WEDIT);
    			return;
    		}
    	}
    
    	if(nLength == MAXCHARS)
    	{
    		CWnd* pField2;
    
    		pField2 = GetDlgItem(IDC_KEY2);
    
    				if(pField2)
    				{
    					pField2->SetFocus();
    				}
    	}
    }
    
    void CKeyProgDlg::OnEnChangeKey2()
    {
    	// TODO:  If this is a RICHEDIT control, the control will not
    	// send this notification unless you override the CDialog::OnInitDialog()
    	// function and call CRichEditCtrl().SetEventMask()
    	// with the ENM_CHANGE flag ORed into the mask.
    
    	// TODO:  Add your control notification handler code here
    
    	if(!UpdateData(TRUE))
    	{
    		return;
    	}
    
    	nLengthtw = m_sField2.GetLength();
    	LPCTSTR lpsz2 = m_sField2;
    
    	for(int nAnzahlse=0; nAnzahlse<nLengthtw; nAnzahlse++)
    	{
    
    		TCHAR cHS;
    		cHS = lpsz2[nAnzahlse];
    
    		if((cHS < 'A' || cHS > 'Z') && (cHS < '0' || cHS > '9'))
    
    		{
    			AfxMessageBox(IDS_WEDIT);
    			return;
    		}
    	}
    
    	if(nLengthtw == MAXCHARS)
    	{
    		CWnd* pField3;
    
    		pField3 = GetDlgItem(IDC_KEY3);
    
    				if(pField3)
    				{
    
    					pField3->SetFocus();
    				}
    	}
    }
    
    void CKeyProgDlg::OnEnChangeKey3()
    {
    	// TODO:  If this is a RICHEDIT control, the control will not
    	// send this notification unless you override the CDialog::OnInitDialog()
    	// function and call CRichEditCtrl().SetEventMask()
    	// with the ENM_CHANGE flag ORed into the mask.
    
    	// TODO:  Add your control notification handler code here
    
    	if(!UpdateData(TRUE))
    	{
    		return;
    	}
    
    	nLengththi = m_sField3.GetLength();
    	LPCTSTR lpsz3 = m_sField3;
    
    	for(int nAnzahlthi=0; nAnzahlthi<nLengththi; nAnzahlthi++)
    	{
    
    		TCHAR cHT;
    		cHT = lpsz3[nAnzahlthi];
    
    		if((cHT < 'A' || cHT > 'Z') && (cHT < '0' || cHT > '9'))
    
    		{
    			AfxMessageBox(IDS_WEDIT);
    			return;
    		}
    	}
    
    	if(nLengththi == MAXCHARS)
    	{
    		CWnd* pField3;
    
    		pField3 = GetDlgItem(IDOK);
    
    				if(pField3)
    				{
    					pField3->SetFocus();
    				}
    	}
    }
    

    Und dann noch die Header Datei (falls ihr die dringend braucht)

    // KeyProgDlg.h : Headerdatei
    //
    
    #pragma once
    
    // CKeyProgDlg-Dialogfeld
    class CKeyProgDlg : public CDialog
    {
    // Konstruktion
    public:
    	CKeyProgDlg(CWnd* pParent = NULL);	// Standardkonstruktor
    
    // Dialogfelddaten
    	enum { IDD = IDD_KEYPROG_DIALOG };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV-Unterstützung
    
    // Implementierung
    protected:
    	HICON m_hIcon;
    
    	// Generierte Funktionen für die Meldungstabellen
    	virtual BOOL OnInitDialog();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	DECLARE_MESSAGE_MAP()
    public:
    
    	//int CKeyProgDlg::InputControl (CString m_sField1, CString m_sField2, CString m_sField3);
    
    	CString m_sField1;
    	CString m_sField2;
    	CString m_sField3;
    
    	int nLength;
    	int nLengthtw;
    	int nLengththi;
    
    	afx_msg void OnEnChangeKey1();
    	afx_msg void OnEnChangeKey2();
    	afx_msg void OnEnChangeKey3();
    };
    

    Hätte da jemand von euch eine gute Idee/Tipp/Hilfe für eine Funktion die die Arbeit der drei OnEnChangeKeys übernimmt?



  • bmth schrieb:

    ...ich bin neu hier im Forum...

    Das merkt man, da du dir weder den Thread "Wichtig: Du brauchst Hilfe?", die Forenstruktur oder den Eingangstext in diesem Unterforum durchgelesen hast. Wie so jeder Neuling...



  • Falsches Forum: korrekt wäre MFC.
    Hoffentlich wird dein Beitrag bald verschoben.
    Simon



  • Hat irgendwer Lust so viel Code zu lesen?! Man kann Probleme auch einfacher beschreiben! 😡



  • Oben und ganz unten hatte ich ja was zum Problem geschrieben 🙂

    Hier noch mal Quellcode der sich auf eines der drei Felder bezieht:

    void CKeyProgDlg::OnEnChangeKey3() 
    { 
        // TODO:  If this is a RICHEDIT control, the control will not 
        // send this notification unless you override the CDialog::OnInitDialog() 
        // function and call CRichEditCtrl().SetEventMask() 
        // with the ENM_CHANGE flag ORed into the mask. 
    
        // TODO:  Add your control notification handler code here 
    
        if(!UpdateData(TRUE)) 
        { 
            return; 
        } 
    
        nLengththi = m_sField3.GetLength(); 
        LPCTSTR lpsz3 = m_sField3; 
    
        for(int nAnzahlthi=0; nAnzahlthi<nLengththi; nAnzahlthi++) 
        { 
    
            TCHAR cHT; 
            cHT = lpsz3[nAnzahlthi]; 
    
            if((cHT < 'A' || cHT > 'Z') && (cHT < '0' || cHT > '9')) 
    
            { 
                AfxMessageBox(IDS_WEDIT); 
                return; 
            } 
        } 
    
        if(nLengththi == MAXCHARS) 
        { 
            CWnd* pField3; 
    
            pField3 = GetDlgItem(IDOK); 
    
                    if(pField3) 
                    { 
                        pField3->SetFocus(); 
                    } 
        } 
    }
    

    Und die Abläufe die hier drin stehen (Kontrolle der Eingaben in Bezug auf Großbuchstaben, Zahlen und Zeichen) soll quasi verallgemeinert werden, in einer Funktion und dann würde ich gerne z.B. die m_sField Angaben als Referenzen übergeben. Für den Fall, dass ich halt noch weitere EditControl Fenster einbaue die genau so überprüft werden sollen. Würde ich das auf dem jetzigen Wege drin stehen haben hätte ich ja das selbe Code Fragment X Mal drin stehen ^^


  • Administrator

    Wieso lagerst du es nicht einfach in eine Funktion aus? Wenn ich richtig gesehen habe, ändert sich ja nur das CString Objekt. Also grundsätzlich muss du nur sowas machen:

    void OnEnChangeKeyX(CString const& field)
    {
      // ... dein hässlicher Code ...
    }
    
    void CKeyProgDlg::OnEnChangeKey1()
    {
      OnEnChangeKeyX(m_sField1);
    }
    
    void CKeyProgDlg::OnEnChangeKey2()
    {
      OnEnChangeKeyX(m_sField2);
    }
    
    void CKeyProgDlg::OnEnChangeKey3()
    {
      OnEnChangeKeyX(m_sField3);
    }
    

    Grüssli


Anmelden zum Antworten