Frage zu Document/View



  • Hallo Gemeinde,
    also ich hab folgendes Problem:
    In meinem MDI-Programm, das auf Doc/View basiert, kann der Benutzer einerseits "normale" Dokumente öffnen, die z.B. irgendwelchen Text beinhalten.
    Der Benutzer kann aber auch ein "Projekt" anlegen, wo er mehrere solcher Dokumente in einer "Projektmappe" ablegen kann.
    Nun dachte ich mir folgendes:
    Ich baue mir eine Symbolleiste, die ein TreeCtrl enthält. Wenn der Benutzer dann eine "Projektmappe" öffnet (normal über Datei, öffnen), dann soll die Datei von meinem Programm gelesen und deren Inhalt im TreeCtrl angezeigt werden (also so Ordner, unterordner etc.). Ansich ist das kein Problem; Ich frage mich nur:
    Wo in meinem Programm muss ich die OnFileOpen-Funktion überschreiben, damit sie mir beim Öffnen eines Projekts nicht ein neues MDI-Fenster erstellt, sondern den Inhalt der Datei dem TreeCtrl übergibt? Wenn der Benutzer dann natürlich eine gewöhnliche Datei, also ohne Projekt, öffnen will, dann soll natürlich das gewohnte Verhalten der MFC sein.
    Wenn mir da einer weiterhelfen kann wäre das echt spitze!
    Grüsse aus der Schweiz


  • Mod

    Das macht die MFC für Dich. Lege einfach die entsprechenden CMultiDocTemplate smit den entsprechenden Dateierweiterungen an. Thats all!



  • Hallo Martin,
    ich weiss, dass das geht!
    Aber das Problem ist das folgende: Erweiterung für normale Dateien ist .dat. Wenn ich eine .dat-Datei öffne, wird automatisch mein CView erstellt, geöffnet, und die .dat-datei geladen.
    Erweiterung eines Projekts ist .prj. Diese Datei enthält im Prinzip nur Verweise auf normale .dat-Dateien. Oeffnet der Benutzer eine .prj-Datei, dann wird wiederum ein CView erstellt und die Datei geladen. Aber genau das soll nicht passieren! Der Dateiname soll nur einer Funktion übergeben werden, die danach die prj-Datei öffnet, und deren Inhalt ins TreeCtrl lädt, das bereits offen ist (!). Siehe Screenshot.
    Geht das überhaupt?

    http://www.imagebam.com/image/1a36d07904185

    So sieht das Programm aus, wenn KEINE Datei geladen ist (die Dinger im TreeView sind nur zum Test).

    http://www.imagebam.com/image/ffa13f7904187

    Wenn der Benutzer ein Projekt öffnet, will ich nicht, dass es in einem neuen Dokumentfenster geöffnet wird wie hier. Stattdessen soll ein neues Element im TreeView erzeugt werden, wo man dann die Struktur des Projekts sieht.
    Im Prinzip soll das Verhalten ähnlich dem Projekt-Explorer von Visual Studio sein. Alles klar? 😉



  • hey Hand67,

    hast das "TreeView" Control fenster schon implementiert? (So wie in den screenshots) ? Wäre cool wenn du den codeschnipsel schicken könntest, sowas brauch ich auch:) 👍


  • Mod

    Aber genau das kannst Du doch mit CMultiDocTemplate's machen.
    Du erzeugst passende Doc/View Kombinationen. Eine für Projekt Doc und Projekt View, eine für Datei Doc und Date View.

    Wenn grundsätzlich eben eine Projektansicht und ein Dokument vorhanden ist, OK, aber auch das geht eben.
    Da Du bei den DocTemplates auch die Klasse für das Frame Window angibst sollte es auch kein Problem sein, ein extra Fenster zu erzeugen wie Du es willst.

    Ich verstehe immer noch nicht was dich hindert mehrere DocTemplates anzulegen und zu benutzen?



  • Hallo BorisDieKlinge,
    Kein Problem, gerne Maile ich dir den Code! Wenns dir nichts ausmacht.
    Ich hab ihn sowieso grade nicht zur Hand, aber heute Abend kann ich ihn dir schicken. Okay?

    @Martin:
    Nichts hindert mich daran, separate DocTemplates zu erstellen. ABER: Ich muss für ein DocTemplate ja ein eigenes CView und ein eigenes CDocument haben. Nehmen wir an, ich habe die Klasse CDookument und CProjekt. Ok. Klickt ich auf Datei, Neu, erschtint der tolle Dialog, was ich gerne erstellen möchte (Projekt oder Dokument). Genau so soll es sein. Wähle ich Dokument, dann wird ein neues CDokumentView erstellt und angezeugt. Das ist auch super.
    Whle ich jedoch Projekt, dann wird eben auch wieder ein MDI-Kindfenster erzeugt! Und genau das will ich nicht. Schau dir mal den Projekt-Explorer im Viszal Studio an, genau dieses Verhalten will ich nachbilden!

    Grüsse


  • Mod

    Mir ist klar, was Du willst, Du liest aber nicht was ich schrebe!
    Ist Dir aufgefallen, dass man seine eigene Frame Klasse hier angeben kann? Es liegt an Dir wie diese Klasse erzeugt wird und welchen Typ sie hat und was für eine Art Fenster diese erzeugt. Du bist hier nicht an MDI gebunden...



  • @Martin:
    Ach sooo! Jetzt verstehe ich was du meinst. Geniale Idee!
    Im Konstruktor der CProjectView-Klasse kann ich das Projekt zum TreeView hinzufügen. Oder?
    Ich muss dann einfach dafür sorgen, dass kein eigenes Fenster erzeugt wird...
    So meinst du oder?



  • Hey Hans,

    kannst es hier hin schicken? thanma@gmx.net


  • Mod

    Hans67 schrieb:

    @Martin:
    Ach sooo! Jetzt verstehe ich was du meinst. Geniale Idee!
    Im Konstruktor der CProjectView-Klasse kann ich das Projekt zum TreeView hinzufügen. Oder?
    Ich muss dann einfach dafür sorgen, dass kein eigenes Fenster erzeugt wird...
    So meinst du oder?

    Ich kenne Deine Klassen nicht. Ich würde eine eigene CTreeFrame Klasse erzeugen, die meinen CTreeView beherbergt. Nix trixen mit den Konstruktoren.

    Das DocTemplate sollte den Rest machen.


Anmelden zum Antworten