anfängerproblem getter-methode
-
CStatForm1 * form1 = (CStatForm1 * form1); // (C)
böser Typo
soll heißen
CWnd * pane1wnd = splitter.GetPane(1); // (A) _ASSERTE(pane1wnd && pane1wnd->IsKindOf(RUNTIME_CLASS(CStatForm1)); // (B) CStatForm1 * form1 = (CStatForm1 *) pane1wnd; // (C)
Nochmal in Kurzform: (A) holt sich dasform als CWnd * (basisklasse), (B) checkt, ob es sich dabei tatsächlich um ein StatForm1 handelt, (C) macht den cast.
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { if(!splitter.CreateStatic(this,1,2) || !splitter.CreateView(0,0,RUNTIME_CLASS(CStatForm1),CSize(165,0),pContext) || !splitter.CreateView(0,1, RUNTIME_CLASS(CStatForm2),CSize(0,0),pContext)) return false; CWnd * w1 = splitter.GetPane(0,0); _ASSERTE(w1 && w1->IsKindOf(RUNTIME_CLASS(CStatForm1)); // (B) CStatForm1 * form1 = (CStatForm1 *) w1; // (C) CWnd * w2 = splitter.GetPane(0,1); _ASSERTE(w2 && w2->IsKindOf(RUNTIME_CLASS(CStatForm2)); // (B) CStatForm2 * form2 = (CStatForm2 *) w2; // (C) form2->m_pForm1 = form1; // (D) }
Ist natürlich nciht compiler-getestet, aber sollte gehen
-
Hi,
vielen dank.
klappt soweit mit dem kompilieren.
aber irgendwie kann mir nicht vorstellen, wie ich diese zeiger dann in den formviews nutzen kann (war klar, dass das jetzt kommt , oder?)
hab jetzt mehrere varianten des einbindens von mainframe in die views versucht.
von neudefinition bis unbekannt waren alle fehlermeldungen dabei.dann probiert, einen zeiger auf mainframe zu setzen, um an die zeiger zu kommen, die ich zuvor mal in der mainfrm.h dekl. habe.
CMainFrame *pMainFrame = (CMainFrame*)GetParentFrame();
leider auch erfolglos.aber wenn ich das so mache, kann ich ja auch die jetzt laufende variante:
CMainFrame *pMainFrame = (CMainFrame*)GetParentFrame(); CMyTreeView *pTree = (CMyTreeView*)pMainFrame->splitter.GetPane(0,0);
benutzen.
dein zugriff (D) funktioniert doch höchstens in mainframe?
wobei ich form2->m_pForm1 = form1, also die zuweisung eines zeigers an einen zeiger, der auf seinen member zugreift, gar nicht checke.eigentlich wollte ich ja, "nur" den zeiger auf das andere form haben, um auf seine memeber zugreifen zu können.
wie nutze ich die zeiger in den forms???
(bitte um den finalen rettungsschuss, damit ich das hier endlich los bin
)
aber erstmal 99999
gruss
der ferngesteuerte
-
m_pForm1 sollte ein member (CStatForm1
von CStatForm2 sein. Den initialisierst du im Konstruktor schön brav auf NULL, und im OnCreateClient gibst du dort dann den Zeiger auf den anderen View zurück.
Über m_pForm1 können alle Memberfunktionen von CStatForm2 auf das erste form zugreifen.
Das war doch, was du wolltest, oder?
-
hier geht die sonne auf!
wie kann ich dir danken!aber fieseste pferdefüsse noch gefunden:
1)
in StatForm2.cpp muss die (statform1.h) vor die statform2.h
(aber irgendwie klar, wenn mans genauer anschaut - erst tanken dann losfahren)
- die deklaration von m_pForm1 in StatForm2.h darf man nicht einfach ans ende des public-blocks setze, sonst fehler: kein zugriff aud protected-element das in statform2 dekl. wurde (???), sondern direkt hinter den konstruktor statform2() - da war ich heute morgen schon und habs nicht geschnallt.
Mal ehrlich, das macht einen newbee doch irre!?!
aber die geschichte "zeiger mitgeben" is jetzt klar.aber sei's drum. dafür muss man in c++ wohl nie sagen: "geht nicht".
also super 1000 dank und noch einen schönen feiertag.
gruss
der ferngesteuerte
-
Mal ehrlich, das macht einen newbee doch irre!?!
100%
Mein Problem ist ein ganz anderes dabei: Die Frage taucht in ähnlicher Form oft auf, und ist "irre simpel" (zumindest für jemanden der wie ich seit ca. 8 Jahren intensiv mit C++ "dabei" ist). Man sieht einfach die Hürden nicht mehr.
Darf ich dich also fragen: wieviel C++ hast du vorher gemacht? Kurse, Projekte usw.
-
Hi,
c++ hab ich im studium ein pflichtsemester machen müssen.
damals schlechter abgeschnitten und wieder alles vergessen.
bis dato nix mehr gemacht.
zur zt arbeitet ich als datenbank und netzwerkadmin und programmiere in php, gtk-php, auto-it und sehr viel sql. also eher scripting.
will jetzt in windows einsteigen, da lag c++/mfc nahe.
was mich jetzt schon wieder etwas annervt, ist die frage:mfc, rtti, wfc, atl etc pp - da muss ich mich erstmal schlau machen.
wo soll das hinführengruss
der ferngesteuerte
-
Du hast das .NET-Framework vergessen
Aber ich will mal behaupten wenn man es schafft durch die MFC und WinAPI durchzublicken kann einen "fast" nix mehr abschrecken
-
Ich denke nicht mal, das es so verkehrt ist, die "Grundlagen" zu lernen.
Man lernt nur halt drei Sachen auf einmal:
C++ (Syntax+Konzepte)
WinAPI (Windows-Programmierung allgemein)
MFC (WinAPI-Wrapper / "Halb-Plattform")Und das ist ohne Frage schwierig.
-
Ich hab' vor einer Weile mal auf eine Frage "How to become a (C++/MFC) Pro" eine sozusagen Roadmap geschrieben, welche Reihenfolge ich empfehlen würde:
http://www.codeproject.com/script/profile/whos_who.asp?msg=900509&id=175#xx900509xx
-
wahrscheinlich ist deine road-map ein guter weg zum erfolg.
allerdings ist es doch auch möglich, ein konkretes projekt vor augen zu haben und das ganze erstmal in einem einfachem dialog zu machen.
da sind es doch immer wieder dieselben dinge: daten einlesen (per tastatur, file oder datenbank) dann verarbeiten , dann in geeigneter form ausgeben.
der nächste schritt sind dann zwei forms und deren komunikation, dann zwei views usw. die probleme, die dann auftauchen, versucht man zu lösen.
für viele ist das lösen von aufgaben anhand von beispielen wesentlich einfacher als über syntaxbeschreibungen. der mensch denkt in bildern! die wenigsten anfänger werden wissenschaftlich-strukturiert vorgehen.
wenn man dann mal eine map braucht, schaut man sich die stl dinger an und baut das ein.
ich denke da auch an die motivatorischen ereignissen, wenn also das erste windows-fenster das erste tree-control anzeigt z.b.
ich glaub so machen es viele anfänger, und auch viele bücher gehen diesen weg.
die c++-techniken in konkreten gui-kleinprojekten anwenden und dann auf die gabe der abstraktionsfähigkeit hoffen, damit das gelernt anderweitig anwendbar wird.
der trend geht doch auch zu diesen rap-tools, die die ganze c++ zeigerei vor den user verbergen- deswegen ist wohl auch java so erfolgreich. und selbst c++ hat mit der einführung von referenzen dem wohl ein wenig rechnung tragen wollen.
denke, die nutzung und kommunikation zwischen der wesentlichen datenstruktur in c++, der klassen, ist mit das wichtigste, alles weitere kommt dann schon. dazu braucht man natürlich c++ und sein zeigerkonzept
die wahrheit hat viele gesichter ...gruss
der ferngesteuerte
-
ein guter weg zum erfolg
Auf all Fälle, ist ja eher eine Anregung. Ich habe selbst "Am lebenden Objekt" gelernt, und wollte man sich an die Liste halten, bräuchte man auf jeden Fall kleine Projekte, die die einzelnen Schritte "mit Leben" füllen.
Die Liste spiegelt meine Erfahrungen (mit mir selbst und anderen) wieder was man alles braucht. Die Reihenfolge ist eher akademisch.
Trotz aller Individualität halte ich ein solides C++ - Fundament langfristig für unabdingbar. Dazu gehört viel mehr als nur die Sprache, im Prinzip ein ganzes "Gesetzeswerk", was gut ist und was nicht.
Um dein Beispiel aufzugreifen - natürlich kann man sich bei Bedarf mit der Doku hinsetzen und sich std::map anschauen - so wird sicherlich jeder seine ersten Erfahrungen mit der STL sammeln. Und das genügt für Hobby, Uni, und abgeschlossene Ein-Mann-Projekte durchaus.
Solltest Du dich jemals bei mir bewerben (
), erwarte ich schon, daß du über die STL etwas mehr als nur "da gibt es map und set und vector" weißt (bzw. bereit und fähig bist, dir das "nebenbei" anzueignen). Und das bekommt mit mit ein, zwei gezielten fragen ganz fix raus.
Insofern kann man meine Liste als Anregung sehen, das angesammelte Wissen Stück für Stück zu systematisieren, wenn man sich langfristig in der C++ - Desktopentwicklung spezialisieren will