Problem beim Konfigutation einlesen



  • Hallo liebe Gemeinde,
    ich habe mal wieder ein großes Problem...

    Und zwar lese ich Daten aus einem ASCII-File mit einem selbstgeschriebenen Parser ein. Diesen habe ich in einer extra Klasse gekapselt.
    Funktioniert soweit auch alles, nur dass ich die Daten brauche, bevor die View-Klasse ihre OnCreate() ausführt, da ich dort diese Daten bereits benötige.

    Folgendes hab ich bisher versucht:

    CReadConfig *pReadConfig = new CReadConfig;
    pReadConfig->ReadFile();
    delete pReadConfig;
    

    Mit diesem Aufruf lese ich das File komplett ein.
    Da die Daten aber in der Dokumentenklasse, liegen, hole ich mit in der Klasse
    CReadConfig folgendermaßen einen Pointer auf die Dokumentenklasse

    CMainFrame* pMainFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
    CServerDoc *pDoc=(CServerDoc*)pMainFrame->GetActiveDocument();
    

    und schreibe dann den Datensatz in die Klassenvariable des Dokuments:

    pDoc->AddData();
    

    Jetzt habe ich aber das Problem, dass ich den Pointer auf die Dokumentenklasse immer erst dann bekommen, wenn die OnCreate() der View schon ausgeführt ist.
    habs in der InitInstance probiert, in der Mainframe und im Konstruktor des Dokuments. Was ich bräuchte wäre also ein Punkt, beim starten des Programms, wo das Dokument bereits existiert, die View aber noch nicht.
    Gibts es den? Bitte helft mir bei der Suche nach dem G-Punkt der Konfiguration, ich verzweifle :p

    Grüße Squeegee



  • Was spricht gegen den Konstruktor des Dokuments? Früher geht es sowieso nicht, da das Dokument ja dann noch gar nicht besteht 😉



  • Hallo,
    ja, das hatte ich vergessen zu erwähnen, offensichtlich habe ich im Konstruktor der Dokumentenklasse noch kein MainFrame oder so irgendwas. Auf alle Fälle bekomme ich den gleichen Fehler, nämlich Speicherzugriffsverletzung bei 0x0000.

    Das liegt daran, dass eine der Methoden bei meinen lustigen Pointer-auf-Dokument holen NULL zurückgibt, wenn er nix findet.

    Gibt es irgendeine andere Möglichkeit, Daten von meiner CReadConfig-Instanz zurück in die Dokumentenklasse zu bekommen? Für ne Message bräuchte ich halt auch wieder einen Pointer... und ob die Dokumentenklasse überhaupt Messages empfangen kann oder nicht, darüber scheinen sich die Geister zu scheiden. MSDN behauptet zwar ja, aber viele andere behaupten nein.

    Grüße Squeegee



  • Hallo,

    es ist IMO ein großer Fehler, Daten in die DocView zu stark einzuweben
    und ich mache das nur noch so weit wie nötig. Das Design ist nicht
    sonderlich gut gelungen, da die meisten Dinge kaum oder gar nicht
    wiederverwendbar sind. So kann z. B. ein Splitterwindow nur erinmal
    verwendet werden. Aus Sicht eines generischen Komponentenentwicklers
    kann man da nur dien Kopf schütteln.

    Genug gelästert:

    Bei mir hat sich folgendes Vorgehen als am geeignesten
    rausgestellt:

    - Erstelle eine Klasse die nur diese Daten kapselt.
    - Erstelle eine Klasse die mit dieser Klasse arbeitet.

    Auf diese Weise erhälst du wiederverwendbaren Code, den du z. B.
    auch unter Linux laufen lassen könntest. In jedem Fall verhinderst
    du so Abhängigkeitsalbträume und das Ganze kann dich zu besser
    strukturiertem Arbeiten anleiten.



  • Hallo nemeses,
    ja, so langsam komme ich irgendwie auch auf den Trichter, dass das mit dem MFC-Dok/View Zeug irgendwie manchmal zu architektonischen Klimmzügen zwingt.

    Leider kann ich meine Software beim jetzigen Stand nicht mehr auf die Schnelle umstrukturieren... Es ist nämlich ne Diplomarbeit und der Abgabetermin rückt näher und näher 😃

    Na ja, und vorher hab ich das Problem auch gelöst bekommen:
    Man übergebe in einer Methode den this Zeiger des DoKumentes als CDocument*
    an die Klasse CReadConfig. Dort kann man diese als Membervariable speichern.
    Leider lässt sich, warum auch immer, kein Pointer vom Typ meiner abgeleiteten Dokumentenklasse in der Klassendeklaration anlegen, er behauptet er kennt sie nicht (Headerfiles sind da).
    In der Implementierung geht das aber wohl, deswegen caste man an der benötigten Stelle den als Klassenvariable angelegten CDocumentpointer auf die eigene Dokumentenklasse, mache, was man machen will und verwerfe den cast danach wieder.
    Soviel zum Thema architektonische Klimmzüge... 🕶

    Bei meinem nächsten Projekt, werde ich aber garantiert mal deine Methode testen.

    Gruß Squeegee


Anmelden zum Antworten