RE: Common Dialogs
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.
>
>
|
Not Categorized, Please Help
|
|