Membervariable bzw. Klasse in eigener Funktion ansprechen.



  • Hallo,

    ich bin in C++ noch ein Anfänger und habe wahrscheinlich eine ziemlich einfache Frage.
    Ich möchte mit Visual Basic aufhören und mit Visual C++ weiterarbeiten.
    Ich benutze Microsoft Visual C++ 5.0.

    So nun zu meinem Problem:

    Ich möchte über eine eigene Funktion Steuerelemte aktualisieren, das ich in anderen Funktionen diese nurnoch aufrufen muss wie z.B. Aktualisiere(IDC_EDIT1);

    Die Funktion habe ich am unteren Ende der Datei *Dlg.cpp angelegt und sieht so aus:

    void RefreshObj(char ControlName[20])
    
    {
      int iBytes;
    
      CEdit *cServerResponse=(CEdit *) GetDlgItem(IDC_SERVERRESPONSE); 
      iBytes=cServerResponse->GetLineCount();
    }
    

    zusätzlich habe ich die Funktion noch ganz oben nach den Includes in selbiger Datei eingefügt:

    void RefreshObj(char[20]);
    

    Wenn ich die Funktion nun aufrufe bekomme ich folgende Fehlermeldung (vom compiler).

    error C2660: 'GetDlgItem' : Funktion akzeptiert keine 1 Parameter

    Wenn ich eine Instanz über den eine Dialogfunktion aufrufe wie z.B. :

    void CFtpiTDlg::OnConnect()
    

    dann scheint ein Parameter zu genügen.
    Jetzt habe ich in der Hilfe nachgeschaut und da steht das ich noch nen Handle des Windows mitgeben muss (hWnd), warum das so ist keine Ahnung.

    Wenn ich jetzt ein HWND object anlege, diese leer lasse und die Instanzierung mit dem leeren HWND object aufrufe bekomme ich die Fehlermeldung:
    error C2664: 'GetDlgItem' : Konvertierung des Parameters 1 von 'struct HWND__ ** ' in 'struct HWND__ *' nicht moeglich

    Ich kann z.B. in meiner Funktion auch keine membervariablen ansprechen.
    Da bekomme ich die Fehlermeldung nicht deklarierter Bezeichner.
    Hab auch schon versucht nen membervariable als Control anzulegen,
    nur in meiner Funktion erkennt er sie nicht.

    Wäre super wenn mir da jemand weiterhelfen könnte!!
    Bye



  • RefreshObj braucht ein gültiges Handle zu einem Dialog Fenster um ein Element (CEdit) ansprechen zu können. Am besten du übergibst ihr eine oder du fügst diese Funktion der Dialog Klasse hinzu.

    Wie sprichst du denn die Member Variablen an?



  • Hi,

    Ich habe eine MemberVariable über das ClassWizzard angelegt.
    In einer Funktion innerhalb des Dialogs bzw. vom Dialog kann ich so drauf zugreifen:

    iBytes=m_CtlServerResponse.GetLineCount();
    

    In meiner eigenen Funktion allerdings nicht, "nicht deklarierter Bezeichner".

    Was mach ich da falsch?
    Wie kann ich ein hanlde des Dialogs bekommen und wie muss ich es übergeben,bzw. wie kann ich auf eine Membervariable in einer eigenen Funktion zugreifen?
    Danke!



  • Bitte nicht schlagen wenns falsch ist, aber ein gültiges Handle sollte man mit this übergeben können.

    Und die Membervariable des Dialoges ist nur innerhalb dieser Klasse gültig.
    Das ist so ähnlich wie

    for(int i; i < 10; i++){
      // do anything
    }
    

    Da gilt die Variable i auch nur innerhalb der Schleife. Verlasse ich diese wird die Variable zerstört.

    Um auf die Membervariable zugreifen zu können kannst du sie
    1. der Funktion übergeben
    oder
    2. eine Instantz der Klasse anlegen und dann darüber auf die Variable zugreifen. Aber dann dürfte nicht das drinstehen was du benötigst.



  • Kann ich denn nicht über GetDlgItem arbeiten?
    Da muss es doch ne möglichkeit geben in einer eigenen Funktion drauf zuzugreifen?
    Ist eine Membervariable denn nicht global?
    Muss ich die Funktion irgendwo im Header anmelden?

    Kann doch nicht sein das man nicht auf Steuerelemente zugreifen kann, das geht doch sogar in visual basic...

    Andere Frage bei Visual basic gabs so ne Funktion das wenn ich den Objectnamen geschrieben habe und dann nen Punkt (".") dann kam ein Kontextmenü mit den Funktionen und Attributen der (klasse?) gibts das bei Visual C++ 5.0 nicht?

    Danke



  • Shib schrieb:

    Kann ich denn nicht über GetDlgItem arbeiten?

    Doch, aber du brauchst ein gültiges Handle

    HWND GetDlgItem(
    HWND hDlg,       //handle to dialog box
    int nIDDDlgItem  // control identifier
    );
    

    Was du in deiner Funktion nutzt ist diese API Funktion die ein Handle benötigt.
    Wenn du in der Dialog Klasse CFtpiTDlg die Funktion GetDlgItem aufrufst ist das eine Funktion der Klasse CDialog von welcher CFtpiTDlg abgeleitet ist.

    Da muss es doch ne möglichkeit geben in einer eigenen Funktion drauf zuzugreifen?

    siehe oben

    Ist eine Membervariable denn nicht global?

    Nein, ist sie nicht. Das ist der Sinn von Member Variablen. Nicht jeder kann drauf zugreifen und sie verändern.

    Muss ich die Funktion irgendwo im Header anmelden?

    Der Funktionsprototyp muss bekannt sein bevor du die Funktion benutzt, muss also irgendwo davor stehen. Ob das nun in einem Header ist den du per #ínclude einbindest oder ob es einfach oben in der *.cpp steht ist dabei egal.

    Kann doch nicht sein das man nicht auf Steuerelemente zugreifen kann, das geht doch sogar in visual basic...

    Siehe oben, es geht.

    Andere Frage bei Visual basic gabs so ne Funktion das wenn ich den Objectnamen geschrieben habe und dann nen Punkt (".") dann kam ein Kontextmenü mit den Funktionen und Attributen der (klasse?) gibts das bei Visual C++ 5.0 nicht?

    Danke

    Im Visual Studio 6 gehts auf jeden Fall, 5 kenn ich leider nicht.



  • Hi Danke nochmals für die mühe!
    Das Problem lag daran das ich hier ein kleines Verständnisproblem hatte, denn bei vb war das so das ich eine funktion schreiben konnte ohne diese der Klasse mitzuteilen.

    In C++ ist es ja so das ich über ClassView die Funktion der Klasse mitteilen muss ( über Member-Funktion-hinzufügen ). Das hatte ich nicht gewusst und meine Funktion somit als Global angemeldet, deshalb kennt er die variablen nicht.
    Habs jetzt hinbekommen, Vielen Dank nochmals!

    Eine Frage noch.

    Über ->SetWindowText bzw. über eine Membervariable des Typs CString auf ein Editfeld kann ich ja über eine Werte Zuweisung den Wert ändern.
    Aktualisert wird der Wert bei Membervariablen ja nur über UpdateData(false);

    Wenn ich eine Instanz als Control bzw. Variable mache und den Wert ändere , ändert er den Wert im Object auch ( auf der Form ) er gibt mir allerdings kein onChange event, nur wenn ich direkt über die Tastatur ins Feld schreibe.

    Ein Autoscroll in einer Textbox wird also nicht ausgeführt.

    Bye


Anmelden zum Antworten