OPENFILENAME + Filter



  • Hi,

    ich habe in meiner Openfilename-Struktur eine Filter, den ich zur Laufzeit ändern möchte.

    Ich mache das so:

    sprintf(acText[0], ".%s-Dateien\0.%s\0Alle Dateien\0*.*\0", m_ImportDLLs[LOWORD(WParam)].m_sFilePostfix.c_str(), m_ImportDLLs[LOWORD(WParam)].m_sFilePostfix.c_str());

    acText[0] ist dann der lpstrFilter. Leider Sehe ich nur (bei dem OpenfileDialog) *.TXT-Dateien als Filter ([LOWORD(WParam)].m_sFilePostfix.c_str() ist TXT). Das "Alle Dateien" wurde verschluckt. Wenn ich für \0 \\0 einsetzte, funktioniert es auch nicht.

    Was kann ich dagegen tun,

    danke,

    Chrissi



  • Na gut, geht anscheinend nicht. Aber mal was anderes. Gibt es alternativen für das \0-Zeichen?

    Danke,

    Chrissi



  • Nein, aber du könntest memcpy + Längenangabe benutzen. strcpy hört ja bekanntlich beim ersten \0 auf, zu kopieren.



  • Aha, das mit dem sprintf wusste ich nicht. Aber, wie kann ich bei memcpy das m_ImportDLLs[LOWORD(WParam)].m_sFilePostfix.c_str() reinkriegen? Gibt es da bessere Möglichkeiten als mit Streams?

    Danke,

    Chrissi



  • Hi,

    ich hab jetzt alles versucht (strings + memcpy, streams + memcpy...); nicht klappt.

    Wenn jemand eine andere Idee hat, sollte er/sie sich bitte melden.

    Vielen Dank,

    Chrissi



  • Mal davon abgesehen, dass Du m_ImportDLLs[LOWORD(WParam)].m_sFilePostfix.c_str() in deinem sprintf() zweimal verwendest (ich weiss nicht, ob das so sein soll): Du verwendest ja eh schon die STL mit dem string. Pack dir das Ganze als string zusammen, allerdings mit einem beliebigen ansonsten nicht verwendeten ASCII-Zeichen statt des '\0' (Mein Vorschlag wäre '\t'). Dann holst Du dir den Zeiger auf das eigentliche char-Array und gehst mit ner Schleife durch und ersetzt manuell jedes '\t' durch '\0'. Nicht die sauberste Lösung, aber funktioniert.

    string filter = "*.";
    filter += m_ImportDLLs[LOWORD(WParam)].m_sFilePostfix + "-Dateien\t*." +
              m_ImportDLLs[LOWORD(WParam)].m_sFilePostfix + "\tAlle Dateien\t*.*\t";
    char *szFilter;
    szFilter = const_cast<char*>(filter.c_str());
    for (int i = filter.length();i >= 0;i--)
    {
        if (szFilter[i] == '\t')
        {
            szFilter[i] = '\0';
        }
    }
    


  • Üblich ist für diesen Zweck das | Zeichen.



  • Ringding schrieb:

    Üblich ist für diesen Zweck das | Zeichen.

    Oder halt so. habs halt bisher noch nie versucht und mir so händisch eine Lösung gebastelt


Anmelden zum Antworten