Portée des macros dans l'utilisation des modules

Partagez votre expérience de PureBasic avec les autres utilisateurs.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Portée des macros dans l'utilisation des modules

Message par PAPIPP »

Bonjour à tous.
sujet : Portée des macros
La doc ne donne pas la portée des macros. J’ai essayé de placer les 7 macros suivantes dans les positions suivantes.
1) En tête de programme
2) Dans un module avec ou pas les mêmes noms
3) En changeant les noms des macros ou si elles ont le même nom en modifiant par un signe = ou == ou => pour les reconnaitre
4) E n plaçant les macros et une structure dans le répertoire RESIDENTS

Pour vérifier le bon fonctionnement j’ai testé les variables et les structures .en testant en même temps la portée viable des macros alors que celles-ci ne peuvent être définies dans la section declaremodule.
Les éléments acceptés dans la section DeclareModule peuvent être les suivants: procédures (seule la déclaration des procédures est autorisée), structures, macros, variables, constantes, énumérations, tableaux, listes, maps et les étiquettes (labels).

Dans un premier temps laissons ces macros en tête de programme

Et faisons un essai avec le programme suivant :

Code : Tout sélectionner

;************************************** Macros d'origine pour essai  qui servent à être placé dans RESIDENTS pou observer les effets  **********
; Macro _q_t_
;   "
; EndMacro
; Macro _n(__n)
;   _q_t_#__n#=_q_t_+Str(__n)+" "
; EndMacro
; Macro _f(__F,__nv=8)
;   _q_t_#__F#=_q_t_+StrF(__f,__nv)+" "
; EndMacro
; Macro _d(__D,__nv=8)
;   _q_t_#__D#=_q_t_+StrD(__D,__nv)+" "
; EndMacro
; Macro _s(__S)
;   _q_t_#__S#=_q_t_+__S+" "
; EndMacro
; Macro _Q(__Q)
;   _q_t_#__Q#=_q_t_+Str(__Q)+" "
; EndMacro
; Macro _NL
;   "N°L="+Str(#PB_Compiler_Line)+" ** "
; EndMacro
; ; ************* les structures  en tt^$ete du PRG  *******************
; Structure s_256B ; ou 256 octets
;   StructureUnion
;     VB.b[256]
;     VA.a[256]
;     VC.c[256] ; en ascii
;     VU.u[128]
;     VW.w[128]
;     VL.l[64]
;     VI.i[64] ; en 32bits
;     VF.f[64]
;     VQ.q[32]
;     VD.d[32]
;     VS1.s{256}
;     VS256.s{1}[256]     ; V comme variable S comme String Premier nombre de caractère deuxième nombre d'occurrences
;   EndStructureUnion
; EndStructure
;****************** Macros de même fonction que les précédentes mais avec un mom différent  pour utilisation après compile des premières*****************
;****************** Macros de même nom que les suivante dans le module mais avec => pour les distinguer *************

Macro __q_t_
  "
EndMacro
Macro __n(__n)
  __q_t_#__n#=>__q_t_+Str(__n)+" "
EndMacro
Macro __f(__F,__nv=8)
  __q_t_#__F#=>__q_t_+StrF(__f,__nv)+" "
EndMacro
Macro __d(__D,__nv=8)
  __q_t_#__D#=>__q_t_+StrD(__D,__nv)+" "
EndMacro
Macro __s(__S)
  __q_t_#__S#=>__q_t_+__S+" "
EndMacro
Macro __Q(__Q)
  __q_t_#__Q#=>__q_t_+Str(__Q)+" "
EndMacro
Macro __NL
  "N°L=>"+Str(#PB_Compiler_Line)+" ** "
EndMacro




;***************************************************************************************************************************
;*                                  ICI NOUS SOMMES DANS LE MODULE                                                            *
;***************************************************************************************************************************

DeclareModule essai
Structure s_256Byt ; ou 256 octets
  StructureUnion
    VB.b[256]
    VA.a[256]
    VC.c[256] ; en ascii
    VU.u[128]
    VW.w[128]
    VL.l[64]
    VI.i[64] ; en 32bits
    VF.f[64]
    VQ.q[32]
    VD.d[32]
    VS1.s{256}
    VS256.s{1}[256]     ; V comme variable S comme String Premier nombre de caractère deuxième nombre d'occurrences
  EndStructureUnion
EndStructure
Define STC.s_256Byt
Dim tab.l(30)
Define abcd.s
EndDeclareModule
;******************** Macros de même nom que les précédentes en tête de programme mais avec == pour les distinguer *************
Module essai
Debug "***************************************************************************************************************************"
Debug "*                                   ICI NOUS SOMMES DANS LE Module                                                        *"
Debug "***************************************************************************************************************************"

Macro __q_t_
  "
EndMacro
Macro __n(__n)
  __q_t_#__n#==__q_t_+Str(__n)+" "
EndMacro
Macro __f(__F,__nv=8)
  __q_t_#__F#==__q_t_+StrF(__f,__nv)+" "
EndMacro
Macro __d(__D,__nv=8)
  __q_t_#__D#==__q_t_+StrD(__D,__nv)+" "
EndMacro
Macro __s(__S)
  __q_t_#__S#==__q_t_+__S+" "
EndMacro
Macro __Q(__Q)
  __q_t_#__Q#==__q_t_+Str(__Q)+" "
EndMacro
Macro __NL
  "N°L=="+Str(#PB_Compiler_Line)+" ** "
EndMacro


For i=0 To 255
  STC\VC[i]=i
Next
For j=1 To 16 
  deb$=""
  For k=1 To 16
    indjk=(j-1)*16+(k-1)
    deb$+Str(STC\VC[indjk])+" "
  Next
  Debug __nl+deb$
Next

*tab=@tab(0);; Permet de vérifier que ce pointeur est disponible dans IDE sous la forme essai::*tab

For i=0 To 30
  tab(i)=i*i
Next

Debug __nl+deb2$
A.a='a'
B.b='b'
C.c='c'
D.d=23.25
F.f=54.52
abc.s="Element interne"
abcd=abc+" public"
abc+" privé"
Debug __NL+__s(a)+__s(abc)+__s(abcd)+__n(A)+__d(D)+__f(F)
; Debug _NL+__s(a)+_s(abc)+_s(abcd)+_n(A)+_d(D)+_f(F)  ;; supprimer le commentaire après avoir placé les macros et la structures_256b dans RESIDENTS

deb2$=""
For k=0 To 30 
  deb2$+__n(tab(k))
Next
Debug __NL+deb2$
; Debug _NL+deb2$  ;; supprimer le commentaire après avoir placé LES macros et la structures_256b dans RESIDENTS
EndModule
Debug "***************************************************************************************************************************"
Debug "*                                ICI NOUS SOMMES DANS LE PRG PRINCIPAL                                                    *"
Debug "***************************************************************************************************************************"
A.a='k'
B.b='l'
C.c='m'
D.d=2.45
F.f=67.89
abc.s="Element externe"
Debug __NL+__s(a)+__s(abc)+__s(essai::abcd); +__n(essai::A)+__d(essai::D)+__f(essai::F) ; la partie précédente n'est pas connue (pas de define dans declaremodule)

Debug essai::abcd+"  accessible dans le prg principal après déclaration dans le module et avec l'option Nom_module::nom_variable ***"

deb2$=""
For j=0 To 30 
  deb2$+__n(essai::tab(j))
Next
Debug __NL+deb2$
; Debug _NL+deb2$ ;; supprimer le commentaire après avoir placé LES macros et la structures_256b dans RESIDENTS

For j=1 To 16 
  deb$=""
  For k=1 To 16
    indjk=(j-1)*16+(k-1)
    deb$+Str(essai::STC\VC[indjk])+" "
  Next
  Debug __nl+deb$
;   Debug __nl+deb$ ;; supprimer le commentaire après avoir placé LES macros et la structures_256b dans RESIDENTS
Next



UseModule essai
Debug "***************************************************************************************************************************"
Debug "*                                ICI NOUS SOMMES DANS LE PRG PRINCIPAL  mais sous usemodule                               *"
Debug "***************************************************************************************************************************"
Define AAA.s_256Byt ; LA structure définie dans declaremodule est bien connue ici


Debug __NL+__s(a)+__s(abc)+__s(essai::abcd); +__n(A)+__d(D)+__f(F) ; la partie précédente n'est pas connue ici (pas de define dans declaremodule)
Debug __NL+__s(a)+__s(abc)+__s(abcd)
; Debug _NL+_s(a)+_s(abc)+_s(essai::abcd) ;; supprimer le commentaire après avoir placé LES macros et la structures_256b dans RESIDENTS
; Debug _NL+_s(a)+_s(abc)+_s(abcd) ;; supprimer le commentaire après avoir placé LES macros et la structures_256b dans RESIDENTS

deb2$=""
For j=0 To 30 
  deb2$+__n(tab(j))
Next
Debug __NL+deb2$
; Debug _NL+deb2$ ;; supprimer le commentaire après avoir placé LES macros et la structures_256b dans RESIDENTS
For j=1 To 16 
  deb$=""
  For k=1 To 16
    indjk=(j-1)*16+(k-1)
    deb$+Str(STC\VC[indjk])+" "
  Next
  Debug __nl+deb$
;   Debug _NL+deb2$ ;; supprimer le commentaire après avoir placé LES macros et la structures_256b dans RESIDENTS
Next


UnuseModule essai
Debug "***************************************************************************************************************************"
Debug "*                                ICI NOUS SOMMES DANS LE PRG PRINCIPAL  mais après unusemodule                            *"
Debug "***************************************************************************************************************************"

Debug __NL+__s(a)+__s(abc)+__s(essai::abcd); +__n(A)+__d(D)+__f(F) ; la partie précédente n'est pas connue ici (pas de define dans declaremodule)
; Debug _NL+_s(a)+_s(abc)+_s(essai::abcd) ;; supprimer le commentaire après avoir placé LES macros et la structure s_256b dans RESIDENTS

; Debug "*tab="+Str(essai::*TAB) ; erreur l'IDE nous propose pourtant *TAB qui n'est pas déclaré

On peut remarquer.que
1) les macros internes au module suivent les mêmes règles que les variables qui ne sont pas définies dans la section declaremodule
2) On peut donc donner les mêmes noms aux macros en tête de prg ou dans le module.
3) Seules les variables et les structures déclarées dans la section declaremodule peuvent être lues en externe
Nom_module ::nom_variable ou en utilisant usemodule nom_module unusemodule
4) On peut déclarer publiques les variables et les structures (voir Doc) alors que les macros ne peuvent pas l’être.

