Membervariablen von einer Klasse in eine andere durchreichen
-
Wer lesen kann ist klar im Vorteil:
Füge deiner ÄnderndDlg Klasse einfach eine Funktion SetNameÄndern(Cstring name) hinzu,
und übergib an die Klasse vor DoModal den markierten Namen.Devil
-
Ja danke Volle,
aber in den FAQ´s von MFC hab ich nichts passendes gefunden, erst in FAQ C++, aber damit kann ich nix so richtig anfangen. Will ni sagen, dass ich Anfänger bin, aber von MFC hab ich ni so den Plan. Also ein kleines Beispiel wäre vielleicht ni schlecht.
Wie sollte so ein Zeiger aussehen?
-
Original erstellt von *Neo81(looks for the white rabbit)*:
**Ja danke Volle,
aber in den FAQ´s von MFC hab ich nichts passendes gefunden, erst in FAQ C++, aber damit kann ich nix so richtig anfangen. Will ni sagen, dass ich Anfänger bin, aber von MFC hab ich ni so den Plan. Also ein kleines Beispiel wäre vielleicht ni schlecht.
Wie sollte so ein Zeiger aussehen?
**
Äh danke devil81.
Lesen ist das eine! Aber das Gelesene verstehen ist das andere! Bin vielleicht bissl begriffsstutzig.
-
[ Dieser Beitrag wurde am 14.11.2002 um 13:12 Uhr von devil81 editiert. ]
-
Hi neo,
also ich würde das schon auch so ähnlich machen, wie devil das schon beschrieben hat.
Du machst dir in deiner 2. Klasse eine Funktion. Der übergibst du einen Pointer auf deine 1. Klasse. Z.B.:
SetDlgPointer(CDeineErsteKlasse* pErsteKlasse);
Dann brauchst du natürlich noch eine Variable in deiner 2. Klasse. Etwa so:
CDeineErsteKlasse* pErsteKlasse;
Diese Funktion rufst du jetzt dort auf, wo du deinen 2. Dialog mit DoModal startest. Etwa so:
instanzZweiteKlasse.SetDlgPointer(&InstanzErsteKlasse); instanzZweiteKlasse.DoModal();
Jetzt kannst du mit
pErsteKlasse->schoenerString;
oder mit
pErsteKlasse->auchAufAndereSachen;
auf deine 1. Klasse zugreifen.
Alles klar?
Gruß, Volle.
-
@Volle
für einen CString ist das ein riesen Aufwand...
Dann lieber eine Set und eine Getfunktion...Devil
-
Hi zusammen,
wenn du meinst;)...
Hier ist noch eine Lösung von Unix- Tom die eigentlich die beste/ sauberste ist.
Gruß, Volle.
[ Dieser Beitrag wurde am 14.11.2002 um 14:34 Uhr von Volle editiert. ]
-
Ok, danke.
Alle Klarheiten beseitigt. Ich versuch das mal zu implementieren.
Danke euch nochmal für eure Hilfe.(melde mich bestimmt noch mal)
-
@ Volle
Hi,
wollte noch wissen, wie sich das bei Property-Klassen verhält, wo wird die Instanz der Property-Pages gebildet? Weil ich instanziere ja im Prinzip nur die von 'CPropertySheet' abgeleitete Klasse. Diese wiederum bedient sich ja der Membervariablen der PropertyPages. Also was ist die Instanz der "Dialoge" auf dem PropertySheet?
-
Hallo Neo,
die Variablen in deiner Sheet- Klasse sind generell mal Instanzen.
Ich weiß jetzt nicht, ob ich das pädagogisch wertvoll rüberbringen kann... Wenn du eine Instanz einer Klasse erzeugst, dann belegst du dafür Speicher im RAM (mal ganz grob).
Also so
CMyClass myClass;
oder so
CMyClass* myClass; myClass = new CMyClass;
Das ist nichts anderes, wie für 'normale' Variablen auch.
Z.B.:
int myInt;
oder andere Dinge.
Also in deinem konkreten Fall hast du jeweils eine Klasse für dein Sheet und deine Pages.
Irgendwo hast du stehen:
CMyProberty myProberty;
oder etwas Analoges. Du hast also eine Instanz von dieser Klasse erzeugt, mit der du arbeiten kannst. Im Header deiner Sheet- Klasse hast du dann die Membervars für die einzelnen Pages.
CMyPage1 myPage1; CMyPage2 myPage2;
Also wieder Instanzen, mit denen du arbeiten kannst.
Ich hoffe, ich konnte es dir ein bisschen erklären. Falls nicht, dann schau dir mal ein Tut an, wo das an einem Beispiel durchgearbeitet wird. Hier im Forum gibt es ja auch ein paar Links auf gute Sachen.
Grüße, Volle.
-
Hallo Volle,
danke für deine Bemühungen, mir das Thema begreiflich zu machen.Hab verstanden, was du meinst. Das funktioniert auch, bis auf einen Fehler:
passwort_aendern.SetDlgPointer(&m_benutzer);
"m_benutzer" ist meine Instanz von der PropertyPage, also meine "InstanzErsteKlasse".Aber er kann sie nicht finden. Da fehlt wohl noch irgendwas, oder?
-
Hallo Neo,
das ist ein wenig schwierige so aus der Ferne...
Hast du die Header richtig eingebunden? Was genau meinst du mit "nicht finden können" (Fehlermeldung?)?
Grüße, Volle.
-
@ Volle
Hi Volle,
"Nicht deklarierter Bezeichner 'm_benutzer'" is die Meldung.Alles andere geht ja anscheinend. Und ich hab auch die Header eingebunden. Und damit dass es eine private Variable ist, kann das ni zusammenhängen, oder?
-
Hallo Neo,
"Nicht deklarierter Bezeichner" hat eigentlich nichts mit privat oder nicht zu tun. Aber das könnte dir anderen Ärger verursachen.
Die Fehlermeldung klingt schon am ehesten nach einem Headerproblem oder einem simplen Schreibfehler. Schau dir das alles nochmal genau an. Sowas übersieht man gerne. Z.B. m_Benutzer oder m_benutzer usw.
Ansonsten erzähl mal noch ein bisschen was über den Kontext.
Was ist "passwort_ändern" und wo gehört es hin?
Wo sind "m_benutzer" und "passwort_ändern" deklariert?Einfach mal beschreiben, wie was zusammenhängt...
Gruß, Volle.
-
Hi Volle,
Also: Ich habe ein Dialog mit den Registerkarten "CPropertyDialog", da sind die Variablen für die PropertyPages deklariert: 'm_benutzer' und 'm_protokollverw'.So und auf der einen Page is die Benutzerverwaltung und auf der anderen die Protokollverwaltung, welche jetzt aber erstmal keine Rolle spielt. Auf der Benutzer-Page gibt es eine ComboBox, wo ein Name eines Benutzers ausgewählt werden kann. Wird dies getan, erscheint in der darunterliegenden EditBox das dazugehörige Passwort. Und das kann man ändern, indem man auf einen 'Ändern...'-Button klickt.Hier is die Funktion dazu:
void CBenutzer::OnBUTTONPasswAendern() { Passwort_Aendern passwort_aendern; passwort_aendern.SetDlgPointer(&m_benutzer); passwort_aendern.DoModal(); }
'Passwort_Aendern' is die "2.Klasse" in der ich auf die Membervariablen von der Page CBenutzer ("1.Klasse") zugreifen will, also in der ich den Pointer auf die "1.Klasse" benötige.
Da aber CBenutzer in CPropertyDialog instanziert wird, muss ich ja auf diese "Page-Variable" m_benutzer zugreifen und diese in der Funktion SetDlgPointer()übergeben, oder?
So, das is im Groben der Kontext. Das Projekt ansich is zu komplex, um das mal schnell zu beschreiben, es sei denn, du hast viel Zeit.
Gruß und Dank,
Neo
-
Hi Neo,
das sollte reichen...
Wenn ich es kapiert habe, dann sollte es heißen:
passwort_aendern.SetDlgPointer(this);
Grüße, Volle.
-
Naja,
das funzt ni so richtig, weil:
error C2664: 'SetDlgPointer' : Konvertierung des Parameters 1 von 'class CBenutzer *const ' in 'class CPropertyDialog *' nicht moeglichWas nu?
-
Hi Neo,
aber hallo bzw. "but hello", wie der Engläner sagen würde
...
Aber du willst doch an SetDlgPointer die aktuelle Instanz von deinem CBenutzer- Objekt übergeben.
Wie hast du denn SetDlgPointer in Password_aendern deklariert? Richtig wäre dann
SetDlgPointer(CBenutzer* pBenutzer);
Und du musst "benutzer.h" in deiner Password_aendern- Klasse einbinden(<- warum fehlt da eigentlich das "C"?). Dann sollte das auch laufen oder ich habe das völlig falsch verstanden, was du vor hast.
Ich habe mal eine Art Beispiel gemacht. Password_aendern heißt bei mir CSetPwd.
//im Header- File von CSetPwd class CBenutzer; class CSetPwd { ... private: CBenutzer* m_Benutzer; public: void SetDlgPointer(CBenutzer* aBenutzer); ... } //im CPP- File von CSetPwd #include "Benutzer.h" void CSetPwd::SetDlgPointer(CBenutzer* aBenutzer) { m_Benutzer = aBenutzer; } /*und der Aufruf dann so wie du ihn hast im CPP- File von CBenutzer*/ ... CSetPwd setPwd; setPwd.SetDlgPointer(this); setPwd.DoModal(); ...
Grüße, Volle.
-
Warum machst du es nicht einfach so wie ich es beschrieben habe ?
Volle:
Was du ihm die ganze Zeit erklärst ist nichts anderes als meine Beschreibung.
( Übergebe this-Zeiger an Klasse die damit arbeiten kann.)
-
@Unix- Tom:
Ja klar. Aber irgendwie bekommt es Neo nicht hin
...
Vielleicht kannst du es ihm ja beibiegen?
Gruß, Volle.