Avatar billede ormurin Nybegynder
10. juni 2003 - 19:02 Der er 23 kommentarer

BrowseFolder Dialog

Hej.

Hvordan laver jeg en dialog, hvor jeg beder brugeren vælge et directory (grafisk vælgning, hvor brugeren ser hele træet)? Det er en predefined dialog, tror jeg, men eg finder ikke ud af det.
Avatar billede bertelbrander Novice
10. juni 2003 - 19:40 #1
Den hedder SHBrowseForFolder, find den i din compilers dokumentation.
Avatar billede killer_bee Nybegynder
11. juni 2003 - 08:41 #2
hvis du bruger MFC så vil en browse function se således ud:

CString Browse()
{

    UpdateData(TRUE);
    BROWSEINFO browseInfo;

    //--------------------------------------------------------------------
    // Local variables for use in th BROWSEINFO struct
    //--------------------------------------------------------------------
    char res[MAX_PATH];
    char path[MAX_PATH];
    HWND hWnd;
    hWnd = this->GetSafeHwnd();

    //---------------------------------------------------------------------
    // pointer to a Item ID list
    //---------------------------------------------------------------------
    LPCITEMIDLIST selectedPidl;

    browseInfo.hwndOwner = hWnd;
    browseInfo.pidlRoot = NULL;
    browseInfo.pszDisplayName = res;
    browseInfo.lpszTitle = "Select folder";
    browseInfo.ulFlags  = BIF_RETURNONLYFSDIRS;
    browseInfo.lpfn = NULL;
    browseInfo.lParam = NULL;

    selectedPidl = SHBrowseForFolder(&browseInfo);

    //---------------------------------------------------------------------
    // Translating the item ID list to a human readable CString
    //---------------------------------------------------------------------
    SHGetPathFromIDList(selectedPidl, path);

    return (CString)path;
}
Avatar billede ormurin Nybegynder
11. juni 2003 - 13:46 #3
hm, jeg lige begyndt at lave windows programmer. hvor og hvordan skal jeg indsætte det der (killer_bee)?

Jeg bruger dette til at åbne filer med; kan jeg ikke lave det på tilsvarende måde?

OPENFILENAME ofn;
    char szFileName[MAX_PATH] = "";

    ZeroMemory(&ofn, sizeof(ofn));

    ofn.lStructSize = sizeof(ofn); // SEE NOTE BELOW
    ofn.hwndOwner = hwnd;
    ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
    ofn.lpstrFile = szFileName;
    ofn.nMaxFile = MAX_PATH;
    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    ofn.lpstrDefExt = "txt";

    if(GetOpenFileName(&ofn))
    {
        // Do something usefull with the filename stored in szFileName
    }
Avatar billede killer_bee Nybegynder
11. juni 2003 - 13:51 #4
Det er jo næsten det samme.. min kode viser bare kun folders.. det er jo det du vil have ikke? Du laver bare en funktion og kopierer det kode i den.. Jeg forstår ikke helt hva du har problemmer med.. ? foklar lidt mere .. måske vis lidt af din kode.
Avatar billede ormurin Nybegynder
11. juni 2003 - 15:00 #5
Jeg får ikke din kode at virke.
Eg prøvede at include headeren til BROWSEINFO, det virkede
Men så prøvede jeg at include headeren til CString, findes ikke.
Hvad går Cstring ud på?

Det må være fordi du bruger MFC (hvad er det?).
Avatar billede killer_bee Nybegynder
11. juni 2003 - 17:07 #6
Ja jeg bruger MFC... skrev også i det første svar... men du skal ikke bruge CString.. prøv sadan:

Browse()
{

    UpdateData(TRUE);
    BROWSEINFO browseInfo;

    //--------------------------------------------------------------------
    // Local variables for use in th BROWSEINFO struct
    //--------------------------------------------------------------------
    char res[MAX_PATH];
    char path[MAX_PATH];
    HWND hWnd;
    hWnd = this->GetSafeHwnd();

    //---------------------------------------------------------------------
    // pointer to a Item ID list
    //---------------------------------------------------------------------
    LPCITEMIDLIST selectedPidl;

    browseInfo.hwndOwner = hWnd;
    browseInfo.pidlRoot = NULL;
    browseInfo.pszDisplayName = res;
    browseInfo.lpszTitle = "Select folder";
    browseInfo.ulFlags  = BIF_RETURNONLYFSDIRS;
    browseInfo.lpfn = NULL;
    browseInfo.lParam = NULL;

    selectedPidl = SHBrowseForFolder(&browseInfo);

    //---------------------------------------------------------------------
    // Translating the item ID list to a human readable CString
    //---------------------------------------------------------------------
    SHGetPathFromIDList(selectedPidl, path);

    return path;
}
Avatar billede arne_v Ekspert
11. juni 2003 - 17:09 #7
MFC = Microsoft Foundation Classes = stærkt objekt orienteret bibliotek som kun er i MS VC++
Avatar billede ormurin Nybegynder
11. juni 2003 - 17:17 #8
hm,

Browse() (???)

den går compileren ikke helt med til.. bruger du nogle .h som normale compilere har?
Avatar billede killer_bee Nybegynder
11. juni 2003 - 18:06 #9
nej.. hør her.. Browse() er bare det funktionsnavn jeg har valgt.. kald det hvsomhelst... det er koden ind i funktionen som gør arbejdet.. bare kopier det i din program.. jeg ved ikke hvordan du har opbyget din applikation..
post noget kode evt..
Avatar billede olennert Nybegynder
11. juni 2003 - 18:21 #10
killer_bee> Din Browse() funktion returnerer en lokalt allokeret variabel. Måske gør VC++ at det går godt, men det er alligevel ikke pænt. Alloker path et andet sted, eller lad den der kalder Browse() om at allokere den. Og hvis det er C++, så brug en std::string reference i stedet for:

