Initial Diractory eines CFileDialogs



  • Hi,
    habe zwei open-buttons. Einen "normalen" und einen für Beispieldateien. Letzterer startet immer in einem extra angegebenen Verzeichnis; eben in dem, mit den Beispielen..
    Wenn ich aber nun eine Beispieldatei lade und danach den "normalen" Opendialog bemühe, startet dieser auch in dem Beispielverzeichnis. Weil sich irgendwer, irgendwo, irgendwas gemerkt hat.. Ich will aber, dass der "normale" Opendialog in dem Verzeichnis startet, in das zuletzt mit dem "normalen" Dialog gewechselt wurde. Der Beispieldialog darf sich da nicht drauf auswirken..

    Habe folgendes versucht:

    - erstmal das tatsächliche laden der Datei auskommentiert, auch den Aufruf von fileDialog.GetPathName(). Es passiert also definitiv beim Ausführen von fileDialog.DoModal()
    - OFN_NOCHANGEDIR|OFN_DONTADDTORECENT als Flags beim erstellen des FileDialogs
    - vorher das aktuelle Arbeitsverzeichnis merken und danach zurücksetzen
    - CRecentFileList (oderso) versucht zu benutzen, um den MRU-eintrag aus der Regestry zu löschen, den der Beispieldialog anscheinend erzeugt. Hab ich aber (mangels Dokumentation) nicht hinbekommen.

    ... bringt alles nix.

    Kann mir einer weiterhelfen? Dokumentation der entsprechenden MFC-Klassen wär auch schon toll.. Arbeite normalerweise mit Linux und QT. Und bin ein bisschen enttäuscht über die MFC und das, was die offizielle Dokumentation dazu sein soll.. 😞

    Ne tolle Seite mit Beispielen und Howtos?

    Danke im Voraus..

    Ach ja.. kann evlt. ne Woche dauern, bis ich wieder antworte..



  • Schau mal:

    m_ldFile.m_ofn.lpstrInitialDir = "c:\";

    Das ganze giebtes auch als Parmeter bei der Konstruktion. Naja, an die MSDN gewöhnt man sich eigentlich ziemlich schnell (ich würde das gleiche über die QT Docu sagen :))



  • GetCurrentDirectory
    SetCurrentDirectory

    ist das was du brauchst.
    Vor dem Beispieldir GET und danach wieder mit SET zurücksetzen.



  • Danke für die schnelle Antwort.

    Aber mit

    TheBigW schrieb:

    m_ldFile.m_ofn.lpstrInitialDir = "c:\";

    starte ich doch immer gleichen Verzeichnis, oder?
    Hätte schon gerne, dass der Opendialog sich den letzten Pfad merkt, aber der andere Dialog da nicht reinfunkt..

    Unix-Tom schrieb:

    GetCurrentDirectory
    SetCurrentDirectory

    ..hatte ich schon probiert. Jedenfalls mit:

    bla = _getcwd();
    .
    .
    ::SetCurrentDirectory(bla);
    

    oder so ähnlich..
    Würd GetCurrentDirectory mein Problem lösen?
    Kann's jetzt nicht testen. Bin zuhause und der Code auf'e Arbeit..:)

    Meld mich nächste Woche, ob's klappt..



  • Wenn es dein Problem nicht lösen würde, hätte ich es nicht gepostet.



  • SCD/GCD funtioniert zwar, kann dir aber andere Sachen durcheinanderbringen.

    Für ofn.lpstrInitialDir mußt Du Dir von der ausgewählten Datei natürlich den entsprechden Pfad merken.

    ( bequemerweise mittels CPath 🕶 )



  • Hi,
    also GetCurrentDirectory() macht nix anderes als _getcwd(). Ändert also leider nichts..

    peterchen schrieb:

    Für ofn.lpstrInitialDir mußt Du Dir von der ausgewählten Datei natürlich den entsprechden Pfad merken.

    Das ist nicht so toll.. Müsste das dann ja auch irgendwo persistent speichern.. Wie und wo merkt sich denn der Opendialog, was zuletzt geöffnet wurde? Das aktuelle Verzeichnis scheints wohl nicht zu sein.. und die MRU-Liste auch nicht, denn, wie ich bereits schrieb:
    OFN_NOCHANGEDIR|OFN_DONTADDTORECENT liefern auch nicht den gewünschten effekt..

    Es muss doch irgendwie möglich sein, dieses 'feature' ich-merk-mir-das-letzte-verzeichnis abzuschalten...? 😞



  • Hab da noch was gefunden:
    http://www.adminlife.com/247reference/msgs/13/66638.aspx

    Bin also nicht der einzige mit dem Problem.

    Aber das initial directory auf's current directory zu setzen ist auch nicht so toll, weil windows dieses Verzeichnis dann schütz. Man wundert sich dann, warum man es nicht löschen oder umbenennen kann.. Gerade deswegen hatte ich mir vor dem Öfnen des Dialogs das aktuelle Verzeichnis (was normalerweise das Verzeichnis der .exe ist) gemerkt und danach zurückgesetzt..
    Schon bevor ich mich um die Sache mit dem Beispieldialog kümmern wollte..

    Und

    FDialog.m_ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;
    

    ändert auch nix daran.. Bei den Dialogen fehlen nur Buttons, wie 'Desktop' und 'Eigene Dateien'..



  • Das ist nicht so toll.. Müsste das dann ja auch irgendwo persistent speichern..

    ja. Vorzugsweise regisrty / Usersettings

    Wie und wo merkt sich denn der Opendialog, was zuletzt geöffnet wurde?

    Im Prozeß nur während das Programm läuft, also nicht persistent.



  • peterchen schrieb:

    Im Prozeß nur während das Programm läuft, also nicht persistent.

    Ne, das ist nach einem Neustart wieder an der zuletzt besuchten Stelle..
    Also merkt er sich das irgendwo. Wahrscheinlich wohl in der Registry..(?)



  • Hatte es vorher (unter XP) nur mit "Save As" ausprobiert, das bleibt nur während der Prozeß läuft. Für "Open" scheint es aber persistent zu sein.

    Wahrscheinlich wohl in der Registry..(?)

    Mit Sicherheit 🙂
    Aber das ist nicht dokumentiert, geht nur auf bestimmten Versionen, und überhaupt.

    Wie shcon oben gesagt: die sinnvolle Lösung ist, sich das selbst (in der Registry) zu merken, und über ofn.lpstrInitialDir zu setzen.



  • mh.. nagut.. *zähneknirsch*

    Danke für die Hilfe 🙂


Anmelden zum Antworten