Message Handler



  • Ich will das jetzt mal nach deiner Anleitung ausprobieren aber schon beim Ableiten habe ich das erste Problem und zwar muss ich doch von meiner Liste in dem Fall ListCarPark ableiten oder?? Wenn ich das mache, sagt mir mein Compiler ads es keine Header-Dateien gibt und ich sie manuell hinzufügen müsste. Ist das richtig?? Oder was mache ich falsch??



  • Es ist in deinem Fall nicht nötig eine Klasse abzuleiten. Füge einfach eine Nachrichtenbehandlungsroutine (Message Handler) für z.B die Nachricht NM_DBLCLK deines ListControls ein. Das würde bedeuten das nun etwas pasiert, wenn du auf einen Eintrag deines ListControl doppelt klickst. Darin öffnest du nun deinen jeweiligen Dialog, z.B so:

    void CDeinKlassennameDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	CDeineDialogklasse dlg;
    	dlg.DoModal();
    	*pResult = 0;
    }
    


  • meinst du mit List1 den IDC namen oder die Membervariable die ich dafür benutze??



  • Falls du den Namen der Funktion meinst, der wurde automatisch erstellt. Und das List1 am Ende kommt von der ID des ListControls (also IDC_LIST1). Wenn du Probleme hast Nachrichtenbehandlungsroutinen einzufügen, dann findest du hier paar Infos dazu: Hilfe-Seite



  • Achso jetzt hab ich es verstanden 🙂 Danke.

    Kannst du mir vielleicht bei einer weiteren Sache bezüglich dieser sache helfen???

    Und zwar handelt es sich bei meiner Anwendung um einen Fuhrpark, diese Nachrichtenroutine soll auftreten wenn man auf ein Fahrzeug aus diesem Fuhrpark klickt.

    Wenn das Fahrzeug vermietet ist soll sich ein anderer Dialog öffnen als wenn es frei ist.

    Wie schaff ich es das der Compiler diese Information ob vermietet oder frei mit übermittlet??



  • void CDeinKlassennameDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        if(wagen == vermietet)
        {
           // Dialog 1 öffnen
        }
        else
        {
           // Dialog 2 öffnen
        }
        *pResult = 0;
    }
    

    Oder rufst halt deine zugehörige Funktion auf, die das verwaltet falls du eine hast



  • Achso ich kann direkt ne If-Abfrage machen, ich dachte ich muss das irgendwie seperat übergeben was angeklickt wurde bevor ich die If - Abfrage machen kann



  • Selbstverständlich musst du erst ermitteln welche Zeile der Anwender angeklickt hat, z.B so: Zeile ermitteln



  • Wenn ich mir die Zeile holen will bekomme ich folgende Fehlermeldungen:

    C:\Dokumente und Einstellungen\Dors\Desktop\C++ Projekte\CarPark\CarParkDlg.cpp(212) : error C2679: Binaerer Operator '=' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'int' akzeptiert (oder keine geeignete Konvertierung moegl
    
    C:\Dokumente und Einstellungen\Dors\Desktop\C++ Projekte\CarPark\CarParkDlg.cpp(214) : error C2039: 'LeasingFree' : Ist kein Element von 'vector<class DriverBook,class std::allocator<class DriverBook> >'
    

    Ich mache das momentan so:

    void CCarParkDlg::OnDblclkLISTCarPark(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	DriverBook FindData;
    	FindData = m_ListCarPark.GetNextItem(-1, LVNI_SELECTED);
    
    	if( FindData.LeasingFree == 'frei' )
    	{
    
    		Leasing dialog;
    
    		dialog.DoModal();
    
    		*pResult = 0;
    	}
    	else
    	{
    		Return dialog;
    
    		dialog.DoModal();
    
    		*pResult = 0;
    	}
    }
    

    Und ich weiss net wie ich das sonst machen sollte



  • GetNextItem gibt dir einen int-Wert zurück und und die erste Fehlermeldung sagt dir das dieser Wert kann nicht in den Typ FindData konvertiert werden. So ist es richtig:

    void CCarParkDlg::OnDblclkLISTCarPark(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        DriverBook FindData;
        int nAusgewaehlteZeile = m_ListCarPark.GetNextItem(-1, LVNI_SELECTED);
        ...
    }
    

    Damit hast du die ausgewählte Zeile ermittelt. Jetzt prüfe ob die ausgewählte Zeile ein Fahrzeug enthält welches bereits vermietet wurde oder nicht.



  • so hat ich mir da auch schon gedacht nur wie kriege ich jetzt die informationen von nAusgewaehlteZeile ind FindData???



  • Mir fehlen Informationen zu FindData. Ich weiss ja nicht wie deine Daten vorliegen, ob ein Fahrzeug vermietet wurde oder nicht. Ich kann dir nur noch sagen wie du z.B ermitteln kannst welches Fahrzeug ausgewählt wurde. Vielleicht hilft dir das weiter. Das geht dann so:

    void CCarParkDlg::OnDblclkLISTCarPark(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        DriverBook FindData;
        int nAusgewaehlteZeile = m_ListCarPark.GetNextItem(-1, LVNI_SELECTED);
    
        CString strFahrzeug;
    
        // Angenommen dein Fahrzeugname steht in der ersten Spalte deines CListCtrl
        strFahrzeug = m_ListCarPark.GetItemText(nAusgewaehlteZeile, 0)    
    }
    

    Vielleicht kannst du jetzt die Fahrzeugnamen vergleichen und findest so heraus, ob vermietet oder nicht.



  • Informationen zu FindData:

    Das ist die DriverBook Class von der es eine Variable FindData gibt:

    class DriverBook  
    {
    public:
    
    	std::string TypeOfCar;
    	std::string NumberPlate;
    	std::string KmState;
    	std::string Defects;
    	std::string LeasingFree;
    
    public:
    	DriverBook();
    	virtual ~DriverBook();
    
    };
    
    typedef std::vector< DriverBook > CarParkVector;
    
    #endif // !defined(AFX_DRIVERBOOK_H__B113F948_DE04_4009_81D2_66FA552BB6B1__INCLUDED_)
    

    Damit ich sehen kann ob in LeasingFree vermietet oder frei steht, muss ich wie schon geschehen ertmal wissen was überhaupt ausgewählt wurde:

    void CCarParkDlg::OnDblclkLISTCarPark(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    
    	DriverBook FindData;
    	int nAusgewaehlteZeile;
    
    	nAusgewaehltezeile = m_ListCarPark.GetNextItem(-1, LVNI_SELECTED);
    

    So nun muss ich irgendwie an meinen Vector kommen wo ich auf die einzelnen Variablen mit dem Inhalt er Zeile zugreifen kann oder nicht?? Damit ich meine If - Abfrage machen kann


Anmelden zum Antworten