void Browse(std::string& path);
Avatar billede arne_v Ekspert
11. juni 2003 - 18:26 #11
Jeg tror ikke at der er nogen C/C++ compilere hvor det er sikkert
ar returnere en pointer til en lokal variabel.
Avatar billede bertelbrander Novice
11. juni 2003 - 20:12 #12
>arne_v: Borland Builder kan også lave MFC programmer, jeg har lavet flere applikationer med MFC der kører både på MS Visual C++ og Borland Builder.
Avatar billede arne_v Ekspert
11. juni 2003 - 20:23 #13
bertel>

Du har ret. Jeg checkede feature matrix og std. & prof. versionerne
(ikke pers.) har MFC.

Det undrer mig lidt da MFC jo er 100% MS teknologi, men Borland har vel
licenseret.
Avatar billede killer_bee Nybegynder
11. juni 2003 - 21:12 #14
olennert<< hvis du kigger på mit første svar så bliver path returneret... men  ormurin ku ikke bruge CStrings... derfor siger jeg at han skal bare bruge koden uden Cstring... og eftersom jeg ikke ved hvordan hans application er opbyget.. lyder som om han har bare 1 stor main program..
Jeg ved udemærket at man ikke kan returnere det path pointer.. men han skal vel lære :o)
Avatar billede ormurin Nybegynder
11. juni 2003 - 21:54 #15
alos, når det kommer til windows.h, så bliver jeg forvirret.. Jeg har kun læst nogle korte tutorials. Så hav mig undskyldt...

Det lyder fornuftigt med void Browse.. Men skal jeg kalde browse(); når jeg vil have brugeren at vælge en foldeR? (eller har jeg helt mistet forstanden)

PS: brug ikke MS lort. Det er for dyrt=) Borland er godt, men også dyrt. Jeg kører altid (om mulgit) på freeware .. --> www.blodshed.com (god c/c++ compiler)
Avatar billede arne_v Ekspert
11. juni 2003 - 21:57 #16
dev-cpp har ihvertfald ikke MFC.
Avatar billede ormurin Nybegynder
11. juni 2003 - 22:00 #17
BROWSEINFO er udefineret... (complier). Jeg tror at det er det eneste problem nu..
brugte foresten ikke void, men char.

Hvordan mener du med mere info om mit prog?
Det det går ud på er, at ved at trykke på en (menu)knap, skal vælgeren vælge en folder. Lyder simpelt, men....

Jeg er inden i WindowProcedure(****). Når den fanger signalet fra menuknappen skal den starte en dialog, som giver brugeren mulighed for at vælge en folder.
Avatar billede killer_bee Nybegynder
11. juni 2003 - 22:19 #18
jeg stå af her.. for som jeg sagde før kunne jeg hjelpe hvis du brugte MFC.. så de andre må tage over :).. sorry
Avatar billede bertelbrander Novice
12. juni 2003 - 00:04 #19
En dev-cpp løsning ville se ud som følger (note, jeg bruger gcc og ikke mingw der vist er standard med dev-c++, jeg tror dog ikke der er nogen forskel):

std::string Browse(HWND hWnd)
{
  BROWSEINFO browseInfo;

  //--------------------------------------------------------------------
  // Local variables for use in th BROWSEINFO struct
  //--------------------------------------------------------------------
  char res[MAX_PATH];
  char path[MAX_PATH];
  //---------------------------------------------------------------------
  // pointer to a Item ID list
  //---------------------------------------------------------------------
  LPCITEMIDLIST selectedPidl;

  browseInfo.hwndOwner = hWnd;
  browseInfo.pidlRoot = NULL;
  browseInfo.pszDisplayName = res;
  browseInfo.lpszTitle = "Select folder";
  browseInfo.ulFlags  = BIF_RETURNONLYFSDIRS;
  browseInfo.lpfn = NULL;
  browseInfo.lParam = 0;

  selectedPidl = SHBrowseForFolder(&browseInfo);

  //---------------------------------------------------------------------
  // Translating the item ID list to a human readable CString
  //---------------------------------------------------------------------
  SHGetPathFromIDList(selectedPidl, path);

  return path;
}

Du kalder Browse på denne måde:

std::string path = Browse(hwnd);
MessageBox(hwnd, path.c_str(), "Browse", MB_OK);

Du skal inkludere:
#include <windows.h>
#include <string>
#include <shlobj.h>

Og måske tilføje "-fvtable-thunks" til din c++ compiler parameter (Menu -> Project -> Project options -> Paramertes).
Avatar billede arne_v Ekspert
12. juni 2003 - 07:38 #20
mingw er GCC.

Forskellene på mingw og cygwin drejer sig om libraries/headers og
specielt DLL-filer.

(jeg formoder at du med gcc mener cygwin gcc)
Avatar billede ormurin Nybegynder
12. juni 2003 - 14:35 #21
hej, jeg prøver koderne i aften,..

Imens kan i diskutere hvem skal have pointerne.
Avatar billede killer_bee Nybegynder
02. september 2003 - 13:42 #22
"i aften" var vel længe siden.. hva med noget feedback? og du kan jo også fortelle hvilken løsning du har brugt.
Avatar billede killer_bee Nybegynder
25. september 2003 - 10:04 #23
få nu fingeren ud og luk FFS.. hader når folk er så røvligeglade EFTER de har fået hjælp!!!!!!!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester