Here's a Preview demo example
Code: Select all
EnableExplicit
Global PreviewRunning, PreviewProgramName$
Procedure.s GetTempFilename(BaseName$, NbRamdomLetter.l = 3, NbRamdomDigit.l = 3, Ext$ = ".pb")
Protected FileName$, I
FileName$ = GetTemporaryDirectory() + BaseName$
For I = 1 To NbRamdomLetter
FileName$ + Chr('a'+Random(25))
Next
For I = 1 To NbRamdomDigit
FileName$ + Str(Random(9))
Next
FileName$ + Ext$
If FileSize(FileName$) = -1 ; If file does not exist, return the generated filename
ProcedureReturn FileName$
Else ; Else, generate a new filename
ProcedureReturn GetTempFilename(BaseName$, NbRamdomLetter, NbRamdomDigit, Ext$)
EndIf
EndProcedure
Procedure CallPreview(SourceCode$)
If SourceCode$ = "" : ProcedureReturn : EndIf
Protected TempFileName$, hTempFile
Protected CompilerPath$, CompilPreview, CompilPreviewOutput$
CompilerPath$ = #PB_Compiler_Home + "Compilers\pbcompiler.exe"
If FileSize(CompilerPath$)
TempFileName$ = GetTempFilename("~Preview_", 3, 3, ".pb")
hTempFile = CreateFile(#PB_Any, TempFileName$, #PB_UTF8)
If hTempFile
WriteStringFormat(hTempFile, #PB_UTF8)
WriteStringN(hTempFile, SourceCode$)
CloseFile(hTempFile)
PreviewProgramName$ = GetPathPart(TempFileName$) + GetFilePart(TempFileName$, #PB_FileSystem_NoExtension) + ".exe"
CompilPreview = RunProgram(CompilerPath$, #DQUOTE$ + TempFileName$ +#DQUOTE$+ " /EXE " +#DQUOTE$+ PreviewProgramName$ +#DQUOTE$ + " /XP /DPIAWARE", "", #PB_Program_Hide | #PB_Program_Open | #PB_Program_Read)
If CompilPreview
While ProgramRunning(CompilPreview)
If AvailableProgramOutput(CompilPreview)
CompilPreviewOutput$ = ReadProgramString(CompilPreview)
EndIf
Wend
If ProgramExitCode(CompilPreview)
CloseProgram(CompilPreview)
MessageRequester("Preview Error", "Fail to compile:" +#CRLF$+ "PBcompiler.exe %Temp%\" + GetFilePart(TempFileName$) + " /EXE %Temp%\" + GetFilePart(PreviewProgramName$) + #CRLF$+#CRLF$+ CompilPreviewOutput$, #PB_MessageRequester_Error | #PB_MessageRequester_Ok)
Else
CloseProgram(CompilPreview)
If FileSize(PreviewProgramName$)
DeleteFile(TempFileName$)
PreviewRunning = RunProgram(PreviewProgramName$, "", "", #PB_Program_Open)
Else
MessageRequester("Preview Error", "Fail to compile:" +#CRLF$+ "PBcompiler.exe %Temp%\" + GetFilePart(TempFileName$) + " /EXE %Temp%\" + GetFilePart(PreviewProgramName$), #PB_MessageRequester_Error | #PB_MessageRequester_Ok)
EndIf
EndIf
Else
MessageRequester("Preview Error", "Fail to compile:" +#CRLF$+ "PBcompiler.exe %Temp%\" + GetFilePart(TempFileName$) + " /EXE %Temp%\" + GetFilePart(PreviewProgramName$), #PB_MessageRequester_Error | #PB_MessageRequester_Ok)
EndIf
EndIf
Else
MessageRequester("Preview Error", "PBcompiler.exe was not found in Compilers folder", #PB_MessageRequester_Error | #PB_MessageRequester_Ok)
EndIf
EndProcedure
Procedure Resize_Window()
ResizeGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 80)
ResizeGadget(1, 10, WindowHeight(0) - 60, WindowWidth(0) - 20, 50)
EndProcedure
Procedure Open_Window(X = 0, Y = 0, Width = 660, Height = 300)
Protected SourceCode$ = "If OpenWindow(0, 0, 0, 260, 60, " +#DQUOTE$+ "Demo Preview Window" +#DQUOTE$+ ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)" +#CRLF$+
" TextGadget(0, 20, 20, 220, 22, " +#DQUOTE$+ "Preview Window" +#DQUOTE$+ ", #PB_Text_Center)" +#CRLF$+
" Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow" +#CRLF$+
"EndIf"
If OpenWindow(0, X, Y, Width, Height, "Demo Preview", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
EditorGadget(0, 10, 10, 640, 220)
SetGadgetText(0, SourceCode$)
ButtonGadget(1, 10, 240, 640, 50, "Preview")
BindEvent(#PB_Event_SizeWindow, @Resize_Window(), 0)
ProcedureReturn #True
EndIf
EndProcedure
If Open_Window()
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_ActivateWindow
If PreviewRunning And IsProgram(PreviewRunning) And ProgramRunning(PreviewRunning)
KillProgram(PreviewRunning)
CloseProgram(PreviewRunning)
Delay(50)
EndIf
If Not PreviewProgramName$ = "" And FileSize(PreviewProgramName$)
DeleteFile(PreviewProgramName$)
EndIf
PreviewRunning = 0
PreviewProgramName$ = ""
Case #PB_Event_Gadget
Select EventGadget()
Case 1 ; Preview
CallPreview(GetGadgetText(0))
EndSelect
EndSelect
ForEver
EndIf