Dialog erstellen mit Buttons



  • Hi Leute,
    ich sitze gerade an einem Programm zur Lagerverwaltung für ein Hochregallager. Mein programm schickt die reihe und die Spalte im Hochregallager an ein externes Programm und bekommt alle freien Höhenplätze zurückgeliefert.
    z.B. "135" oder "34" oder "12345"
    Nun will ich, dass auf meinem Display vom Handscanner ein weiteres Fenster geöffnet wird, in dem Buttons erzeugt werden. Ich habe mir gedacht dass man 5 buttons untereinander macht und die enabled wo Plätze frei sind. Dieser aufgerufene Dialog soll dann je nach dem welcher der Buttons gedrückt wurde die Zahl (1-5) an mein eigentliches Hauptprogramm zurückliefern, und dieses schickt nun den endgültigen Lagerplatz (Reihe, Spalte, Höhe) per Socket zurück. Nun ist meine Frage Wie erzeuge ich ein neues Fenster (sicher ein Childfenster), wie erzeugt man Buttons darauf, und wie ist es möglich Variablen dieses erzeugten Dialogs an das Parent-Fenster zurückzugeben?
    Ich weis, ist jetz ein bisschen viel, aber ich bin für jedwege Hilfe dankbar 🙂
    Liebe Grüße
    Basti



  • Also ich hab auch erst vor kurzem mit Visual C++ angefangen und kenne mich da auch noch net so gut aus.
    Ich hab zur Dialogerstellung einen Ressourcenmanager im Visual Studio, da kann man durch einen einfachen Klick neue Dialoge erzeugen.
    Gibt es sowas bei dir nicht?

    Viele Grüße Sebastian



  • Achso, das sollte ich vllt. noch erwähnen:
    Ich arbeite mit eVC++, das ist ähnlich VC++ 6.0
    Also nix mit VS2005/2008 😞

    Aber ich habe jetzt über insert New Form einen neuen Dialog hinzugefügt. Ich werde da jetzt mal schnell 5 Buttons hinklatschen, da erübrigt sich das aus mienem Thread mit dem Erstellen des Dialogs und den Buttons zur Laufzeit schonmal.
    Aber wie arbeite ich dann genau mit diesem Dialog?
    Gruß
    Basti



  • Achso, naja ich hab bisher nur Erfahrung mit Microsoft Visual Studio 6.0.
    Da hilft einem der Assistent bei sowas.



  • Wenn du deine Buttons manuell erstellst, dann weist denenen bestimmt auch sowas wie eine ID zu oder?



  • Ja, also ich habe jetzt schon einen neuen Dialog IDD_PLATZWAHL_DIALOG mit 5 Buttons drauf erstellt.



  • Also bei mir sieht sowas so aus:
    Steht in der Dialogklasse.

    BEGIN_MESSAGE_MAP(CBlubbi, CDialog)
    	//{{AFX_MSG_MAP(CBlubbi)
    	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // Behandlungsroutinen für Nachrichten CBlubbi 
    
    void CBlubbi::OnButton1() 
    {
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    
    }
    

    IDC_BUTTON1 ist die ID des Buttons. CBlubbi ist meine Dialogklasse.
    Verwendet eVC++ auch so eine Art MESSAGE_MAP?



  • In der MESSAGE_MAP wird also das Ereignis auf die Button ID mit der zugehörigen Funktion verknüpft.
    Dann diese Funktion noch schnell schreiben und fertig.



  • naja ich denk mal den neuen Dialog nun einzeln verwalten is nicht mehr so das prob, den kann ich ja genauso programmieren wie jeden anderen. Wo ich z.Zt. noch nicht weiter weis is wie ich den dann anzeige, wieder schliesse, und wie ich meinem Hauptdialog mitteile welcher button nun geklickt wurde^^
    LG Basti



  • also zum Anzeigen gibts die Funktion

    CDialog.DoModal

    zum Schließen hab ich sowas in der Funktion die beim Klick auf den Button ausgeführt wird.

    CDialog::OnOK();

    hast du sowas wie ein globales Anwendungsobjekt? dann könntest dort Membervariablen definieren und diese im Dialog ändern



  • oder zum Schließen

    EndDialog(IDOK);

    beim drücken auf den Button ausführen.

    wobei IDOK der Rückgabewert ist.

    if(CDialog.DoModal()==IDOK)
    {
     // Code der ausgeführt wird, wenn der Dialog mit dem OK Button beendet wurde
    }
    


  • okay, danke ich werd mich mal durchfuchsen... wenns nicht klappt meld ich mich nochmal 🙂



  • also im Moment sieht der Quelltext bei mir so aus, habe leider versäumt nen vernünftigen Namen für den Dialog zu vergeben -.-

    // Platzwahl.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "Schweissdraht.h"
    #include "Platzwahl.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // Platzwahl dialog
    
    Platzwahl::Platzwahl(CWnd* pParent /*=NULL*/)
    	: CDialog(Platzwahl::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(Platzwahl)
    	//}}AFX_DATA_INIT
    }
    
    void Platzwahl::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(Platzwahl)
    	DDX_Control(pDX, IDC_BUTTON55, m_LagerButton5);
    	DDX_Control(pDX, IDC_BUTTON44, m_LagerButton4);
    	DDX_Control(pDX, IDC_BUTTON33, m_LagerButton3);
    	DDX_Control(pDX, IDC_BUTTON11, m_LagerButton1);
    	DDX_Control(pDX, IDC_BUTTON22, m_LagerButton2);
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(Platzwahl, CDialog)
    	//{{AFX_MSG_MAP(Platzwahl)
    	ON_BN_CLICKED(IDC_BUTTON11, OnButton11)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // Platzwahl message handlers
    
    void Platzwahl::OnButton11() 
    {
    	// TODO: Add your control notification handler code here
    
    }
    

    Wie öffne ich dieses DialogFenster nun aus einem anderen Dialogfenster heraus?



  • Platzwahl dlg;
    if (dlg.DoModal() == IDOK)
    {
      // mach was mit Daten aus Dialog, z.B. dlg.GetReihe() oder was auch immer
    }
    


  • Also ich habe nun mal versucht in der SchweissdrahtDlg.cpp folgendes gemacht:

    Platzwahl dlg2;
    

    Fehlermeldung:
    C:\Dokumente und Einstellungen\stephan\Eigene Dateien\VC++ SP4\Schweissdraht\SchweissdrahtDlg.cpp(27) : error C2146: syntax error : missing ';' before identifier 'dlg2'
    C:\Dokumente und Einstellungen\stephan\Eigene Dateien\VC++ SP4\Schweissdraht\SchweissdrahtDlg.cpp(27) : error C2501: 'Platzwahl' : missing storage-class or type specifiers
    C:\Dokumente und Einstellungen\stephan\Eigene Dateien\VC++ SP4\Schweissdraht\SchweissdrahtDlg.cpp(27) : fatal error C1004: unexpected end of file found

    Ich habe auch grade mal ein wenig in "Visual C++ Windows-Programmierung mit den MFC" gelesen, aber da steht auch nur was von DoModal == IDOK.
    Ich habe aber wie es scheint schon Probleme bei der Deklaration des zweiten Dialog-Fensters.
    Und meine zweite Frage wäre:
    Wenn man mit DoModal sozusagen den "Rückgabewert" des Dialogs geliefert bekommt... Wie kann man verscheidene Rückgabewerte vereinbaren? in meinem Fall die Zahlen 1-5. Muss ich das dann über Member-Variablen des neuen Dialogs realisieren?
    Liebe Grüße
    Basti



  • Okay, habe es nun hinbekommen:
    Habe lediglich vergessen die Platzwahl.h in den anderen Dialog einzubinden -.-
    Aufgerufen habe ich es dann testweise mit:

    Platzwahl	PlatzwahlDlg;
    
    	if (PlatzwahlDlg.DoModal() == IDCANCEL)
    	{
    		MessageBox(_T("Platzwahl"),_T("New Dialog"),MB_OK);
    	}
    

    LG Basti



  • der Rückgabewert "IDOK" kommt ja von deinem vordefinierten OK Button
    wenn du nun einen anderen Rückgabewert möchtest, dann ruf bei dem Drücken des Buttons

    EndDialog(rückgabewert);

    auf.



  • Super, das klappt soweit 🙂
    Nun hat sich noch ein kleines Typenproblem eingeschlichen ^^
    Ich deklariere in der Schweissdraht.h (mein hauptdialog)

    extern CString cs_freieplaetze;
    

    weil diese cs_freieplaetze von 2 Dialogen benötigt wird.
    So hier sieht dann mein Code teilweise in der Platzwahl.cpp aus:

    BOOL Platzwahl::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
    	int i_freieplaetze_length;
    
    	// TODO: Add extra initialization here
    
    	m_LagerButton1.EnableWindow(false);
    	m_LagerButton2.EnableWindow(false);
    	m_LagerButton3.EnableWindow(false);
    	m_LagerButton4.EnableWindow(false);
    	m_LagerButton5.EnableWindow(false);
    
    	MessageBox(cs_freieplaetze,_T("freie Plätze"),MB_OK);
    	i_freieplaetze_length = cs_freieplaetze.GetLength;
    	for (int i=0; i<=i_freieplaetze_length-1;i++)
    	{
    		switch (cs_freieplaetze[i])
    		{
    		case '1':
    			{
    				m_LagerButton1.EnableWindow(TRUE);
    			}
    		case '2':
    			{
    				m_LagerButton2.EnableWindow(TRUE);
    			}
    		case '3':
    			{
    				m_LagerButton3.EnableWindow(TRUE);
    			}
    		case '4':
    			{
    				m_LagerButton4.EnableWindow(TRUE);
    			}
    		case '5':
    			{
    				m_LagerButton5.EnableWindow(TRUE);
    			}
    		} //switch-Anweisung
    	} // for-Schleife
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX Property Pages should return FALSE
    }
    

    Und der Compiler zeigt mir in der Zeile

    i_freieplaetze_length = cs_freieplaetze.GetLength;
    

    C:\...\Platzwahl.cpp(68) : error C2440: '=' : cannot convert from 'int (__cdecl CString::*)(void) const' to 'int'



  • probiers mal mit

    i_freieplaetze_length = cs_freieplaetze.GetLength();

    GetLength() ist eine Funktion, also müssen Klammern hin


Anmelden zum Antworten