Auf die Member-Variablen der CMeineAnwendungView von einem CListCtrl-Steuerelement einer anderen Klasse zugreifen



  • Hallo,

    Nehmen Sie an, dass es eine CFormView- Ansicht gibt, (die Deklaration z.B.)

    class CMeineAnwendungView : public CFormView
    

    die einen Text (ID: IDC_Warnung) und ein Listenelement (ID: IDC_List) enthält.

    In der Klasse CMeineAnwendungView ist m_Warnung als public CString Variable deklariert damit es mit der Text- Steuerelement IDC_Warnung verknüpft ist.

    In der Datei MeineAnwendungView.cpp befindet sich auch die Funktion:

    void CMeineAnwendungView::OnInitialUpdate()
    {
    	CFormView::OnInitialUpdate();
    	GetParentFrame()->RecalcLayout();
    	ResizeParentToFit();
    	m_Warnung="OK"; // Diese letzten zwei Anweisungen habe ich hinzugefügt
    	UpdateData(FALSE); // um nur zu Prüfen dass sich der Text des Text-Steuerelements problemlos verändert
    }
    

    So weit, so gut...

    Danach habe ich mit Hilfe der Klassen-Assistenten eine neue Klasse namens MeineListe für das Listenelement IDC_List und
    anschließend eine Nachrichten-Routine für den Mouseklick innerhalb dieses Listenelements erstellt.

    void MeineListe::OnClickList(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	// TODO: Add your control notification handler code here	
    	*pResult = 0;
    }
    

    Jetzt möchte ich durch die Ereignis-Funktion

    MeineListe::OnClickList()
    

    auf die Member- Variable m_Warnung der Klasse CMeineAnwendungView zugreifen. Zu diesem Zweck, habe ich eine zusatzliche Variable innerhalb der Klasse MeineListe vorgesehen, das funktionierte aber nicht.

    Mittlerweile beachten Sie bitte, dass es sehr einfach wäre, wenn das von derselben Klasse getan werden müsste, z.B. wie in der Funktion

    void CMeineAnwendungView::OnInitialUpdate()
    {
    m_Warnung="OK"; 	
    UpdateData(FALSE); 
    }
    

    Auf keinen Fall kann ich auf die Member-Variable m_Warnung der Klasse CMeineAnwendungView von dem Listenelement IDC_List der Klasse MeineListe zugreifen und ich bin darüber völlig ratlos.

    Wie kann ich das geeignet schaffen?

    Vielen Dank im Voraus.



  • ne einfache lösung währe:

    - nen pointer innerhalb deiner 'MeineListe' klasse anzulegen
    - in void CMeineAnwendungView::OnInitialUpdate():
    m_MeineListe.m_PointerVonWarnung = &m_Warnung;

    dann kannst du einfach auf den wert zugreifen und ihn verändern.

    ne zweite möglichkeit:

    - in deiner liste sendest du eine message via GetParent()->SendMessage() an deine view-klasse. darin übergibst du den neuen wert. du kannst dir aber auch über den rückgabewert die adresse von m_Warnung übergeben lassen und dann wie im ersten beispiel verändern



  • Danke für Ihre Antwort,

    Ich habe Ihren ersten Rat durchgesucht und innerhalb der MeineListe Klasse
    habe ich einen Pointer wie

    CString* m_PointerVonWarnung
    

    deklariert

    Aber, nachdem ich die Anweisung

    m_MeineListe.m_PointerVonWarnung = &m_Warnung;
    

    in die

    CMeineAnwendungView::OnInitialUpdate()
    

    hinzugefügt habe,
    habe ich die folgende Fehlemeldung bekommen:

    'm_PointerVonWarnung' : is not a member of 'CListCtrl'
    see declaration of 'CListCtrl'

    Außerdem habe ich bemerkt dass es nur m_hWnd als Member Variable von m_MeineListe in der IntelliSenseList gab.

    Also kann ich nicht weiter gehen und ich weiß nicht was zu tun.

    Um mein ursprüngliches Ziel in Erinnerung zu bringen, hier ist eine konzeptionelle Funktion über was ich tun möchte:

    void CMeineAnwendungView::OnClickList(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    // To Do: Add your control notification handler code here
    // Wie kann ich von hier den Text der IDC_Warnung verändern, 
    //bzw. eine Anweisung wie 
    // m_Warnung = "Die Liste wurde angeklickt"; 
    // UpdateData(FALSE);
    //einsetzen?
    	*pResult = 0;
    }
    

    Ich kann Ihren zweiten Rat nicht leicht einsetzen weil ich über die Funktionen wie GetParent()->SendMessage() nicht erfahren bin.
    Sowieso sieht der Erste netter aus.

    Ich warte auf Ihre weitere Vorschläge...



  • du hast m_MeineListe nicht als 'MeineListe' deklariert, sondern als 'CListCtrl'.

    das must du ändern.

    'MeineListe' ist dann ja von 'CListCtrl' abgeleitet. daher ist die variable nicht in 'CListCtrl' verfügbar.



  • Jetzt ist das ok! Nachdem ich die m_MeineListe als MeineListe deklariert habe ist die foldende Funktion problemlos gelaufen.

    void CMeineAnwendungView::OnClickList(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	// TODO: Add your control notification handler code here
    	m_Warnung="Ein Klick von dem CListCtrl-Steuerelement";
    	CMeineAnwendungView::UpdateData(FALSE);
    	*pResult = 0;
    }
    

    Also, danke nochmal!



  • Warte mal... was wird das? m_MeineListe.m_PointerVonWarnung = &m_Warnung; ?! Hallo ?!

    Also:
    Man bekommt im algemeinen bei einer SDI Anwendung bzw auch MDI Anwendung den C...View Pointer in dem man es wie folgt machen:

    ((CMainFrame*)AfxGetMainWnd())->GetActiveView();
    

    So... das ist schonmal gut... dann wissen wir das Public membervariablen abartig sind... k... acuh gut... daraus folgt:

    class CMeineAnwendungView : public CFormView
    {
    public:
        // ...
        void SetWarning(CString& strWarning);
    
    protected:
        CString m_strWarnung;
        // ...
    };
    
    void MeineListe::OnClickList(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        CString strMessage = "Test";
        ((C...View*)(((CMainFrame*)AfxGetMainWnd())->GetActiveView()))->SetWarning(strMessage);
        *pResult = 0;
    }
    

    So das ganze kann man natürlich auch um eine SetMessage(LPCSTR lpszWarning) erweitern... das erleichtert es dann, Warnungen auszugeben...



  • deine lösung ist schöner!

    aber etwas weniger arrogant hätte es auch getan. falls das nicht deine absicht war, das es so geklungen hat, entschuldige ich mich schon mal im voraus



  • Jo... war net meine Absicht 🙂 Ich mag das halt nur net wenn das so ne unsaubere Lösung ist(führt halt leich zu Bugs ;)) 😉



  • das nächste mal werde ich ne saubere lösung basteln 😉


Anmelden zum Antworten