Code archives/Miscellaneous/Path(way) Editor

This code has been declared by its author to be Public Domain code.

Download source code

Path(way) Editor by Dan2015
Here is an exaple of how to:

- Load/Save Data in two formats:
binary and as Text file with Data's.
- File Requester
- Text Scroller
- Reading and Using Data.
- Use Goto's and Gosub's ( to all you Sphagetti-haters out there ;) )
- A way to Display text which dissapears after few seconds, like OSD.


A Picture called 320x250.png will be loaded at the Start,
but if its not Found in the (compiled) app's directory, it wont be used.

Make sure you have data folder in blitzbasic\bin\ folder or in the Compiled exe's folder
if you want to save the data.

Screen function needs Decls. If you dont want to install them,
just delete the function and the calls to it (its only 1)

See here for the File Requester source.
;====================================================================
; Project: Path(Way) Editor 
; Version: 1.0 - 22.7.2015 ~Dan ~
; Author: Dan
; Email: -.-
; Copyright: PD
; Description: You can Draw a path with Mouse, and save the data
;              as blitzbasic data statements or as binary file.
;  (see ***)   To save the data go into Animate mode and see if the
;              Path is ok, then choose the format to save.
;              Here you can press Left MouseButton to change the moving graphic
;              In Edit mode you can press d multiple times to  
;              load the Demo Data from the data statements.
;              m changes the type of drawing.
;              Press f4 to see a Scrolling text following the path.
;              Hold F1 to exit the scroller.
;              L Opens a simple File requester, which displays the binary saved data.
;***           Make sure you have data folder inside blitzbasic\bin\
;              folder if you start this demo from the IDE,
;              or a data folder in the exe's folder,if you compile it 
;              Space key shows the last The OnScreenDisplay(OSD) message
;              using Blu_Matt's hex2dec function 
;====================================================================
; The following decls are needed ONLY for the Screen function
; if you dont want to use it, comment the whole Screen Function
; and remove the calls to it 
;
; User32.decls	
;;.lib "user32.dll"
;api_GetSystemMetrics% (nIndex%) : "GetSystemMetrics"
;api_GetActiveWindow%():"GetActiveWindow"
;api_GetDC% (hwnd%) : "GetDC"
;api_GetDesktopWindow% () : "GetDesktopWindow"
;
;
; GDI32.decls
;.lib "gdi32.dll"
;api_GetDeviceCaps% (hdc%, nIndex%) : "GetDeviceCaps"
;====================================================================


; Graphic 320,250,32,2         ;Uncomment this
; Graphic 320,250,32,3         ;and this line if you dont want to use Screen function

; Screen fuction gets the desktop resolution and streches the small window to fullscreen
Screen 320,250				  ;Comment this, and uncomment the above if you dont want to use Screen function
;Screen 800,600

SetBuffer BackBuffer()

ChangeDir SystemProperty$("appdir")

bgimage=LoadImage("320x250.png")

;TextY function setting:
Global TxtY=-2
;/

;File Requester Setting:
FR_folder$=SystemProperty$("appdir")+"Data\"  ; Setting up folders
FR_ext$=".dat"
ReqMaxShow=5
;/

Repeat
    Cls
	Color $ff,$ff,$ff
	TextY (-2,"Usage: (Edit Mode)")
	TextY (1,"Left Mouse Button to draw path")
	TextY (0,"Right Mouse B.to Animate")
	TextY (0,"Middle Mouse B.to Clear (BackSpace <-)")
	TextY (0,"L to Load, F4 Scroller demo")
	TextY (0,"D to cycle through Demo Data")
	TextY (0,"Hold Shift + Left MouseButton to ")
	TextY (0,"draw faster. + - Shift speed Modifier ")
	TextY (0,"M To change mode, Space for OSD")
	TextY (0,"Press ESC to END")
	TextY (1,"While in Animate Mode")
	TextY (0,"S= Save as BB-Data statements")
	TextY (0,"E= Save as Binary Data (see L key)")
	Color $ff,0,0
	TextY (1,"Press left mouse key to continue")
	Flip
	Delay 1
Until MouseDown(1)

FlushMouse()
Delay 500
PathwayUsed=0				; Tracks how many path points are set
PathwayMax=3555			; How many Pathways to use 
demod=-1					; Demo tracking Variable

SKMSpeed=80					;Slows down the drawing speed while shift is held down
							;Changeable with + and - keys

Dim Pathway(PathwayMax,1)  	; Store the pathway data. Coordinates: 0=x, 1=y 
Global Timer_m=MilliSecs() 	; For the Timer_mSec function
MDL=MilliSecs() 			; Left mouse Click Delay in edit mode
AppTitle "Edit Mode"
OSDtimeout=5000 ; OSD - OnScreenDisplay Settings

DKP=MilliSecs()  
Gosub SetEditModeOSD

Repeat						;Main Loop (editor)
	Cls
	Gosub DrawBack
	If mmode=1 
		Text MouseX()-3,MouseY()-7,"X"
	Else 
		Rect MouseX(),MouseY(),1,1,0
	EndIf
	
	If KeyDown(42) Or KeyDown(54)		;Left or Right Shift Keys
		
	    ;Checks if Left Mouse and If slowdown timer is reached
		If MouseDown(1)=True And MilliSecs()-MDL=>SKMSpeed And PathwayUsed<PathwayMax ;Left Mousebutton Clicked, and the timer is reached, and PathWay used has not reached The PathWayMax
			MDL=MilliSecs() 
			Gosub PlotIt
		EndIf
	Else
	    ;Checks if Left Mouse is Pressed and if MDL=0
		If MouseDown(1)=True And MDL=0 And PathwayUsed<PathwayMax	;Left Mousebutton Clicked, and It was released allready, and PathWay used has not reached The PathWayMax
			MDL=1
			Gosub PlotIt
		EndIf
		If MouseDown(1)=False And MDL=>1 Then MDL=0 		;Wait until Left MouseButton is released 
		
	EndIf
	
	If MouseDown(2)=True  				;Right Mouse Button shows a Replay
	    Gosub SetAniModeOSD
		Gosub Replay
		Gosub SetEditModeOSD
	EndIf
	
	If MouseDown(3) Or KeyDown(14)						;Middle Mouse Button Erase pathway(or backspace)
		Gosub ClearDim
		While MouseDown(3) Or KeyDown(14)				;Wait untill the keys are released
			Delay 1
		Wend  
	EndIf
	
	If KeyDown(13) Or KeyDown(78)  ; + Numpad +
	   SKMSpeed=SKMSpeed-5
	   If SKMSpeed<=0 Then SKMSpeed=0
	EndIf 
	
	If KeyDown(12) Or KeyDown(74)  ; - Numpad -
	   SKMSpeed=SKMSpeed+5
	   If SKMSpeed >700 Then SKMSpeed=700
	EndIf 
	
	
	If KeyDown(38) 		;l to load
		AppTitle "Loader"
		
		Gosub FileRequester
		
		If FR_Error=0 And Toload$<>""
			Gosub loaddata
			DKP=MilliSecs()
			OSDText$="Loaded File:"
			OSDText1$=ToLoad$
			OSDText2$=""
		Else
			OSDText$="File Requester: Error Loading"
			If Fr_Error=1 
				OSDText2$="Folder does not exists"
				OSDText1$=FR_folder$
				DKP=MilliSecs()
			Else
			  OSDText1$="Cancelled or No files"
			  OSDText2$=""
			EndIf
			AppTitle "Edit Mode"
			FlushKeys
			Delay 250
		EndIf
	EndIf 
	
	If KeyDown(50)					;M for Mode
		mmode=Not mmode
		While KeyDown(50)
			Delay 1
		Wend
	EndIf
	
	If KeyDown(62) And pathwayused>0         ;F4 for scroller
		Gosub scrollit
		Delay 100
		FlushKeys
		Gosub SetEditModeOSD
	ElseIf KeyDown(62) And PathwayUsed=0	;No pathway set, display error msg
	    DKP=MilliSecs() ; OSD - OnScreenDisplay Settings
		OSDText$="No Pathways set !"
		OSDText1$=" Use the Left mouse button"
		OSDText2$=" or D for demo path "
		FlushKeys()
		AppTitle "Edit Mode"
	EndIf
	
	If KeyDown(32)						;D to load Demo data
		Gosub ClearDim
		demod=(demod+1) Mod 3			;Cycle demod from 0 to 2
		Select demod
			Case 0
				Restore demo
			Case 1
				Restore demo1
			Case 2
				Restore demo2
		End Select
		
		Read PathwayUsed				;Here we have no error checking, assuming that the data is correct
		For LoopX=0 To PathwayUsed-1	;Read the data into Pathway()
			Read Pathway(LoopX,0) 
			Read Pathway(LoopX,1)
		Next
		
		While KeyDown(32)			;Wait untill D key is released 
			Delay 1
		Wend 
		DKP=MilliSecs() ; OSD - OnScreenDisplay Settings
		OSDText$="Demo data loaded"
		OSDText1$="Demo #0"+(demod+1)+" / 03"
		OSDText2$=""
	EndIf
	
	Flip 
Until KeyDown(1)				;/Main Loop /editor

End  ; 														Thats all Folks!

.scrollit

AppTitle "Hold F1 to exit the Scroller"

TEX$=" "
TEX$=TEX$+String$(" ",PathWayUsed) ; Do not change this
; Write new text down here
TEX$=TEX$+"Dan presents : SSTT * Super Scrolling Test Text *  "
TEX$=TEX$+"you can Setup the path with the Mouse and save it for later use.      "
TEX$=TEX$+"Press F1 to Return to the Editor, visit www.blitzbasic.com and dont forget to subscribe !!!   :)     .-''-."
TEX$=TEX$+"             "

;and above here as Tex$=Tex$+" new text "
TEX$=Tex$+String$(" ",40) ;And as last, to have the smooth text in/out effect
TLE=Len(TEX$)

