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