OpenFileRequester mit Datei-Selektion [Windows]

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Mr.L
Beiträge: 51
Registriert: 05.02.2011 21:04

OpenFileRequester mit Datei-Selektion [Windows]

Beitrag von Mr.L »

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


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
[/size]
Zuletzt geändert von Mr.L am 12.11.2011 18:27, insgesamt 1-mal geändert.