OpenFileRequester mit Datei-Selektion [Windows]
Verfasst: 12.11.2011 17:13
OpenFileRequesterEx und SaveFileRequesterEx
machen das gleiche wie die PB-Funktionen OpenFileRequester bzw. SaveFileRequester -
mit dem Zusatz, dass die als DefaultFile$ übergebene Datei selektiert dargestellt wird.
NextSelectedFileNameEx, SelectedFilePatternEx
wie die PB-Funktion NextSelectedFileName bzw. SelectedFilePattern
Zusätzlich kann man die Größe des Requester-Fensters mit den Konstanten
#RequesterWidth und #RequesterHeight anpassen (wobei anscheinend 500 x 400 die Mindestgröße ist).
Ich habs unter Windows XP, Windows 7 und Vista getestet und bisher keine Probleme festgestellt.
*Nachtrag*
oops - habe statt #HWND_TOPMOST #HWND_NOTOPMOST geschrieben, was dazu führte, dass der Requester nicht vor
allen anderen Fenstern erscheint.
*Nachtrag*
Backslash zwischen Pfad und Dateinamen vergessen - führte zu Problemen bei Mehrfachselektion
[/size]
machen das gleiche wie die PB-Funktionen OpenFileRequester bzw. SaveFileRequester -
mit dem Zusatz, dass die als DefaultFile$ übergebene Datei selektiert dargestellt wird.
NextSelectedFileNameEx, SelectedFilePatternEx
wie die PB-Funktion NextSelectedFileName bzw. SelectedFilePattern
Zusätzlich kann man die Größe des Requester-Fensters mit den Konstanten
#RequesterWidth und #RequesterHeight anpassen (wobei anscheinend 500 x 400 die Mindestgröße ist).
Ich habs unter Windows XP, Windows 7 und Vista getestet und bisher keine Probleme festgestellt.
*Nachtrag*
oops - habe statt #HWND_TOPMOST #HWND_NOTOPMOST geschrieben, was dazu führte, dass der Requester nicht vor
allen anderen Fenstern erscheint.
*Nachtrag*
Backslash zwischen Pfad und Dateinamen vergessen - führte zu Problemen bei Mehrfachselektion
Code: Alles auswählen
EnableExplicit
#RequesterWidth = 500
#RequesterHeight = 400
#CDN_SELCHANGE = #CDN_FIRST - 1
#OFN_ENABLESIZING = $800000
Global RequesterListBox
Global RequesterFile$
Global RequesterPattern
Global NewList SelectedFileNameEx.s()
Procedure MyEnumCallback(hwnd , lParam)
Protected className$ = Space(256)
If GetClassName_(hwnd , @className$ , 256)
If className$ = "SysListView32"
RequesterListBox = hwnd
EndIf
EndIf
ProcedureReturn 1
EndProcedure
Procedure MyOpenFileNameHook(hwnd, msg, wParam, lParam)
Protected *NMHdr.NMHDR
Protected *oFile.OPENFILENAME
Protected iItem.LV_ITEM
Protected fInfo.LV_FINDINFO
If RequesterListBox = #Null
If msg = #WM_NOTIFY
*NMHdr = lParam
If *NMHdr\code = #CDN_SELCHANGE
SetWindowPos_(GetParent_(hwnd) , #HWND_TOPMOST , 0 , 0 , #RequesterWidth , #RequesterHeight , #SWP_NOMOVE)
EnumChildWindows_(GetParent_(hwnd) , @MyEnumCallback() , 0)
If RequesterListBox
fInfo\flags = #LVFI_STRING
fInfo\psz = @RequesterFile$
iItem\iItem = SendMessage_(RequesterListBox , #LVM_FINDITEM,-1 , fInfo)
If iItem\iItem >= 0
iItem\mask = #LVIF_STATE
iItem\state = #LVIS_SELECTED
iItem\stateMask = -1
SendMessage_(RequesterListBox , #WM_SETFOCUS , 0,0)
SendMessage_(RequesterListBox , #LVM_ENSUREVISIBLE , iItem\iItem , 0)
SendMessage_(RequesterListBox , #LVM_SETITEMSTATE , iItem\iItem , iItem)
EndIf
EndIf
EndIf
EndIf
EndIf
ProcedureReturn
EndProcedure
Procedure.s OpenFileRequesterEx(Title$ , DefaultFile$ , Pattern$ , PatternPosition , Flags = 0)
Protected oFile.OPENFILENAME
Protected sPath$ , sFile$ , currentFile$ , firstFile$
Protected *lpstrFile.Character , *sPattern , i
sPath$ = GetPathPart(DefaultFile$)
sFile$ = GetFilePart(DefaultFile$)
oFile\Flags = #OFN_ENABLEHOOK | #OFN_EXPLORER | #OFN_HIDEREADONLY | #OFN_ENABLESIZING
oFile\lStructSize = SizeOf(OPENFILENAME) + 12
oFile\lpfnHook = @MyOpenFileNameHook()
oFile\lpstrTitle = @Title$
oFile\lpstrInitialDir = @sPath$
ofile\nMaxFile = 32000
oFile\lpstrFile = AllocateMemory((ofile\nMaxFile + 1) * SizeOf(Character))
If Pattern$
oFile\lpstrFilter = AllocateMemory((Len(Pattern$) + 1) * SizeOf(Character))
oFile\nFilterIndex = PatternPosition + 1
EndIf
If Flags = #PB_Requester_MultiSelection
oFile\Flags | #OFN_ALLOWMULTISELECT
EndIf
For i = 1 To Len(Pattern$)
If Mid(Pattern$ , i , 1) <> "|"
PokeC(oFile\lpstrFilter + (i-1) * SizeOf(Character) , Asc(Mid(Pattern$ , i , 1)))
EndIf
Next
ClearList(SelectedFileNameEx())
If oFile\lpstrFile
RequesterFile$ = sFile$
RequesterListBox = #Null
If GetOpenFileName_(@oFile)
RequesterPattern = oFile\nFilterIndex
*lpstrFile = oFile\lpstrFile
While *lpstrFile\c
currentFile$ = PeekS(*lpstrFile)
If firstFile$ = ""
firstFile$ = currentFile$
Else
AddElement(SelectedFileNameEx())
SelectedFileNameEx() = firstFile$ + "\" + currentFile$
EndIf
*lpstrFile + ( Len(currentFile$) + 1 ) * SizeOf(Character)
Wend
If ListSize(SelectedFileNameEx()) = 0
AddElement(SelectedFileNameEx())
SelectedFileNameEx() = firstFile$
EndIf
EndIf
EndIf
If oFile\lpstrFile
FreeMemory(oFile\lpstrFile)
EndIf
If oFile\lpstrFilter
FreeMemory(oFile\lpstrFilter)
EndIf
If FirstElement(SelectedFileNameEx())
ProcedureReturn SelectedFileNameEx()
Else
ProcedureReturn ""
EndIf
EndProcedure
Procedure.s SaveFileRequesterEx(Title$ , DefaultFile$ , Pattern$ , PatternPosition)
Protected oFile.OPENFILENAME
Protected sPath$ , sFile$ , firstFile$
Protected *lpstrFile.Character , *sPattern , i
sPath$ = GetPathPart(DefaultFile$)
sFile$ = GetFilePart(DefaultFile$)
oFile\Flags = #OFN_ENABLEHOOK | #OFN_EXPLORER | #OFN_HIDEREADONLY | #OFN_ENABLESIZING
oFile\lStructSize = SizeOf(OPENFILENAME) + 12
oFile\lpfnHook = @MyOpenFileNameHook()
oFile\lpstrTitle = @Title$
oFile\lpstrInitialDir = @sPath$
ofile\nMaxFile = #MAX_PATH
oFile\lpstrFile = AllocateMemory((#MAX_PATH + 1) * SizeOf(Character))
If Pattern$
oFile\lpstrFilter = AllocateMemory((Len(Pattern$) + 1) * SizeOf(Character))
oFile\nFilterIndex = PatternPosition + 1
EndIf
For i = 1 To Len(Pattern$)
If Mid(Pattern$ , i , 1) <> "|"
PokeC(oFile\lpstrFilter + (i-1) * SizeOf(Character) , Asc(Mid(Pattern$ , i , 1)))
EndIf
Next
If oFile\lpstrFile
RequesterFile$ = sFile$
RequesterListBox = 0
If GetSaveFileName_(@oFile)
RequesterPattern = oFile\nFilterIndex
firstFile$ = PeekS(oFile\lpstrFile)
EndIf
EndIf
ProcedureReturn firstFile$
EndProcedure
Procedure.s NextSelectedFileNameEx()
If NextElement(SelectedFileNameEx())
ProcedureReturn SelectedFileNameEx()
EndIf
ProcedureReturn ""
EndProcedure
Procedure SelectedFilePatternEx()
ProcedureReturn RequesterPattern
EndProcedure
; **** TEST **** TEST **** TEST **** TEST **** TEST **** TEST **** TEST **** TEST ****
Define FileName$
FileName$ = OpenFileRequesterEx("" , #PB_Compiler_Home + "PureBasic.exe" , "Executable (*.exe)|*.exe|All Files (*.*)|*.*" , 0 , #PB_Requester_MultiSelection)
If FileName$ = ""
Debug "keine Datei gewählt"
Else
While FileName$
Debug FileName$
FileName$ = NextSelectedFileNameEx()
Wend
EndIf
FileName$ = SaveFileRequesterEx("" , #PB_Compiler_Home + "PureBasic.exe" , "Executable (*.exe)|*.exe|All Files (*.*)|*.*" , 0)
If FileName$ = ""
Debug "keine Datei gewählt"
Else
Debug FileName$
EndIf