Personnellement avec un module et une structure je préfère encapsulé mes données et passé par des getters et des setters plutôt que de donner accès directement à la structure.
L'avantage est que si les données sont lue ou écrite à divers endroit du programme et que l'on doivent modifié les données lues ou reçues (exemple éviter une division par zéro) ou ne devra agir que sur le getter ou setter concerné sans rien modifié d'autre.
Cette tache peut être fastidieuse, j'ai donc à l'aide de l'excellent tutoriel de falsam conçu un petit utilitaire pour faire cette tache qui copie le code dans le presse papier.
Je préfère vous poster le code car de cette manière vous pourrez le modifié à votre sauce.
Remarque : Windows only car l'api SendMessage_ est utilisée
Code : Tout sélectionner
#Font = 0
#MAIN_FORM = 0
Enumeration
#withName
#LST
#BT_VALIDE
#BT_CANCEL
EndEnumeration
Structure item
name.s
type.s
EndStructure
Global NewList myItem.item(),withName.s
Procedure Exit()
End
EndProcedure
Procedure Parse()
Protected selected.s = RemoveString(GetClipboardText(),Chr(13))
; count number of lines
Protected nl = CountString(selected,Chr(10))
Protected i,lng.s
For i = 1 To nl + 1
lng = StringField(selected,i,Chr(10))
AddElement(myItem())
With myItem()
\name = Trim(StringField(lng,1,"."))
\type = LCase(Trim(StringField(lng,2,".")))
EndWith
Next
EndProcedure
Procedure valide()
Protected code.s
withName = GetGadgetText(#withName)
If Not Len(withName)
MessageRequester("Getters & Setters","Please set name of with",#PB_MessageRequester_Info)
ProcedureReturn
EndIf
With myItem()
ForEach myItem()
code + "Procedure."+\type+" get_"+\name+"()"+Chr(10)
code +" ProcedureReturn "
If Len(withName)
code + withName+"\"
EndIf
code + \name +Chr(10)
code + "EndProcedure"+Chr(10)+Chr(10)
code + "Procedure set_"+\name+"("+\name+"."+\type+")"+Chr(10)
If Len(withName)
code + withName+"\"
EndIf
code +" " + \name+" = "+\name + Chr(10)
code + "EndProcedure"+Chr(10)+Chr(10)
Next
SetClipboardText(code)
MessageRequester("Getters & Setters","Your code has ban copied into the clipboard",#PB_MessageRequester_Info)
Exit()
EndWith
EndProcedure
Procedure fillLst()
ClearGadgetItems(#LST)
ForEach myItem()
AddGadgetItem(#LST,-1,myItem()\name)
Next
EndProcedure
Procedure Run()
;Load scintilla component
Protected HandleIDESci=Val(GetEnvironmentVariable("PB_TOOL_Scintilla"))
Protected y = 10
If HandleIDESci
;copy to memory the user selected
SendMessage_(HandleIDESci, #WM_COPY,0,0)
Else
MessageRequester("Warning", "Please run this software only from Purebasic ide",#PB_MessageRequester_Warning)
Exit()
EndIf
; Make window
LoadFont(#Font, "", 10)
SetGadgetFont(#PB_Default, FontID(#Font))
OpenWindow(#MAIN_FORM, 0, 0, 200, 320, "Gadget Editor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_Tool)
StickyWindow(#MAIN_FORM, #True)
TextGadget(#PB_Any,10,y,180,30,"Name of with")
y + 40
StringGadget(#withName,10,y,180,30,"")
y + 40
ListViewGadget(#LST,10,y,180,180)
y + 190
ButtonGadget(#BT_CANCEL,10,y,70,30,"Cancel")
ButtonGadget(#BT_VALIDE,120,y,70,30,"Ok")
Parse()
fillLst()
SetActiveGadget(#withName)
BindEvent(#PB_Event_CloseWindow,@Exit(),#MAIN_FORM)
BindGadgetEvent(#BT_CANCEL,@Exit())
BindGadgetEvent(#BT_VALIDE,@valide())
Repeat : WaitWindowEvent() : ForEver
EndProcedure
Run()
■ Installation.
- Compiler le code ci-dessus
- Allez dans le menu Outils de votre IDE et sélectionner l'item Outils Personnalisés
- Cliquez sur le bouton Nouveau
- Sélectionner l’exécutable de votre utilitaire (GadgetEditor.exe) dans le champ de saisie Ligne de commande.
- Cocher la case Attendre la fin du programme.
- Donner un nom à votre application dans le champ Nom.
- Cliquer sur le champ Raccourci puis presser simultanément la combinaison de touches Ctrl + Entree
- Pour finir cliquer sur Ok