;frameTimer=CreateTimer(10)
FlushKeys()
DMSpeed=2		;Demo Scroll-speed Setting (1 fast 4 slowest)
DKP=MilliSecs() ; OSD - OnScreenDisplay Settings
Time_mSec(0)
Repeat
	;WaitTimer(frameTimer)
	For SY=1 To 2									;Repeat 2 times
		For SX=1 To TLE
			THELP$=Mid$(TEX$,SX,PathWayUsed)
			Cls
			If bgimage<>0 Then DrawBlock bgimage,0,0
			Color $ff,$ff,$ff
			For SX1=0 To PathWayUsed-1
				If KeyHit(59) Then Goto loopend 	;F1 Ends it
				THELP1$=Mid$(THELP$,SX1+1,1)
				If SY=1 Then OutlineText1 (Pathway(sx1,0),Pathway(sx1,1),THELP1$) 
				If SY=2 Then OutlineText1 (Pathway((PathwayUsed-1)-sx1,0),Pathway((PathWayUsed-1)-sx1,1),THELP1$)
			Next
			
			If (KeyDown(13) Or KeyDown(78) ) And MilliSecs()-DKP>250  ; + Numpad +
				DMSpeed=DMSpeed-1
				DKP=MilliSecs()
				If DMSpeed<=1 Then DMSpeed=1
			EndIf 
			
			If (KeyDown(12) Or KeyDown(74)) And MilliSecs()-DKP>250  ; - Numpad -
				DMSpeed=DMSpeed+1
				DKP=MilliSecs()
				If DMSpeed >4 Then DMSpeed=4
			EndIf 
			
			While Time_mSec(DMSpeed)>1
			Delay 1
			Wend
			OSDtext$="Demo Text Speed="+DMSpeed
			OSDtext1$="Change with + -"
			OSDtext2$="F1 = Go Back to Edit Mode"
			Gosub OSDtext
			Time_mSec(0)
			Flip
		Next
	Next 
Until KeyHit(59)		; F1, If ever

.loopend 
Delay 1000
FlushKeys()
AppTitle "Edit Mode"
Return

.OSDtext
; Pass OSDtext$ OSDtext1$ OSDtext2$ to display different lines empty will be ignored
; Set OSDtimeout in seconds for display duration
If KeyDown(57) And MilliSecs()-DKP>OSDtimeout Then DKP=MilliSecs()
If MilliSecs()-DKP<OSDtimeout
	If OSDtext$<>"" Then OutlineText(3,3+(FontHeight()*2),OSDText$)
	If OSDtext1$<>"" Then OutlineText(3,3+(FontHeight()*3),OSDText1$)
	If OSDtext2$<>"" Then OutlineText(3,3+(FontHeight()*4),OSDText2$)
EndIf

Return

.ClearDim
For LoopX=0 To PathwayUsed-1
	Pathway(LoopX,0)=0 
	Pathway(LoopX,1)=0
Next
PathwayUsed=0
Return

.PlotIt

Pathway(PathwayUsed,0)=MouseX() 
Pathway(PathwayUsed,1)=MouseY()
PathwayUsed=PathwayUsed+1

Return

.DrawBack						;Draws the Background text and every Way-Point for the Edit mode
If bgimage<>0 Then DrawBlock bgimage,0,0
For LoopX=0 To PathwayUsed-1
	If LoopX=pathwayUsed-1 Then 
		Color $ff,00,00
    ElseIf LoopX=PathwayUsed-2
	    Color $ef,$6f,00
	ElseIf LoopX=PathwayUsed-3
	    Color $cf,$af,00
	ElseIf LoopX=0
	    Color $0,$ff,$0
	Else
		Color $ff,$ff,00
	EndIf 
	If mmode=1 
		Text Pathway(LoopX,0)-3,Pathway(LoopX,1)-7,"X"
	Else
		Rect Pathway(LoopX,0),Pathway(LoopX,1),2,2
	EndIf
Next
Color $0,$ff,$0				; The 1st position of the path shall be always seen (here in green)
If mmode=1
	Text Pathway(0,0)-3,Pathway(0,1)-7,"X"
Else
	Rect Pathway(0,0),Pathway(0,1),2,2
EndIf
Color $80,$f0,$f0
Text 0,0,PathwayUsed+"/"+PathWayMax+" MX="+MouseX()+" MY="+MouseY()+" Shift="+SKMSpeed

Gosub OSDtext
Return

.SetEditModeOSD
OSDtext$="Edit Mode Keys: Esc  BackSpace <-"
OSDtext1$="Left MouseB + Shift / M / F4 + - D"
OSDtext2$="L=Load / Middle/Right MouseButton"
Return

.SetAniModeOSD
OSDText1$="Press Right Mouse B. to Edit"
OSDText2$="S=Save Data,E=Export Binary"
OSDText$="Animate Mode Keys:"
Return

.DrawBackReplay				;Draws the Text/or Image if used for the Animate part
Cls
If bgimage<>0 Then DrawImage bgimage,0,0
Gosub OSDtext
Color $ff,$ff,$ff
Text 0,GraphicsHeight()-18,"Nr. ("+Replay+") of {"+PathwayUsed+"} "
Return

.Replay						;Replay Mode
AppTitle "Animate Mode"
Cls
Replay=0
FlushMouse()
Delay 500
Time_mSec(0)
DKP=MilliSecs()  ; OSD - OnScreenDisplay Settings

Repeat
	If MouseDown(1) And amm=0					;M for Mode
		ammode=(ammode+1) Mod 4
        amm=1
    EndIf
	If Not(MouseDown(1)) And amm=1
		amm=0
	EndIf
    If KeyDown(31) Then savetype=0 : Gosub savedata : DKP=MilliSecs() ;key s
	If KeyDown(18) Then savetype=1 : Gosub savedata : DKP=MilliSecs() ;key e
	Gosub DrawBackReplay
	
	If Time_mSec(-1)>2 Then Time_mSec(0) : Replay=Replay+1
	If Replay>PathwayUsed-1 Then Replay=0
	Select ammode
		Case 0
			Color $00,$ff,$ff
			Oval Pathway(Replay,0),Pathway(Replay,1),8,6,1
			Color $ff,0,0
			Oval Pathway(Replay,0),Pathway(Replay,1),8,6,0
		Case 1
		    Color Rand(0,255),Rand(0,255),Rand(0,255)
			Rect Pathway(Replay,0),Pathway(Replay,1),3,3,1
			Color $ff,0,$FF
			Rect Pathway(Replay,0),Pathway(Replay,1),4,4,0
		Case 2	
			If Replay>0 Then Replay2=Replay-1
			If Replay2>0 Then Replay3=Replay2-1
			If Replay3>0 Then Replay4=Replay3-1
			Color $0,$9f,$ff
			Text Pathway(Replay4,0)-3,Pathway(Replay4,1)-7,"w"
			Color $0,$bf,$ff
			Text Pathway(Replay3,0)-3,Pathway(Replay3,1)-7,"x"
			Color $0,$df,$ff
			Text Pathway(Replay2,0)-3,Pathway(Replay2,1)-7,"y"
			Color $00,$ff,$ff
			Text Pathway(Replay,0)-3,Pathway(Replay,1)-7,"z"
		Case 3
		    Color $bc,10,$cd
			Rect Pathway(Replay,0),Pathway(Replay,1),1,1,0
	End Select
	 Flip
Until MouseDown(2)

While MouseDown(2)   ;Release the Right mousebutton to continue 
	Delay 10
Wend

FlushMouse
AppTitle "Edit Mode"
DKP=MilliSecs() ; OSD - OnScreenDisplay Settings
Return 

;				Load Data
.loaddata

; Binary data format:
; $000000    - Pathways used
; $0000 $0000  - LoopX,LoopY coordinates (as many as Pathways used)

If FileSize(FR_folder$+Toload$)=>7		;Check if file holds at least 7 bytes (see binary data format (at least 1 x,y coordinate pair)
	TextY (1,FR_folder$+Toload$)
	Gosub ClearDim						;Erase the Pathway()

	filein=ReadFile(FR_folder$+Toload$)	;Open the file to read
	
	For LoopX=2 To 0 Step -1			;Read the PathwayUsed from the File (3 bytes)
		RData=ReadByte(filein)
		BB$=BB$+Right$(Hex$(RData),2)	;Stick the Bytes together as hex value ! 
	Next
	PathwayUsed=hex2dec(BB$)			;Calculate the Decimal value of the readed data and set it into PathWayUsed
	bb$=""								;Clear the BB$ to use it later
	For LoopX=0 To PathwayUsed-1		;Start reading X and Y mouse Coordinates from the file
	    For loopy=0 To 1				;Read 2 bytes for X, Then 2 bytes for Y
			RData=ReadByte(filein) : BB$=BB$+Right$(Hex$(RData),2)
			RData=ReadByte(filein) : BB$=BB$+Right$(Hex$(RData),2)
			Pathway(LoopX,LoopY)=hex2dec(BB$) : BB$="" ; Calculate The Bytes and set them into PathWay(x,y)
		Next
	Next
	CloseFile(filein)					;Done ?! Close the file.
	
EndIf

Return

;				Save Data
.savedata
Delay 1			;in case you have 100000 files saved as dat (probably wont, but hey ;) )
FlushKeys
If PathwayUsed=0 
    OSDText$="Not Saved!!!" 
	OSDText1$="Reason:No pathways set.Count=0"
	OSDText2$="Switch to Edit and add some"
	Delay 1000
	FlushKeys 
	Return ; Dont save if no Path(ways) are set 
EndIf 
fnamenum$=String$("0",4-Len(Str(fname)))+Str(fname)	;Calculate the filename numbers with leading 0'os

If savetype=0 			;0 means user has choosen to export it as Data statements
	fileext$=".bb"
Else					;1(else) means to save it in binary format, set the appropriate file ext.
	fileext$=".dat"
EndIf

FileName$=FR_folder$+"PathWay_"+fnamenum$+fileext$	;Forms the filename folder + "pathway_" + filenamenumber

If FileType(FileName$)>0		; If the file exists ( > 0 ) 
	fname=fname+1				;increase fname variable
	Delay 2
	Goto savedata				;and form the filename again, until free filename is found
EndIf

AppTitle "saving file:  "+FileName$

file=WriteFile (FileName$)
z=-1							;counter for data type
Written=0						;variable to write the data at the end of the loop 

If file>0 			;Check if the file could be opened for writing, and if yes:
	If savetype=0 				;Header for the data statements :
	    OSDText2$="as Data File"
	    WriteLine (file,";Format: Data pathways")		;Some informational text 
		WriteLine (file,";Data Mouse X,MouseY in Hexadecimal")
		WriteLine (file,";You can safely Delete the Last "+Chr$(34)+"ffff"+Chr$(34)+",it is Not used")
;		WriteLine (file,";and probably 2~3 last $0000 pairs")
		WriteLine (file,"Data "+PathwayUsed)						; Here is the 1st data statement
	Else						; For binary data (header)
	    OSDText2$="as Binary File"
		For LoopX=1 To 3		; write 3 bytes of the hexadecimal PathwayUsed variable 
			WriteByte (file,hex2dec(Mid$(Hex$(PathwayUsed),(LoopX*2)+1,2)))
		Next
	EndIf
	For LoopX=0 To PathwayUsed-1	; Mouse X,Y loop of all pathways
		If savetype=0 				;As data statements
			z=z+1					;Counts how many data pairs are saved in one line in one data 
			If z=0  				;z0 means the dataitem$ will hold "data x,y,"
				Dataitem$="Data "+"$"+Right$(Hex$(Pathway(LoopX,0)),4)+",$" +Right$(Hex$(Pathway(LoopX,1)),4) + "," : Written=0
			ElseIf z>0 And z<=3		;>0 and <3 the dataitem$ will have "," at the end of the line
				Dataitem$=Dataitem$+"$"+Right$(Hex$(Pathway(LoopX,0)),4) +",$" +Right$(Hex$(Pathway(LoopX,1)),4) + "," : Written=0
			ElseIf z=4				;dataitem$ will have the last pair of x,y without ( , )
				Dataitem$=DataItem$+"$"+Right$(Hex$(Pathway(LoopX,0)),4) +",$" +Right$(Hex$(Pathway(LoopX,1)),4) 
				WriteLine (file,Dataitem$)
				Written=1			;Written 1 to bypass the exit loop, or to write the last data items into the file ! important
				z=-1
			EndIf
		Else						;As binary Data
			For LoopX=0 To PathwayUsed-1	; Every pathwayused (-1 because Pathway() is saved at 0 as 1st)
				For LoopY=0 To 1		;Count for X and Y 
					WriteByte (file,hex2dec(Mid$(Hex$(Pathway(LoopX,LoopY)),5,2))) ;Writes the 1st byte of X or Y
					WriteByte (file,hex2dec(Mid$(Hex$(Pathway(LoopX,LoopY)),7,2))) ;Writes the 2nd byte of X or Y
				Next
			Next
			Written=1   ;Needed only for the Data statements 
		EndIf
	Next
	
	If Written=0		;and Savetype=0		; written=0 to catch the last pairs of data were not written in some cases 
	                    ;(if the above loop ends because the pathway end is reached and the z was lower than 4) 
		WriteLine (file,Dataitem$+Chr$(34)+"FFFF"+Chr$(34)) ;Writes the Lats dataitems and "FFFF" (for readability)
	End If
	CloseFile (file)
	OSDText$="Saved:"
	OSDText1$=FileName$
Else 					;The file could not be opened for Writing
    Cls
	AppTitle "Error "+FileName$+" could NOT be saved" ; Show it in the App Titlebar
	Color $ff,0,0
;	TextY (-2,"")							;Display an error text 
;	TextY (1,"File could NOT be saved !!!")
;	TextY (0,"ERROR! File could NOT be saved !!!")
	OSDText$="Error: 
	If FileType(FR_folder$)=0 				;Displays if the reason was, because the folder doesnt exists (i know it could be checked earlier  :p (but it could be deleted meanwhile aswell ^^))
;		TextY (0,"Folder does not exist:")
;		TextY (0,FR_folder$)
    OSDtext1$="Reason: Folder does not exist"
	OSDText2$=FR_folder$
	EndIf
;	TextY (1,"Press any Key on Keyboard")
	Color $ff,$ff,$ff
	Flip 
;	WaitKey()							;Wait for a keypress 
EndIf

Flip 
FlushKeys()
Delay 250
Return

;				File Requester

.FileRequester		; Returns filename in ToLoad$, if its empty then it was cancelled or not available 
; 					; Returns FR_Error - 1 Directory doesnt exists
; before call set :
; FR_folder$="c:\data"	; 		to the folder which will be checked
; FR_ext$=".*"	;				as extension of the file displayed, ".*" for every file
; ReqMaxShow=5	;				set how many files will be displayed at once
;ReqMaxShow=(GraphicsHeight()/FontHeight())-4  ;Use this to have height resolution-dependant number of the displayed items 

FR_LoadedFile=0		;Resets the variable for multiple uses

fr_delay=80   ;Arrow Up/Down Delay time, in millisecs
FR_Error=0

If FileType(FR_folder$)<2 Then ToLoad$="": FR_Error=1 : Goto theend

For fr_x=1 To 2						;Reads the Current folder 2 times ! (to get the Right number for the Dim)
									;Because of the filtering ability, to store only filtered files in the FR_Filename$ 
	FR_DIR=ReadDir(FR_folder$)		;Open the directory for reading
	If fr_x=2 														;Second pass, make a dim statement
		Dim FR_Filename$(FR_LoadedFile)		;dimensioning the Array
		FR_LoadedFile=0						;reset it for later use
	EndIf
	
	Repeat
		FR_File$=NextFile$(FR_DIR)			;Get the next file from the directory
		If FR_File$="" Then Exit 			;Exit the loop if the last file is reached
		If FileType(FR_folder$+"\"+FR_File$) = 1 Then 		; File Exists !
			If Lower$(Right$(FR_File$,Len(FR_ext$)))=FR_ext$ Or FR_ext$=".*"	;Check the extension or every file
				FR_LoadedFile=FR_LoadedFile+1							;1st pass: count the available files
				If fr_x=2 Then FR_Filename$(FR_LoadedFile)=FR_File$		;2ns pass: add to FR_Filename$()
			End If
		End If 
	Forever
	
	CloseDir (FR_DIR)			;Close the Directory 
	If FR_LoadedFile=0 Then ToLoad$="" : Goto theend	;There were no matching Files found, 
								;set the ToLoad$ as "" and go to the End, bypassing the requester
Next

FR_RequesterPos=1		;Resetting the variables for multiple calls !
FR_ReqOffset=0

;Check if Enter,Return or Esc keys are Held down 

While KeyDown(156) Or KeyDown(28) Or KeyDown(1) ; Delay The Program Execution until theese keys are released
	Delay 1
Wend
FlushKeys()
Delay 10

FR_time=MilliSecs()				;Arrow Up and Down delay

Repeat 							;Requester Loop
	Cls
	If bgimage<>0 Then DrawImage bgimage,0,0	;Draw the background image if available, or skip it ^^
	Color $ff,$ff,$ff
	TextY (-2,"Please Choose:")					;self expained
	Color $FF,$FF,$0
	TextY (0, String$("-",40))					;Displays a line 
	
	
	If KeyDown(200) And MilliSecs()-FR_time>fr_delay ; Arrow Up
		FR_time=MilliSecs()
		FR_RequesterPos=FR_RequesterPos-1
	EndIf
	
	If KeyDown(208) And MilliSecs()-FR_time>fr_delay; Arrow Down
		FR_time=MilliSecs()
		FR_RequesterPos=FR_RequesterPos+1
	EndIf
	
	If KeyDown(156) Or KeyDown(28)			;Return or Enter
		Exit
	EndIf
	
	If KeyDown(1) 							;Esc
		ToLoad$=""		; Set the ToLoad$ as ""
		Exit
	EndIf
	
	If FR_RequesterPos<1 					;Calculating the Highlighted Text position
		FR_RequesterPos=1
		If FR_ReqOffset>0					;if it were lower than 0, scroll up
			FR_ReqOffset=FR_ReqOffset-1
		EndIf
	EndIf
	
	If FR_RequesterPos>ReqMaxSHow 
		FR_RequesterPos=ReqMaxShow
		If FR_ReqOffset<FR_LoadedFile-ReqMaxShow	;;if it were lower than 0, scroll down
			FR_ReqOffset=FR_ReqOffset+1
		EndIf
	EndIf
	
	If FR_RequesterPos>FR_LoadedFile Then FR_RequesterPos=FR_LoadedFile ; Dont go below Maximal loaded files
	
	For fr_LX=1 To ReqMaxShow				;This loop displays the filenames available up to the ReqMaxShow
		If fr_LX=FR_RequesterPos
			Color $0,$ff,$ff				; This is the highlight Color
			ToLoad$=FR_Filename$(fr_LX+FR_ReqOffset)	;Set ToLoad$ as the filename
		Else
			Color $Af,$af,$af				;This is the normal Color
		EndIf
		If fr_LX <= FR_LoadedFile
			TextY (0,FR_Filename$(fr_LX+FR_ReqOffset))	;Here is the text displayed
		Else
			;TextY (0,"-empty slot-") ; Uncheck to display Empty Slot if there are not 
			;							enough files to fit the ReqMaxShow display
		EndIf
	Next
	
	Color $FF,$FF,$0
	TextY (0,String$("-",40))					;Displays a line 
	Color $ff,$ff,$ff
	TextY (0,"Return to Accept, Esc to Cancel")
	Delay 10
	Flip
Forever						;Requester loop goes on forever and forever (until esc or return) or no files found

.theend
FlushKeys()
Return 

Function OutlineText(x,y,Txt$)
				Color $30,$50,$90
				For zzx=-1 To 1
					For zzy=-1 To 1
						If zzx<>0 And zzy<>0 Then Text x+zzx,y+zzy,Txt$
					Next
				Next
				Color $ff,$ff,$ff
				Text x,y,Txt$
End Function

Function OutlineText1(x,y,Txt$)
				Color $90,$50,$30
				For zzx=-1 To 0
					For zzy=-1 To 0
					  Text x+zzx,y+zzy,Txt$
					Next
				Next
				Color $ff,$ff,$ff
				Text x,y,Txt$
End Function


Function Screen(x,y)
	DeskX=api_GetSystemMetrics(0)
	DeskY=api_GetSystemMetrics(1)
	If x>DeskX Then x=DeskX
    If x<64 Then x=64
	If y>DeskY Then y=DeskY
    If y<64 Then y=64
    bits=api_GetDeviceCaps(api_GetDC( api_GetDesktopWindow()),12)
	Graphics x,y,bits,2
	Graphics x,y,bits,3
	api_MoveWindow(api_GetActiveWindow(),0,0,DeskX,DeskY,True)
End Function

Function Time_mSec(x)
;Global Timer_m=MilliSecs() ;<---Put at the start of your program---
; x can be -1<,0 or >0 
;- numbers returns miliseconds passed since last function call with 0
;0 resets the timer
;above 0 sets a countdown timer in seconds
	
	If x>0
	    y1=MilliSecs()-Timer_m
		If Len(y1)>2
			y2=Left$(y1,Len(y1)-2)
			Return x-Int(y2)
		Else
			Return x
		EndIf
	ElseIf x=0
		Timer_m=MilliSecs()
    Else
	    y1=Left$(MilliSecs(),7)
		y2=Left$(Timer_m,7)
		Return Int(y1)-Int(y2)
	EndIf
End Function

Function TextY (num,txt$)
;Num = How many columns to skip
;Replaces Print with Text
;Every Function call displays the text
;1 line under the old one, like calling
;multiple print statements after eachother.
;
; Set num to -2 to make the text go on top (like locate 0,0)
; Use the Global TxtY=-2 outside this function
;
;Global TxtY=-2       ;Make TxtY global variable for displaying help text 
	If num=-2 
		TxtY=0
	Else
		TxtY=TxtY+(FontHeight()*(num+1))
	EndIf
	Text 0,TxtY,txt$
End Function	

Function hex2dec%(hex_number$)
; Converts the supplied hex number into a decimal number
; If hex_number isn't a valid hex number, then returns -1
; written by Matt Burns (Blu_Matt / matt@blis.co.uk)
	Local the_hex$=Upper(Trim(hex_number$))		; the hex number
	Local base_power%=0							; the current base power
	Local base%=16								; the base to convert from
	Local the_dec%=0							; the decimal representation
	Local chars%=0
	Local hex_length%=Len(the_hex$)				; current length of the hex
	If Left(the_hex$,1)="$" Then 				; removes any leading "$"
		the_hex$=Right(the_hex$,hex_length%-1)
	EndIf
	hex_length%=Len(the_hex$)					; current length of the hex
	Local chars_left%=hex_length%				; current number of chars left
	Local hex_left$=the_hex$					; current hex left
	Repeat
		current_hex$=Right(hex_left$,1) 		; gets the current hex char
		If ((Asc(current_hex$)>=Asc("0")) And (Asc(current_hex$)<=Asc("9"))) Then
			hex_dec%=current_hex$				; digit 0-9
		ElseIf ((Asc(current_hex$)>=Asc("A")) And (Asc(current_hex$)<=Asc("F"))) Then
			hex_dec%=Asc(current_hex$)-55		; char A-F
		Else
			Return -1 							; found an illegal character, aborting...
		EndIf
		the_dec%=the_dec%+((base%^base_power%)*hex_dec%)	; add the local hex digit to the total
		base_power%=base_power%+1				; increase the base power
		chars_left%=chars_left%-1				; reduce the number of chars left
		hex_left$=Left(hex_left$,chars_left%)	; sets the remainder
	Until chars_left%=0
	Return the_dec%								; return the result
End Function

.demo
Data 152
Data $0002,$0006,$0008,$0009,$000E,$000E,$0015,$0014,$001D,$0013,$0025,$0011,$002E,$000C,$0036,$0006,$0036,$0006,$003C,$000C
Data $0042,$0015,$0049,$0018,$0050,$0017,$0058,$0014,$005F,$0010,$0066,$000B,$006E,$0005,$006E,$0005,$0075,$0010,$007D,$0015
Data $0087,$0019,$0090,$0018,$0099,$0015,$00A2,$0011,$00AA,$000D,$00B2,$0007,$00B9,$0004,$00B9,$0004,$00B9,$0004,$00C0,$000E
Data $00C9,$0015,$00D2,$0016,$00DC,$0016,$00E6,$0016,$00EE,$0014,$00F5,$0010,$00FD,$000E,$0105,$000A,$010D,$0006,$010D,$0006
Data $010D,$0006,$0115,$000E,$0118,$0019,$0119,$0024,$0120,$0029,$0127,$0023,$012A,$0017,$012E,$000D,$0131,$0004,$0131,$0004
Data $0134,$0010,$0139,$0019,$013F,$001E,$013E,$001E,$0136,$0024,$012F,$0029,$012A,$0032,$0128,$003C,$0128,$0045,$0128,$004E
Data $0129,$0059,$012D,$0064,$0131,$006E,$0138,$0076,$013D,$0080,$013D,$0080,$0135,$0085,$012B,$0087,$0121,$008C,$0119,$0094
Data $011A,$00A0,$0124,$00A8,$012C,$00AF,$0135,$00B6,$013B,$00BA,$013B,$00BA,$013B,$00BA,$013B,$00BA,$013B,$00BA,$0134,$00C1
Data $012C,$00C7,$012A,$00D2,$0129,$00DD,$0129,$00E8,$0128,$00F3,$0128,$00F3,$0128,$00F3,$0121,$00EA,$011A,$00E1,$0112,$00D9
Data $0109,$00D0,$0101,$00CF,$00F8,$00D3,$00EE,$00DC,$00E4,$00E7,$00DC,$00EF,$00D2,$00F3,$00CA,$00E9,$00C3,$00DE,$00BA,$00D2
Data $00B0,$00CC,$00A6,$00CC,$009C,$00CC,$0094,$00D3,$008C,$00DB,$0084,$00E5,$0081,$00EF,$0079,$00F3,$0079,$00F3,$0071,$00E8
Data $0069,$00DD,$0060,$00D8,$0057,$00D8,$004E,$00DB,$0046,$00DF,$003D,$00E7,$0035,$00EC,$002E,$00F4,$002E,$00F4,$0025,$00EA
Data $001C,$00DF,$0014,$00D4,$000B,$00D0,$0002,$00CD,$0002,$00CD,$000B,$00C4,$0014,$00BC,$001B,$00B1,$001B,$00A5,$0017,$0099
Data $0010,$0090,$0009,$0087,$0003,$007C,$0003,$007C,$000A,$0074,$0012,$006B,$0013,$0060,$0010,$0055,$000B,$004B,$0006,$0041
Data $0001,$0038,$0001,$0038,$0009,$0034,$0012,$0034,$001B,$002F,$0019,$0025,$0013,$001F,$000C,$0018,$0005,$0014,$0001,$000B
Data $0000,$0004,$0000,$0004,"FFFF"

.demo1

Data 104
Data $013F,$0067,$013A,$005F,$0134,$0057,$012C,$0050,$0121,$004D,$0117,$004D,$010C,$0050,$0104,$0055,$00FE,$005B,$00F7,$0061
Data $00F0,$0068,$00E8,$006E,$00DE,$0074,$00D5,$0078,$00CC,$0077,$00C4,$0073,$00BE,$006C,$00B7,$0062,$00B2,$005A,$00AE,$0052
Data $00A9,$004B,$00A3,$0045,$009A,$0043,$0092,$0046,$008C,$004C,$0086,$0053,$0080,$005A,$007A,$0061,$0074,$0067,$006F,$006E
Data $0068,$0073,$005E,$0076,$0058,$0071,$0054,$006B,$004F,$0062,$004B,$005B,$0048,$0055,$0043,$004D,$003E,$0046,$003A,$0042
Data $0033,$003E,$002C,$003D,$0024,$003E,$001E,$0042,$0017,$0048,$0012,$004E,$000D,$0054,$0008,$005B,$0004,$0063,$0000,$006D
Data $0000,$00AF,$0009,$00A6,$0012,$00A2,$001B,$009D,$0024,$00A1,$002C,$00A9,$0033,$00B2,$003A,$00BA,$0041,$00C2,$0049,$00BD
Data $0052,$00B5,$005D,$00AC,$0066,$00A6,$0072,$00A1,$0080,$009F,$008A,$00A3,$0092,$00A9,$009B,$00B1,$00A0,$00B8,$00A3,$00C3
Data $00A4,$00D0,$00A4,$00DE,$00A7,$00EB,$00AE,$00EC,$00B4,$00E5,$00B7,$00DA,$00BA,$00CC,$00BD,$00BF,$00C0,$00B7,$00C9,$00AF
Data $00D4,$00AD,$00DC,$00AD,$00E2,$00B4,$00E7,$00BB,$00EE,$00C6,$00F4,$00D2,$00F6,$00DD,$00FD,$00E9,$0102,$00ED,$010C,$00ED
Data $0111,$00E5,$0116,$00DC,$0119,$00D2,$011B,$00C7,$011A,$00BC,$011A,$00AE,$0121,$00AE,$0128,$00AE,$0130,$00AF,$0139,$00AF
Data $013E,$00AC,$013E,$009F,$013E,$0090,$013E,$007E

.demo2
Data 12
Data $0033,$0047,$003E,$0047,$004A,$0047,$0054,$0047,$0062,$0048
Data $006E,$0048,$007C,$0048,$0089,$0048,$0096,$0048,$00A3,$0049
Data $00AE,$0049,$00B9,$0049

Comments

None.

Code Archives Forum