Page 1 sur 1

Expréssions régulière

Publié : lun. 02/nov./2015 8:33
par microdevweb
Bonjour à tous,

Bien voila j'ai fais une petite boulette, dans mon code du GDI du RAD je gère le multi-langue avec une tableau. Mais plutôt que de créer un seul tableau utilisé par toutes mes procédures et fenêtre. Je crée un tableau à chaque procédure (voila la boulette)

Code : Tout sélectionner

Procedure OpenTilteTbForm()
      Dim txt$(3,#NbLg)
      txt$(0,#Fr)="Changement du titre de la fenêtre"
      txt$(0,#En)="Changed title of window"
      txt$(1,#Fr)="Titre"
      txt$(1,#En)="Title"
      txt$(2,#Fr)="Valider"
      txt$(2,#En)="Submit"
      txt$(3,#Fr)="Annuler"
      txt$(3,#En)="Chancel"
      Protected Flag=#PB_Window_ScreenCentered|#PB_Window_SystemMenu,
      W=380,H=30,M=10,X=10,Y=10,tmp
      DisableWindow(#MainForm,#True)
      OpenWindow(#TilteTbForm,0,0,400,(H*3)+(M*4),txt$(0,gCuLg),Flag,WindowID(#MainForm))
      tmp=TextGadget(#PB_Any,X,Y,W,H,txt$(1,gCuLg))
      SetGadgetFont(tmp,FontID(#ArialM))
      Y+H
      StringGadget(#TilteTbLabel,X,Y,W,H,"")
      SetGadgetFont(#TilteTbLabel,FontID(#ArialM))
      Y+H+M+M
      W=(W/2)-M
      ButtonGadget(#TilteTbSubmit,X,Y,W,H,txt$(2,gCuLg))
      SetGadgetFont(#TilteTbSubmit,FontID(#ArialM))
      X+W+M
       ButtonGadget(#TilteTbChancel,X,Y,W,H,txt$(3,gCuLg))
       SetGadgetFont(#TilteTbChancel,FontID(#ArialM))
       BindEvent(#PB_Event_CloseWindow,@CloseTilteTbForm(),#TilteTbForm)
       BindGadgetEvent(#TilteTbChancel,@CloseTilteTbForm())
       BindGadgetEvent(#TilteTbSubmit,@SaveTilteTbForm())
EndProcedure
Bon cela fonctionne évidement, mais j'aurais du placer mon tableau dans un seule fichier ou emplacement, pourquoi? Parce que cela facilitera la maintenance de l’orthographe et traduction. Ne voulant pas vraiment me retaper 3000 lignes de code, je voudrais faire une petite routine qui doit faire ceci en gros
  • Isoler le code de chaque procédure (bon ça facile)
  • Trouver le texte qui suit txt$(?,#Fr)
  • mémoriser le texte dans le nouveau tableau
  • Remplacer txt$(?,gCuLg) par le nouveau tableau
  • Supprimer l'ancien tableau
Je penses que la meilleurs solution est l'utilisation des expressions régulière, mais je ne les ai jamais vraiment utilisé, j'utilise plutôt StringField etc...

Donc voila si vous connaissez bien cette matière un petit coup de pouce ne serait pas de refus.

Ps: Je serais honnête je n'ai pas vraiment cherché

Re: Exprésions régulière

Publié : lun. 02/nov./2015 9:52
par Ar-S
Te retaper ton code c'est sûr que c'est pas pratique par pour une gestion multilangue, pourquoi n'est tu pas passé par un fichier pref, c'est très utile pour ça et surtout, ça ne t'oblige pas à recompiler à chaque faute d'orthographe ou modif !
Ce n'est pas un hasard si la grand majorité des logiciels on un fichier .lng à part.

Je ne suis pas certain qu'une expression régulière soit la meilleur solution car dans tout les cas tu vas devoir te taper du findstring,mid,replacestring etc, et ça, en espérant que tu n’as pas mis d'espaces à certains endroits et pas à d'autres dans tes lignes à modifier.

ça te donne pas mal de taf mais franchement, à mon avis tu seras gagnant sur le long terme.

exemple :

Code : Tout sélectionner

 ; Créer un fichier langue
; ----------------------------------------------------
  CreatePreferences(GetTemporaryDirectory()+"lng.ini")
  
  PreferenceGroup("FR")
  WritePreferenceString("TXT1", "Changement du titre de la fenêtre")
  WritePreferenceString("TXT2", "Titre")
  
  PreferenceGroup("US")
  WritePreferenceString("TXT1", "Changed window's title")
  WritePreferenceString("TXT2", "Title")
  
  ClosePreferences()
  ; ----------------------------------------------------

  Procedure ChoisirLangue(Langue.s)
    
    OpenPreferences(GetTemporaryDirectory()+"lng.ini")
    PreferenceGroup(Langue.s)
   While  NextPreferenceKey() 
    Debug "Clés du groupe : "+LANGUE.s + " " + PreferenceKeyName() + " = " + PreferenceKeyValue()
  Wend

    
  EndProcedure
  
  
  ; On vérifie
  ChoisirLangue("FR")
  
  ChoisirLangue("US")
  
  ; on supprime le lng du dossier temp pour l'exemple
  DeleteFile(GetTemporaryDirectory()+"lng.ini")
  
  End
  
Evidement, ton ; "Créer un fichier langue" n'est pas obligatoire, il te suffit de faire ton fichier txt toi même, c'est ce fichier que tu auras à éditer pour ajouter/modifier tes données.

ça ne répond pas à ta demande et j'en suis désolé mais mets cette option de coté. ;)

Re: Expréssions régulière

Publié : lun. 02/nov./2015 10:53
par microdevweb
Merci Ar-S pour ce conseille, mais un tableau n'est pas mal non plus

Bon je pige pas vraiment ces foutues expressions régulière donc voila un début de solution

Code : Tout sélectionner

TxtProcedure$=StringField(TxtProcedure$,1,"EndProcedure")
TxtProcedure$=StringField(TxtProcedure$,2,"Procedure")
TxtProcedure$=StringField(TxtProcedure$,2,"()")
;Calcul du nombre de tableau
Val$=StringField(TxtProcedure$,2,"Dim txt$(")
Val$=StringField(Val$,1,",#NbLg")
Nb=Val(Val$)
For N=0 To Nb
      TxtFr$=StringField(TxtProcedure$,2,"txt$("+Str(N)+",#Fr)="+Chr(34))
      TxtFr$=StringField(TxtFr$,1,Chr(34))
      TxtEn$=StringField(TxtProcedure$,2,"txt$("+Str(N)+",#En)="+Chr(34))
      TxtEn$=StringField(TxtEn$,1,Chr(34))
      Debug TxtFr$
      Debug TxtEn$
Next

Re: Expréssions régulière

Publié : lun. 02/nov./2015 12:13
par microdevweb
Bon voila je poste ma solution sans les expressions régulière

Code : Tout sélectionner

File$="GDI\include\MainForm.pbi"
Global NbDim=0
Global NewTab$
Global TxtFile$
Global TxtDefFile$
If OpenFile(0,File$)=0
      MessageRequester("Error","Canot open file")
      End
EndIf
TxtFile$=ReadString(0,#PB_UTF8|#PB_File_IgnoreEOL)
; Compte le nombre de procedure
NbProc=CountString(TxtFile$,"EndProcedure")
; Debug NbProc
For R=1 To NbProc
      TxtProcedure$=StringField(TxtFile$,R,"EndProcedure")
      DefTxtProcedure$=TxtProcedure$+"EndProcedure"
      TxtProcedure$=StringField(TxtProcedure$,2,"Procedure")
      TxtProcedure$=StringField(TxtProcedure$,2,"()")
      ;Calcul du nombre de tableau
      Val$=StringField(TxtProcedure$,2,"Dim txt$(")
      Val$=StringField(Val$,1,",#NbLg")
      DefTxtProcedure$=RemoveString(DefTxtProcedure$,"Dim txt$("+Val$+",#NbLg)"+Chr(13)+Chr(10))
      Nb=Val(Val$)
      If Val$<>""
            For N=0 To Nb
                  TxtFr$=StringField(TxtProcedure$,2,"txt$("+Str(N)+",#Fr)="+Chr(34))
                  TxtFr$=StringField(TxtFr$,1,Chr(34))
                  TxtEn$=StringField(TxtProcedure$,2,"txt$("+Str(N)+",#En)="+Chr(34))
                  TxtEn$=StringField(TxtEn$,1,Chr(34))
                  ;Sauvegarde du nouveau tableau
                  NewTab$+"gTxt$("+Str(NbDim)+",#Fr)="+Chr(34)+TxtFr$+Chr(34)+Chr(13)+Chr(10)
                  NewTab$+"gTxt$("+Str(NbDim)+",#En)="+Chr(34)+TxtEn$+Chr(34)+Chr(13)+Chr(10)
                  DefTxtProcedure$=ReplaceString(DefTxtProcedure$,"txt$("+Str(N)+",gCuLg)","gTxt$("+Str(NbDim)+",gCuLg)")
                  ; Efface les ancienne dimention
                  DefTxtProcedure$=RemoveString(DefTxtProcedure$,"txt$("+Str(N)+",#Fr)="+Chr(34)+TxtFr$+Chr(34)+Chr(13)+Chr(10))
                  DefTxtProcedure$=RemoveString(DefTxtProcedure$,"txt$("+Str(N)+",#En)="+Chr(34)+TxtEn$+Chr(34)+Chr(13)+Chr(10))
                  NbDim+1
            Next
      EndIf
      TxtDefFile$+DefTxtProcedure$
Next
SetClipboardText(NewTab$)
MessageRequester("","Le nouveau tableau à été copier")
SetClipboardText(TxtDefFile$)
MessageRequester("","Le nouveau code à été copier")