En conclusion les macros en tête du prg principal ne sont connues que dans le prg principal et pas dans le module
Et les macros définies dans le module ne sont connues que dans le module et ne peuvent pas être connues à l’extérieur.


Maintenant nous allons placer dans le répertoire RESIDENTS iles 7 premières Macros et la structure s_256b

Code : Tout sélectionner

Macro _q_t_
  "
EndMacro
Macro _n(__n)
  _q_t_#__n#=_q_t_+Str(__n)+" "
EndMacro
Macro _f(__F,__nv=8)
  _q_t_#__F#=_q_t_+StrF(__f,__nv)+" "
EndMacro
Macro _d(__D,__nv=8)
  _q_t_#__D#=_q_t_+StrD(__D,__nv)+" "
EndMacro
Macro _s(__S)
  _q_t_#__S#=_q_t_+__S+" "
EndMacro
Macro _Q(__Q)
  _q_t_#__Q#=_q_t_+Str(__Q)+" "
EndMacro
Macro _NL
  "N°L="+Str(#PB_Compiler_Line)+" ** "
EndMacro

Structure s_256B ; ou 256 octets
  StructureUnion
    VB.b[256]
    VA.a[256]
    VC.c[256] ; en ascii
    VU.u[128]
    VW.w[128]
    VL.l[64]
    VI.i[64] ; en 32bits
    VF.f[64]
    VQ.q[32]
    VD.d[32]
    VS1.s{256}
    VS256.s{1}[256]     ; V comme variable S comme String Premier nombre de caractère deuxième nombre d'occurrences
  EndStructureUnion
EndStructure
Pour vous faciliter le travail de placement dans le répertoire RESIDENTS voici un programme d'aide

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #String_0
  #String_2
  #String_5
  #Text_0
  #Text_2
  #Text_5
  #Button_0
  #Button_2
  #Button_5
  #Editor_41
  #Button_11
  #Button_12
  #Button_13
  #Text_6
  
EndEnumeration
Dim fic${256}(20)
Dim res${256}(20)
;}
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
;}
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 398, 69, 800, 446, "Aide pour créer un résident", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    StringGadget(#String_0, 145, 20, 520, 25, "")
    StringGadget(#String_2, 145, 65, 520, 25, "")
    StringGadget(#String_5, 145, 115, 520, 25, "")
    TextGadget(#Text_0, 10, 20, 125, 25, "LIB PB pour compiler", #PB_Text_Center|#SS_CENTERIMAGE)
    TextGadget(#Text_2, 10, 65, 125, 25, "NOM de la source", #PB_Text_Center|#SS_CENTERIMAGE)
    TextGadget(#Text_5, 10, 115, 125, 25, "PATH et NOM du résident", #PB_Text_Center|#SS_CENTERIMAGE)
    ButtonGadget(#Button_0, 690, 20, 100, 25, "Parcourir")
    ButtonGadget(#Button_2, 690, 65, 100, 25, "Parcourir")
    ButtonGadget(#Button_5, 690, 110, 100, 25, "Parcourir")
    EditorGadget(#Editor_41, 20, 205, 760, 235)
    ;     Font1 = LoadFont(#PB_Any, "Courier New"  ,  8, #PB_Font_Bold )
    Font1 = LoadFont(#PB_Any, "Courier New"  ,  8)
    SetGadgetFont(#Editor_41, FontID(Font1))
    TextGadget(#Text_6     , 10, 150, 430, 50, "",#PB_Text_Border);,#PB_Text_Border)
    ButtonGadget(#Button_11, 450, 155, 100, 30, "Création du Batch")
    ButtonGadget(#Button_12, 570, 155, 100, 30, "OK Créez")
    ButtonGadget(#Button_13, 690, 155, 100, 30, "Terminer")
    
  EndIf
EndProcedure

OpenWindow_Window_0()
Path_lib$="L:\program Files\purebasic"     ;;==> Path à corriger en fonction de votre environnement
;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
      ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      Select  EventGadget
        Case #String_0
        Case #String_2
        Case #String_5
          PathFil_Res$=GetGadgetText(#String_5)
        Case #Text_0
        Case #Text_2
        Case #Text_5
          ;************************************************************** BOUTON  Parcourir LIB PB ***********************************************************      
          
        Case #Button_0  ; bouton recherche chemin principal de PB
          Path_lib$=PathRequester("Donnez la librairie PureBasic",Path_lib$)
          SetGadgetText(#String_0,Path_lib$+"compilers\")
          ;       SetGadgetText(#String_2, Path_lib$)
          If FileSize(GetGadgetText(#String_0))=-1
            SetGadgetText(#Text_6, Path_lib$ + Chr(10) +" N'est pas un répertoire PB")
            Coul_t = GetGadgetColor(#text_6, #PB_Gadget_FrontColor)
            Coul_f = GetGadgetColor(#text_6, #PB_Gadget_BackColor)
            
            SetGadgetColor(#Text_6, #PB_Gadget_BackColor, RGB(0,0,$CE))
            SetGadgetColor(#Text_6, #PB_Gadget_FrontColor,RGB(255,255,0))
           SetGadgetText(#String_0,"")
          Else
           RGB_A=GetGadgetColor(#Button_0,#PB_Gadget_BackColor)      
            SetGadgetText(#Text_6,"")
            SetGadgetColor(#Text_6, #PB_Gadget_BackColor, RGB_A)
            SetGadgetColor(#Text_6, #PB_Gadget_FrontColor,RGB(0,0,0))

          SetGadgetText(#String_5, Path_lib$+"RESIDENTS\")
          EndIf
          ;****************************************************** BOUTON  Parcourir du prg.pb qui va faire un résident ********************************      
          
        Case #Button_2  ; recherche prg.pb qui va faire un résident
          FichierParDefaut$ = "L:\program files\PB520\"; Répertoire et fichier par défaut qui seront affichés
          ;  Avec la chaîne suivante nous allons définir les filtres ("|" comme séparateur) pour l'affichage de fichier :
          ;  1er  : "Texte (*.txt)" comme nom, ".txt" et ".bat" comme extension autorisée
          ;  2ème : "PureBasic (*.pb)" comme nom, ".pb" comme extension autorisée
          ;  3ème : "Tous les fichiers (*.*)" comme nom, "*.*" comme extension autorisée, valide pour tous les fichiers
          Filtre$ = "PureBasic (*.pb)|*.pb|Tous les fichiers (*.*)|*.*"
          Filtre  = 0                   ; utiliser  par défaut le premier des trois filtres possibles
          Path_Src$ = OpenFileRequester("Choisissez un fichier source", FichierParDefaut$, Filtre$, Filtre)
          SetGadgetText(#String_2, Path_Src$)
          ;****************************************************** BOUTON  Parcourir pour donner le nom du résident ********************************      
          
        Case #Button_5
          ;          Path_Res$ = PathRequester("Donnez le Chemin et dans la zone ,le nom du résident ", GetGadgetText(#String_5))
          FichierParDefaut$ = Path_lib$+"RESIDENTS\*.res"; Répertoire et fichier par défaut qui seront affichés
          Filtre$ = "Pb résident (*.res)|*.res |Tous les fichiers (*.*)|*.*"
          Path_Res$ = OpenFileRequester("Donnez le Nom d'un résident existant ou pas ", FichierParDefaut$, Filtre$, Filtre)
          ;************************** tester la structure du fichier *******************************
          If UCase(Right(path_res$,4))<>".RES"
          path_res$+".res"
          EndIf
          Debug path_res$
          SetGadgetText(#String_5, Path_Res$)
          PathFil_Res$=GetGadgetText(#String_5)
          ;          If FileSize(PathFil_Res$)>0
          ;           If  MessageRequester("ATTENTION LE FICHIER EXISTE DEJA ", "Voulez vous l'écraser",  #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
          ;           Else
          ;           PathFil_Res$=""
          ;           EndIf
          ;          EndIf
        Case #Editor_41
          ;            Debug event
          ;************************************************************** BOUTON  Création du Batch ***********************************************************      
        Case #Button_11
          ;       If FileSize(PathFil_Res$)>0
          ;           If  MessageRequester("ATTENTION FICHIER "+pathfil_res$+" EXISTE DEJA ", "Voulez vous l'écraser",  #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
          ;           Else
          ;           PathFil_Res$=""
          ;           SetGadgetText(#String_5, Path_lib$+"RESIDENTS\")
          ;           EndIf
          ;       EndIf
          If Path_lib$<>"" And Path_Src$<>"" And GetFilePart(PathFil_Res$)<>""
            ft$=Space(255)
            mask$="%YY"+Str(DayOfYear(Date()))
            fp$="PB"+FormatDate(mask$,Date())
            fb$=Path_lib$+fp$+".BAT"
            ;             GetTempFileName_(@U$,@fp$,000,@ft$)
            asci$ = Space($FFF)
            ASCII$="ECHO off"+Chr(10)
            ;             ASCII$+"pushd "+Chr(34)+path_lib$+Chr(34)+Chr(10)
            ;             ASCII$+"If (%2+CHR(10)==() Goto erreurf")
            ASCII$+"If exist "+Chr(34)+PathFil_Res$+Chr(34)+ "  del  "+Chr(34)+ PathFil_Res$+Chr(34)+Chr(10)
            ASCII$+ Chr(34)+Path_lib$+"compilers\pbcompiler"+Chr(34)+" "+Chr(34)+Path_Src$+Chr(34) + " /RESIDENT " +Chr(34)+ PathFil_Res$+Chr(34)+Chr(10)
            ClearGadgetItems(#Editor_41)
            AddGadgetItem(#Editor_41,-1,"REM Fichier "+fb$)
            AddGadgetItem(#Editor_41,-1, ASCII$)
            AddGadgetItem(#Editor_41,-1, "ECHO TAPEZ EXIT TAPEZ EXIT TAPEZ EXIT TAPEZ EXIT TAPEZ EXIT TAPEZ EXIT TAPEZ EXIT TAPEZ EXIT")
          Else
            MessageRequester("ATTENTION l'une de ces zones n'est pas correcte  ", "Lib="+Path_lib$+Chr(10)+"Source="+Path_Src$+Chr(10)+"Resident="+PathFil_Res$)
          EndIf
          ;************************************************************** BOUTON OK ***********************************************************      
        Case #Button_12   ; Bouton OK
          Texte$ = GetGadgetText(#Editor_41)
          
          For k=1 To 20
            fic$(k)=StringField(Texte$, k, Chr(34))
            If Len(fic$)=0
              mf=k
            EndIf  
            If RTrim(LTrim(UCase(fic$(k-1))))="DEL"
              fic2$=fic$(k)
              If k>1
                fic1$=fic$(k-2)
              EndIf 
            EndIf
            If RTrim(LTrim(UCase(fic$(k-1))))="/RESIDENT"
              fic3$=fic$(k)
            EndIf
          Next
          fic1$=RTrim(LTrim(fic1$))
          fic2$=RTrim(LTrim(fic2$))
          fic3$=RTrim(LTrim(fic3$))
          ;            Debug f_s(fic2$)+f_s(fic3$)
          If FileSize(fic2$)>0
            If fic2$=fic3$
              If  MessageRequester("ATTENTION FICHIER "+fic2$+" EXISTE DEJA ", "Voulez vous l'écraser",  #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
              Else
                PathFil_Res$=""
              EndIf
            Else
              If  MessageRequester("ATTENTION FICHIER "+fic2$+" EXISTE DEJA ", "Voulez vous le supprimer"+Chr(10)+"et créer "+fic3$,  #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
              Else
                PathFil_Res$=""
              EndIf
            EndIf
          EndIf
          If fic2$<>fic1$
            ;                                                                                     123456789012345678901234567890123456  1234567890123456789012345678901234567890
            ;   SetGadgetColor(#Text_6, RGB(255, 0, 0), #PB_Gadget_FrontColor)
            SetGadgetText(#Text_6, "Fichier de controle différent du fichier à supprimer"+Chr(10)+" fichier Controle     "+fic1$+Chr(10)+" fichier à supprimer "+fic2$)
            Coul_t = GetGadgetColor(#text_6, #PB_Gadget_FrontColor)
            Coul_f = GetGadgetColor(#text_6, #PB_Gadget_BackColor)
            SetGadgetColor(#Text_6, #PB_Gadget_BackColor, RGB(0,0,$CE))
            SetGadgetColor(#Text_6, #PB_Gadget_FrontColor,RGB(255,255,0))
            
            
            ;   SetGadgetColor(#Text_6, RGB(255, 0, 0), #PB_Gadget_FrontColor)
            PathFil_Res$=""
          EndIf
          Texte$ = GetGadgetText(#Editor_41)
          If Texte$<>"" And  PathFil_Res$<>""
            FB.l=CreateFile(#PB_Any,fb$)
            WriteData(FB, @Texte$, Len(Texte$))
            CloseFile(FB)
            prg=RunProgram("cmd"," /C "+ Chr(34)+fb$+Chr(34) ,"",30)
            If prg
              AddGadgetItem(#Editor_41,-1,"******************************** R E S U L T A T S *******************************************")
              s_ascii$=ReadProgramString(prg)
              Texte$=s_ascii$
              OemToChar_(@s_ascii$,@s_ascii$)
              texte2$=s_acii$+Chr(10)
              Resultat=AddGadgetItem(#Editor_41,-1,s_ansi$)
              While ProgramRunning(prg)
                s_ascii$=ReadProgramString(prg)
                OemToChar_(@s_ascii$,@s_ascii$)
                Resultat=AddGadgetItem(#Editor_41,-1,s_ascii$)
                texte2$+s_ascii$+Chr(10)
              Wend
            EndIf
            For k=1 To 20
              res$(k)=StringField(texte2$,k,Chr(10))
              p_r=FindString(UCase(res$(k)),"RESIDENT",1)
              p_c=FindString(UCase(res$(k)),"CREATED",1)
              If p_r<>0
                mp_r=p_r
                If p_c<>0
                  mp_c=p_c
                  mk=k
                EndIf
              EndIf
            Next
          EndIf
        Case  #Button_13
          If mk>0 And mp_r>0 And mp_c>0
            Resultat=DeleteFile(fb$)
            CloseWindow(#Window_0)
            Break
          Else
            If MessageRequester("Vous n'avez pas réussi à créer "+Chr(10)+"Le résident ="+PathFil_Res$,"Voulez-vous continuer ? Oui ou Non",#PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes
              ;       Coul_t = GetGadgetColor("text_6, #PB_Gadget_FrontColor)
              ;   Coul_f = GetGadgetColor("text_6, #PB_Gadget_backColor)
              SetGadgetText(#Text_6, "")
              SetGadgetColor(#Text_6, #PB_Gadget_BackColor, Coul_f)
              SetGadgetColor(#Text_6, #PB_Gadget_FrontColor,coul_t)
              
            Else
              Resultat=DeleteFile(fb$)
              CloseWindow(#Window_0)
              Break
            EndIf
            
          EndIf
      EndSelect
      ; ////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
;
Après avoir placé les 7 macros et la structure s_256b dans le répertoire RESIDENTS
Nous pouvons observer que les 7 macros et la structure s_256b sont accessibles en tout point du programme
ils sont devenus "Global" ce qui réduit le champ de programmation.
exemple précédent après avoir placé les 7 macros et la structure dans RESIDENTS

Code : Tout sélectionner


;***************************************************************************************************************************
;*       ICI NOUS SOMMES DANS LE MODULE    après avoir placé les macros et la structure s_256b dans RESIDENTS              *
;***************************************************************************************************************************

DeclareModule essai
Define STC.s_256B
Dim tab.l(30)
Define abcd.s
EndDeclareModule
;******************** Macros de même nom que les précédentes en tête de programme mais avec == pour les distinguer *************
Module essai
Debug "***************************************************************************************************************************"
Debug "*                                   ICI NOUS SOMMES DANS LE Module                                                        *"
Debug "***************************************************************************************************************************"

For i=0 To 255
  STC\VC[i]=i
Next
For j=1 To 16 
  deb$=""
  For k=1 To 16
    indjk=(j-1)*16+(k-1)
    deb$+Str(STC\VC[indjk])+" "
  Next
  Debug _nl+deb$
Next

*tab=@tab(0);; Permet de vérifier que ce pointeur est disponible dans IDE sous la forme essai::*tab

For i=0 To 30
  tab(i)=i*i
Next

Debug _nl+deb2$
A.a='a'
B.b='b'
C.c='c'
D.d=23.25
F.f=54.52
abc.s="Element interne"
abcd=abc+" public"
abc+" privé"
Debug _NL+_s(a)+_s(abc)+_s(abcd)+_n(A)+_d(D)+_f(F)  ;; supprimer le commentaire après avoir placé les macros et la structures_256b dans RESIDENTS

deb2$=""
For k=0 To 30 
  deb2$+_n(tab(k))
Next
Debug _NL+deb2$  ;; supprimer le commentaire après avoir placé LES macros et la structures_256b dans RESIDENTS
EndModule
Debug "***************************************************************************************************************************"
Debug "*                                ICI NOUS SOMMES DANS LE PRG PRINCIPAL                                                    *"
Debug "***************************************************************************************************************************"
A.a='k'
B.b='l'
C.c='m'
D.d=2.45
F.f=67.89
abc.s="Element externe"
Debug _NL+_s(a)+_s(abc)+_s(essai::abcd); +__n(essai::A)+__d(essai::D)+__f(essai::F) ; la partie précédente n'est pas connue (pas de define dans declaremodule)
Debug _s(essai::abcd) ;;+"  accessible dans le prg principal après déclaration dans le module et avec l'option Nom_module::nom_variable ***")
deb2$=""
For j=0 To 30 
  deb2$+_n(essai::tab(j))
Next
Debug _NL+deb2$ ;; supprimer le commentaire après avoir placé LES macros et la structures_256b dans RESIDENTS
For j=1 To 16 
  deb$=""
  For k=1 To 16
    indjk=(j-1)*16+(k-1)
    deb$+Str(essai::STC\VC[indjk])+" "
  Next
  Debug _nl+deb$ ;; supprimer le commentaire après avoir placé LES macros et la structures_256b dans RESIDENTS
Next

UseModule essai
Debug "***************************************************************************************************************************"
Debug "*                                ICI NOUS SOMMES DANS LE PRG PRINCIPAL  mais sous usemodule                               *"
Debug "***************************************************************************************************************************"
Define AAA.s_256B ; LA structure définie dans declaremodule est bien connue ici
Debug _NL+_s(a)+_s(abc)+_s(essai::abcd) ;; supprimer le commentaire après avoir placé LES macros et la structures_256b dans RESIDENTS
Debug _NL+_s(a)+_s(abc)+_s(abcd) ;; supprimer le commentaire après avoir placé LES macros et la structures_256b dans RESIDENTS
deb2$=""
For j=0 To 30 
  deb2$+_n(tab(j))
Next

Debug _NL+deb2$ ;; supprimer le commentaire après avoir placé LES macros et la structures_256b dans RESIDENTS
For j=1 To 16 
  deb$=""
  For k=1 To 16
    indjk=(j-1)*16+(k-1)
    deb$+Str(STC\VC[indjk])+" "
  Next
;   Debug __nl+deb$
  Debug _NL+deb2$ ;; supprimer le commentaire après avoir placé LES macros et la structures_256b dans RESIDENTS
Next
UnuseModule essai
Debug "***************************************************************************************************************************"
Debug "*                                ICI NOUS SOMMES DANS LE PRG PRINCIPAL  mais après unusemodule                            *"
Debug "***************************************************************************************************************************"

Debug _NL+_s(a)+_s(abc)+_s(essai::abcd) ;; supprimer le commentaire après avoir placé LES macros et la structure s_256b dans RESIDENTS

; Debug "*tab="+Str(essai::*TAB) ; erreur l'IDE nous propose pourtant *TAB qui n'est pas déclaré

Il en sera de même pour :
Les Constantes.
Les Structures.
Les interfaces.
Les Macros.
Les Prototypes.
qui peuvent aussi être placés dans le répertoire RESIDENTS
A plus
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.