Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Zugriff auf MFC-Klassen untereinander

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
14.10.2004, 17:50 Uhr
tronaccount



Hallo!

Bin ein Anfänger in der OOP und habe mit der MFC vor vier Wochen begonnen.
Mein Programm lädt Daten, besitzt auf der einen Hälfte des Bildschirms einen Steuerbereich und einen Darstellungsbereich für die geladenen Daten.
Dafür habe ich eine SDI-Anwendung erstellt mit einem

CFrameWnd als Basisklasse für das Fenster, aufgeteilt in ein
CFormView für die Steuertafel (mit MFC-Steuerelementen, d.h. Slidern etc.) und ein
CView für die Graphikdarstellung.

Für das Laden der Daten ist das automatisch generierte CDocument zuständig.

Jetzt hätte ich ein paar Fragen:

1. Damit alle Fenster auf alle Daten Zugriff haben, wäre es doch am sinnvollsten, die Daten im CDocument auszuwerten und in eine public-Variable zu speichern. Das heißt, alle gemeinsamen Daten gehören zu CDocument und über den vom Assistenten generierten pDoc-Pointer kann ich von allen Klassen aus drauf zugreifen.
Macht man das so?

2. Wie aber verhält sich das mit den Variablen für die Steuerbefehle? Die gehören zur Steuertafel und sind für das Darstellungsfeld. Soll ich sie trotzdem in eine Variable des Dokuments speichern? Eigentlich hat das Dokument damit gar nichts zu tun... Wie bekomme ich sonst Zugriff von der Steuertafel auf das Darstellungsfeld um umgekehrt?

3. Ich möchte gern nach dem Laden (Serialize-Funktion des Dokuments) eine Funktion - so eine Art Reset-Funktion, um alle Steuerelemente auf Null zu setzen - ausführen. Dazu müßte ich vom Dokument aus auf die Steuertafel-Klasse zugreifen - wie mache ich das? Auch über den pDoc-Umweg? Folgendes klappt nicht:


C++:
#include "CommandPane.h" //meine Steuertafel-Klasse
.
.
.
void CSDIFrameDoc::Serialize(CArchive& ar)
{
.
.
.
CCommandPane.Reset() //Funktion zum Reset; ist public
}



Danke schonmal für Eure Tips

Dieser Post wurde am 14.10.2004 um 17:52 Uhr von tronaccount editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.10.2004, 21:11 Uhr
ao

(Operator)


1. Member-Variablen public machen ist meistens der falsche Weg, weil du dann nicht mehr kontrollieren kannst, wer wann welche Daten abholt oder verändert. Mach sie private (oder protected, falls du noch weiter ableiten willst) und definiere öffentliche Zugriffsmethoden, damit hast du die Kontrolle wieder.

2. Deine Beschreibung ist ein bisschen abstrakt, aber normalerweise speichert man Daten in dem Objekt, zu dem sie sinngemäß gehören. Also die Daten der Steuertafel im Steuertafel-Objekt und nirgends sonst. Der "zentralistische" Ansatz (Document weiß alles, alle anderen fragen Document) ist wahrscheinlich falsch; Document muss wahrscheinlich nichts wissen über die Einstellungen von CommandPane. Sollte es dann auch nicht.

3. Document::Serialize ist eigentlich *nur* dafür da, ein Dokument zu laden und nicht, irgendwelche Steuerelemente zu initialisieren. Was ist, wenn die Dokument-Klasse im nächsten Projekt wieder verwendet werden soll? Da gibts dann diese Steuertafel womöglich gar nicht, aber Document verlangt eine, damit Serialize durchläuft - das kann nicht sein. Designfehler. Wer ruft denn Document.Serialize auf? Kann der nicht danach Reset auf dem CommandPane machen?

Außerdem: CCommandPane ist eine Klasse; um Reset aufzurufen brauchst du aber eine Instanz der Klasse:


C++:
CCommandPane cpPane;
cpPane.Reset ();



Das ist ein Primitivbeispiel, möglicherweise hantierst du auch mit Referenzen oder Pointern auf CCommandPane.

Allgemein: Ich fürchte, du baust gerade ein wildes Durcheinander aus gegenseitigen Abhängigkeiten. Kann leicht passieren, dass so ein Programm sich nicht wieder runterfahren lässt, weil du es nicht mehr schaffst, die Verflechtungen in der richtigen Reihenfolge zu lösen.

Du hast angefangen zu programmieren ohne klare Vorstellungen von deinem Modell, und jetzt wirds immer komplizierter, stimmts?

Mach als allererstes ein klares Design und lege fest, wer welche Infos hat und wer wie mit wem zusammenarbeitet. Ordne dabei jede Information dem Objekt zu, dem sie natürlicherweise gehört und halte die Anzahl der Kreuz-und-Quer-Verbindungen möglichst klein.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.10.2004, 22:17 Uhr
tronaccount



zu 1. Okay, das sehe ich ein.

zu 3. Die Initialisierung findet in der Reset-Funktion des Bedienpanels statt.
Ich will diese Funktion nach dem Laden (daher die Serialize-Funktion im Dokument) nur aufrufen, weil nach dem Laden im Bedienpanel alles genullt werden soll.
Natürlich läßt sich die Reset-Funktion - die ja zum Bedienpanel gehört - auch alleine aufrufen.
Und die Serialize()-Funktion wird vom Assistenten automatisch generiert und wird aufgerufen, wenn der Bediener im Menü Datei->Öffnen auswählt - das ist schon fertig programmiert.

Mir geht eigentlich darum, wie ich prinzipiell Daten untereinander austauschen kann/sollte...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.10.2004, 22:23 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ich muss gestehen ich mach das aus Faulheit auch immer schmutzig...
die leicht bessere Variante ist SendMessage/PostMessage zu verwenden... gibts glaube ich auch beispiele dazu im Forum...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.10.2004, 01:10 Uhr
tronaccount



Das Problem:

SendMessage klappt nur, sofern man Funktionen ansprechen will, die über eine WindowsMessage aufgerufen werden.

Ich möchte aber eine selbstdefinierte Funktion aufrufen..
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.10.2004, 12:12 Uhr
ao

(Operator)



Zitat von tronaccount:
Und die Serialize()-Funktion wird vom Assistenten automatisch generiert und wird aufgerufen, wenn der Bediener im Menü Datei->Öffnen auswählt - das ist schon fertig programmiert.

Trotzdem ist es der falsche Ort, um Sachen aufzurufen, die mit dem Laden des Dokuments nichts zu tun haben.

Das ist so ähnlich wie Milchpulver ins Kaffeemehl zu schütten, damit unten Kaffee mit Milch rauskommt. Geht, ist aber pervers. Und was machst du, wenn einer schwarzen Kaffee will?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.10.2004, 20:24 Uhr
Darky



caste halt

BSP:

zugriff auf CMAinframe

C++:
//casting
CMainFrame* pFrm = dynamic_cast<CMainFrame*>(AfxGetApp()->GetMainWnd());
//zugriff            
pFrm->Funktion oder Variable(achtung müssen public sein)            



zugriff auf CDocument

C++:
CmeineDoc* pDoc=dynamic_cast<CmeineDoc*>(GetDocument());    

pDoc->Funktion oder Variable



zugriff auf CWinApp

C++:
CmeineApp* pApp=dynamic_cast<CmeineApp*>(AfxGetApp());

pApp->Funktion oder Variable



usw.......
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: