It is no problem to have global variables, but it is clearer to combine them with structures.
Also, it is better to save this global group of variables, duplicate them, pass them as parameters.
To reduce rewriting, there are 'With' and 'EndWith'.
P.S.
Small gimmick to save program data ...
Code: Select all
EnableExplicit
; Change names
#CompanyName = "mk-soft"
#ApplicationName = "MyApp"
Global.i Int1,Int2
Global.b Flag1,Flag2
Global.s Str1,Str2
; Instead of use Global varibles as above, use structure to group the varibles together
Structure GlobalVaribles
Int1.i
Int2.i
Flag1.b
Flag2.b
Str1.s
Str2.s
EndStructure
; ****
Structure udtProgramData
; Header
DataPath.s
LastPath.s
; Data
Save.i
GlobalVars.GlobalVaribles
EndStructure
Global ProgramData.udtProgramData
Procedure LoadProgramData(FileName.s = "ProgramData.xml")
Protected basepath.s, subpath.s, datapath.s, filepath.s, xml
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
basepath = GetHomeDirectory()
subpath = basepath + "." + #CompanyName + #PS$
CompilerElse
basepath = GetUserDirectory(#PB_Directory_ProgramData)
subpath = basepath + #CompanyName + #PS$
CompilerEndIf
datapath = subpath + #ApplicationName + #PS$
filepath = datapath + FileName
If FileSize(filepath) > 0
xml = LoadXML(#PB_Any, filepath)
If xml And XMLStatus(xml) = #PB_XML_Success
ExtractXMLStructure(MainXMLNode(xml), @ProgramData, udtProgramData, #PB_XML_NoCase)
FreeXML(xml)
ProgramData\DataPath = datapath
ProcedureReturn #True
EndIf
EndIf
ProgramData\DataPath = ""
ProcedureReturn #False
EndProcedure
; ----
Procedure SaveProgramData(FileName.s = "ProgramData.xml")
Protected basepath.s, subpath.s, datapath.s, filepath.s, xml
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
basepath = GetHomeDirectory()
subpath = basepath + "." + #CompanyName + #PS$
CompilerElse
basepath = GetUserDirectory(#PB_Directory_ProgramData)
subpath = basepath + #CompanyName + #PS$
CompilerEndIf
datapath = subpath + #ApplicationName + #PS$
If FileSize(datapath) <> -2
If FileSize(subpath) <> -2
CreateDirectory(subpath)
EndIf
If FileSize(datapath) <> -2
CreateDirectory(datapath)
EndIf
EndIf
filepath = datapath + FileName
xml = CreateXML(#PB_Any)
If xml
If InsertXMLStructure(RootXMLNode(xml), @ProgramData, udtProgramData)
FormatXML(xml, #PB_XML_ReFormat)
SaveXML(xml, filepath)
EndIf
FreeXML(xml)
EndIf
EndProcedure
; ----
Procedure P1(*P1Var.GlobalVaribles)
With *P1Var
\Int1+10
\Flag1=#True
\Str1="Str"+Str(\Int1)
EndWith
EndProcedure
Procedure P2(*P2Var.GlobalVaribles)
*P2Var\Int2=20
*P2Var\Flag2=#False
*P2Var\Str2="Str2"
EndProcedure
Procedure Main()
Protected GVar.GlobalVaribles
If LoadProgramData()
CopyStructure(ProgramData\GlobalVars, GVar, GlobalVaribles)
Debug "SaveCount: " + ProgramData\Save
EndIf
Debug "DataPath: " + ProgramData\DataPath
P1(@GVar)
Debug GVar\Int1
Debug GVar\Flag1
Debug GVar\Str1
P2(@GVar)
Debug GVar\Int2
Debug GVar\Flag2
Debug GVar\Str2
CopyStructure(GVar, ProgramData\GlobalVars, GlobalVaribles)
ProgramData\Save + 1
SaveProgramData()
EndProcedure
Main()