Was änliches wie CFileDialog



  • dito



  • Es ist ja nicht so, dass ich die ganzen Hilfen nicht schon durchforstet hätte.. Mein Problem ist einfach, dass ich mittels CFileDialog keine Ordner auswählen kann. Das Vorbelegen ist hier nicht das Problem. Auf der anderen Seite kann ich beim SHBrowseForFolder nicht sagen, welcher Ordner geöffnet werden soll...

    Richtig?

    Christian
    (Vormals Wissbegieriger)



  • genau wen man mit CFileDialog orndner öffnen könnte wer das kein proplem.
    aber da das nicht get der code oben.

    aber wie forbelegen in den FAQ habe ich auch plos was zum CFileDialog gefunden.

    MFG TaccoGo



  • hy ,

    was meinst du mit :
    ..mit CFileDialog orndner öffnen könnte..
    du willst keine datei wählen , richtig ? warum soll das denn nicht gehen ?



  • Naja, wenn man im CFileDialog auf öffnen klickt, wird nicht der Ordner ausgewählt... Ein Flag kann ich nirgends setzen um das umzustellen (jedenfalls finde ich es nicht).



  • bei CFileDialog wirt immer nur eine datei ausgewält

    MFG TaccoGo



  • @Little_Bird :
    es ist zwar richtig dass beim öffnen klicken normalerweise ein file gewählt sein muss aber , du kannst doch selbst bestimmen was er bei OnOK() machen soll
    der ordner steht doch als file da , musst nur den string kürzen..
    (substring usw.)

    @TaccoGo: da gibt es sowas wie allowmultiselect oder ähnlich .. damit kann man mehrere dateien gleichzeitig öffnen



  • ich möchte auch nur den ordner.

    das mit den strin kürtzen get aber nicht den ok zu kliken muss ich eine datei wälen aber in den ortner sind nut wietere ortner und keine dateien.

    MFG TaccoGo



  • Hallo WuTangl!

    Erstmal vielen Dank für Deine Bemühungen!

    Den String würde ich ja kürzen, davon bekäme der Benutzer ja nix mit --> Es geht aber nicht, dass der Anwender des Programms eine Datei auswählen muss, wenn er doch eigentlich einen Ordner auswählen soll. Immerhin gibt es auch Ordner, in denen zunächst einmal keine Dateien sind..

    Nein, das ist keine Lösung.



  • Hallo,

    kent keiner ne lösung vür das problen???? 😕 😕

    ich habe in der BROWSEINFO striktur den pidlRoot wert versucht zu fülle aber das klapt nicht gans.

    MFG TaccoGo



  • Guten Morgen TaccoGo !

    Folgendes: Ich habe es jetzt geschafft den Wert für pidlRoot mit meinen gewünschten Ordner vorzubelegen. ( Über das das IShellFolder-Interface mit ParseDisplayName() [siehe hier]).

    Nur ist das nicht ganz was ich mir vorgestellt hatte... denn so kann man in der Verzeichnisstruktur nur noch unterhalb des vorbelegten Ordners browsen ( ist ja auch logisch, wenn der als Root festgelegt wird ).

    Also der Weg muss über den CFileDialog gehen. Und hier gibt es mit Sicherheit auch eine Lösung, denn wenn ich mit dem Studio ein neues Projekt anlege, muss ich mit eben diesem Dialog auch einen Ordner auswählen - da geht das also ganz wunderbar.

    Kann doch nicht angehen, dass das keiner hier weiss 😃 😉

    so long, Christian



  • nun werde ich dan mal nach möglichkeiten in CFileDialog suchen.

    wen du oder irgendjemand was raus findet schreibt bitte.

    MFG TaccoGo



  • Hy ,
    mittels CFileDialog ist es def. nicht möglich(es gibt dort keine flags) ...
    Also der ansatz muss mittels SHBrowseForFolder gehen ..



  • Hallo,

    SHBrowseForFolder benutze ich ja schon aber da kann ich doch nichts einstelen oder?

    void COberflche_alkDlg::OniFldPfad() 
    {
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    	// verzeichnis auswahlen für zubearbeitende projekte
    
    	BROWSEINFO bi = { 0 }; 
    	bi.ulFlags=BIF_EDITBOX;
    	bi.lpszTitle = _T("Bitte wählen Sie das gewünschte Verzeichnis :"); 
    	LPITEMIDLIST pidl = SHBrowseForFolder (&bi); // HIER
    	if (pidl != 0) 
    	{ 
    		TCHAR path[MAX_PATH];
    		if (SHGetPathFromIDList(pidl, path)) 
    		{ 
    			m_iFld.Format("%s",path);
    			char inBuf[255];
    			Oeffnen(inBuf);
    			m_ausg="";
    			UpdateData(FALSE);
    		} 
    		IMalloc * imalloc = 0; 
    		if (SUCCEEDED(SHGetMalloc(&imalloc))) 
    		{ 
    			imalloc->Free (pidl); 
    			imalloc->Release(); 
    		} 
    	}
    }
    

    MFG TaccoGO



  • Endlich, ich habs raus ! (Puh ... *SchweissVonDerStirnWisch*)

    Also: Du setzt für lpfn der BROWSEINFO-Struktur die Adresse zu einer CallBackFunktion (mit folgendem Aufbau):

    int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
    {
    	//Hier wird die Selektion im Tree gesetzt
    	if (uMsg == BFFM_INITIALIZED)
    	{
                  SendMessage(hwnd, BFFM_SETSELECTION, FALSE, lpData); 
    	}
    	return FALSE;
    }
    

    Ausserdem hat die BI-Struktur noch einen lParam-Wert, dem Du deinen pidl übergibst.

    So wird, nachdem Der BFF-Dialog initialisiert ist, eine Nachricht an den Dialog gesendet, der Dir Deinen Pfad auswählt. 👍

    Geil, was 😃

    [Edit]
    Siehe auch hier und hier



  • Hm, ist ja lustig was ihr damacht.
    Nur gibts dass schon längst...

    http://c-plusplus.net/forum/viewtopic.php?t=39127&highlight=browse

    ein Blick in die FAQ hätte genügt...

    Devil



  • Manchmal ist man halt stockendoof... habs überlesen...

    Naja, Hauptsache es geht jetzt !

    😞



  • Hallo Little_Bird,

    super arbeit.

    aber ich bin gerade zu dummzu wie übergebe ich lpfn die addresse der CallBackFunktion?? 😕

    und wo soll der pfad hin?? 😕

    Danke

    MFG TaccoGo



  • BROWSEINFO root; 
    root.lpfn = &BrowseCallbackProc; // <- Adresse der CallBackFunktion
    root.lParam = (LONG_PTR)pidl;    // <- Übergabe der pidl
    
    SHBrowseForFolder(&root);
    

    That's it !



  • das seit jetzt so aus

    int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData);
    void COberflche_alkDlg::OniFldPfad() 
    {
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    	// verzeichnis auswahlen für zubearbeitende projekte
    
    	static BROWSEINFO bi = { 0 }; 
    	bi.lpszTitle = _T("Bitte wählen Sie das gewünschte Verzeichnis :"); 
    	LPITEMIDLIST pidl;
    	bi.lParam=(long)pidl;
    	pidl = SHBrowseForFolder (&bi); 
    	if (pidl != 0) 
    	{ 
    		TCHAR path[MAX_PATH];
    		if (SHGetPathFromIDList(pidl, path)) 
    		{ 
    			m_iFld.Format("%s",path);
    			char inBuf[255];
    			Oeffnen(inBuf);
    			m_ausg="";
    			UpdateData(FALSE);
    		} 
    
    		IMalloc * imalloc = 0; 
    		if (SUCCEEDED(SHGetMalloc(&imalloc))) 
    		{ 
    			imalloc->Free (pidl); 
    			imalloc->Release(); 
    		} 
    
    	}
    
    }
    
    int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData) 
    { 
        //Hier wird die Selektion im Tree gesetzt 
        if (uMsg == BFFM_INITIALIZED) 
        { 
                  SendMessage(hwnd, BFFM_SETSELECTION, FALSE, lpData); 
        } 
        return FALSE; 
    }
    

    nur kommt da wen ich auf den button klike ein speicherfehler?

    MFG Tacco


Anmelden zum Antworten