RE: Common Dialogs

new topic     » goto parent     » topic index » view thread      » older message » newer message

Thanks, I found this from a message a "ak- at inbox.as" posted a few weeks 
ago.  He claims it works.  I'm going to attempt using it now.  I'll let 
you know how it goes after I'm sure it does/doesn't work.

Try this, append to end of win32lib.
This version doesn't crash on my machine, and cannot select
my computer or network neighborhood.
You can select the selected directory name.
If this is better you can include this to next release of
win32lib. but change the memory routines to win32lib's.
Example use: x = getFolder(Window1, "c:\\windows",
"Select folder")

----------------------------
constant xSHBrowseForFolder = 
registerw32Function(shell32,"SHBrowseForFolderA", {C_POINTER}, 
C_POINTER)

constant xSHGetPathFromIDList =
registerw32Function(shell32,"SHGetPathFromIDList",{C_ULONG,C_POINTER},C_ULONG)


function callbackselect(atom hWnd, atom uMsg, atom lParam, atom lpData)
object x
        if uMsg = 1 then
                x = w32Func(xSendMessage, {hWnd, 1126, 1, lpData})
        end if
        return 0
end function

global function getFolder(atom id, sequence filename, sequence title)
object bi, pbi, ret, folder, pfolder
        if length(filename)=2 and filename[2]=':' then
                filename &= '\\'
        elsif filename[length(filename)] = '\\' then
                filename = filename[1..length(filename)-1]
        end if
        bi = {0,0,0,0,         -- hwndOwner = 1
              0,0,0,0,         -- pIDLRoot = 5
              0,0,0,0,         -- pszDisplayName = 9
              0,0,0,0,         -- lpszTitle = 13
              0,0,0,0,         -- ulFlags = 17
              0,0,0,0,         -- lpfnCallback = 21
              0,0,0,0,         -- lParam = 25
              0,0,0,0}         -- iImage = 29
        bi[1..4] = int_to_bytes(getHandle(id))
        bi[13..16] = int_to_bytes(allocate_string(title))
        bi[17..20] = int_to_bytes(1)
        bi[21..24] = 
int_to_bytes(call_back(routine_id("callbackselect")))
        bi[25..28] = int_to_bytes(allocate_string(filename))
        pbi = allocate(length(bi))
        poke(pbi, bi)
        ret = w32Func(xSHBrowseForFolder, {pbi})
        free(bytes_to_int(bi[13..16]))
        free(bytes_to_int(bi[21..24]))
        free(bytes_to_int(bi[25..28]))
        free(pbi)
        
        pfolder = allocate(256)
        if w32Func(xSHGetPathFromIDList,{ret,pfolder}) then
                folder = peek_string(pfolder)
        else
                folder = ""
        end if
        free(pfolder)
        return folder
end function 


Jonas  Temple wrote:
> Cassidy,
> 
> The directory selection is actually a shell function, not a common 
> dialog (I made the same assumption!).  Here's a partially working 
> program to show how to make this happen.  There is a problem with it, 
> however.  The memory for the calls to these routines should be allocated 
> 
> with shell functions, not typical memory routines (I think this is 
> right, I seem to remember reading this in the SDK docs).  I was going to 
> 
> finish this to get it working but never got there.  Maybe someone else 
> has done this?
> 
> HTH,
> 
> Jonas
> 
> 
> atom binfo, result,memfolder
> sequence folder
> 
> constant xSHBrowseForFolder = registerw32Function(shell32, 
> "SHBrowseForFolder",
> {C_POINTER}, C_POINTER)
> 
> constant xSHGetPathFromIDList = 
> registerw32Function(shell32,"SHGetPathFromIDList",{C_ULONG,C_POINTER},C_ULONG)
> 
> 
> global constant
> bfOwner = allot( Long ),
> bfpidlRoot = allot( Long ),
> bfDisplayName = allot( Lpsz ),
> bfTitle = allot( Lpsz ),
> bfFlags = allot( Long ),
> bfFunction = allot( Long ),
> bfParam = allot( Long ),
> bfImage = allot( Long ),
> SIZEOF_BROWSEINFO = allotted_size()
> 
> binfo = acquire_mem(0, SIZEOF_BROWSEINFO)
> 
> store( binfo, bfOwner, 0)
> store( binfo, bfpidlRoot, NULL)
> store( binfo, bfDisplayName, "")
> store( binfo, bfTitle, "Select a Folder")
> store( binfo, bfFlags, NULL)
> store( binfo, bfFunction, NULL)
> store( binfo, bfParam, NULL)
> store( binfo, bfImage, NULL)
> 
> result = w32Func(xSHBrowseForFolder, {binfo})
> memfolder= acquire_mem(0,repeat(1024,0))
> if w32Func(xSHGetPathFromIDList,{result,memfolder}) then
>    --the string pointed to by folder now contains the path
>    folder = peek_string(memfolder)
> else
>    folder = ""
> end if
> --release_mem(memfolder)
> release_mem(binfo)
> 
> if message_box("Folder: " & folder, "Test", MB_OK) then end if
> -----------------------------------------
> 
> Cassidy Napoli wrote:
> > How would I get the win32 common dialog for directory selection?  It 
> > appears as a treeview of directories that a user can choose from, and 
> > returns the directory selected. 
> 
>

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu