Geht sehr gut mit Threads. RSBasic hat nur vergessen speicher für den Namen anzufordern
Code: Alles auswählen
EnableExplicit
CompilerIf Defined(EventCustomValue, #PB_Enumeration) = 0
Enumeration EventCustomValue #PB_Event_FirstCustomValue
; Nothing
EndEnumeration
CompilerEndIf
Enumeration EventCustomValue
#My_Event_OpenFileName
EndEnumeration
Procedure AllocateString(String.s)
Protected *mem
*mem = AllocateMemory(StringByteLength(String) + SizeOf(Character))
If *mem
PokeS(*mem, String)
EndIf
ProcedureReturn *mem
EndProcedure
Procedure.s FreeString(*Mem)
Protected result.s
If *Mem
result = PeekS(*Mem)
FreeMemory(*Mem)
EndIf
ProcedureReturn result
EndProcedure
Procedure thGetOpenFileName(Null)
Protected OPENFILENAME.OPENFILENAME
Protected *FileName
*FileName = AllocateMemory(#MAX_PATH)
OPENFILENAME\lStructSize = SizeOf(OPENFILENAME)
OPENFILENAME\hWndOwner = 0
OPENFILENAME\lpstrFile = *Filename
OPENFILENAME\nMaxFile = #MAX_PATH
OPENFILENAME\Flags = #OFN_EXPLORER | #OFN_ENABLESIZING | #OFN_FILEMUSTEXIST
If GetOpenFileName_(OPENFILENAME)
PostEvent(#My_Event_OpenFileName, 0, 0, 0, *FileName)
Else
FreeMemory(*FileName)
EndIf
EndProcedure
If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateThread(@thGetOpenFileName(), 0)
CreateThread(@thGetOpenFileName(), 0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #My_Event_OpenFileName
Debug FreeString(EventData())
EndSelect
ForEver
EndIf