créer des alias dans un éditeur

Partagez votre expérience de PureBasic avec les autres utilisateurs.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

créer des alias dans un éditeur

Message par nico »

Dans cet exemple il faut que le mot finisse par un espace ou tabulation ou bien par la touche enter ce qui évite l'appel incessant de la procédure de recherche du mot écrit.

Code : Tout sélectionner

 ;{- Enumerations 
;{ Windows 
Enumeration 
  #Window_Editeur 
EndEnumeration 
;} 
;{ Gadgets 
Enumeration 
  #Editor_Alias 
  #Button_Window_Editeur 
EndEnumeration 
;} 
;} 

Global Dim Alias.s(99,1) 

Procedure Load_Editeur_Alias() 
  If OpenFile(0,"Alias.txt") 
    a=-1 
    While Eof(0)=0 
        If a<99 
          String.s=ReadString(0) 
          string1.s=StringField(String,1,Chr(9)) 
          string2.s=StringField(String,2,Chr(9)) 
          a=a+1 
          Alias(a,0)=string1:Alias(a,1)=string2 
        Else 
            Break 
        EndIf 
    Wend 
    CloseFile(0) 
  EndIf 
EndProcedure 


Procedure Recup_Mot_En_Cours(Fin_Caratere.l) 
      If Fin_Caratere=0 ; Traitement si la fin du mot est un espace ou un Tab 
      
          ; On récupère aussi l'index du curseur 
          SendMessage_(GadgetID(#Editor_Alias),#EM_GETSEL,@Sel_Debut,@Sel_Fin) 
          index_caractere=Sel_Fin 
          
          ; Maintenant on récupère l'index de la ligne 
          index_line = SendMessage_(GadgetID(#Editor_Alias),#EM_LINEFROMCHAR,index_caractere,0) 
                    
          ; On récupère aussi la position du premier caractère de la ligne en cours 
          First_caratere_in_line=SendMessage_(GadgetID(#Editor_Alias),#EM_LINEINDEX,-1,0) 
          
          ; ce qui permet ensuite de déterminer la position du caractere dans la ligne 
          Pos_caractere_in_line = index_caractere - First_caratere_in_line 
              
          ; on travaille maintenant sur la Phrase 
          Phrase.s= GetGadgetItemText(#Editor_Alias,index_line,0) 
          ;Debug phrase 
          
          Fin_Mot=Pos_caractere_in_line-1 ;on soustrait un caractère correpondant à l'espace ou au tab 
          
      Else    ; Traitement si la fin du mot est la commande Enter 
      
          ; On récupère l'index du curseur soustrait de 1 pour se retrouver sur la ligne précédente 
          SendMessage_(GadgetID(#Editor_Alias),#EM_GETSEL,@Sel_Debut,@Sel_Fin) 
          index_caractere=Sel_Fin-1 
          
          ; Maintenant on récupère l'index de la ligne précédente 
          index_line = SendMessage_(GadgetID(#Editor_Alias),#EM_LINEFROMCHAR,index_caractere,0) 
                    
          ; On récupère aussi la position du premier caractère de la ligne 
          First_caratere_in_line=SendMessage_(GadgetID(#Editor_Alias),#EM_LINEINDEX,index_line,0) 
          
          ; ce qui permet ensuite de déterminer la position du caractere dans la ligne 
          Pos_caractere_in_line = index_caractere - First_caratere_in_line 
              
          
          ; on travaille maintenant sur la Phrase 
          Phrase.s= GetGadgetItemText(#Editor_Alias,index_line,0) 
      
          Fin_Mot=Pos_caractere_in_line 
          
      EndIf 
      
          If phrase="" 
            ProcedureReturn 0 
          EndIf 
          
          If Fin_Mot>0 
              ; Recherche du début du mot 
              Offset.l=Fin_Mot 
              *pointeur=@Phrase+Fin_Mot 
              While *pointeur>=@Phrase 
                *pointeur=*pointeur-1 
                Offset=Offset-1 
                ; On recherche un espace ou une tabulation 
                If PeekB(*pointeur)=32 Or PeekB(*pointeur)=9 
                    Break 
                EndIf 
              Wend 
              
              Debut_Mot=Offset+1 
              Debug Debut_Mot 
    
              mot.s= PeekS(@Phrase+ Debut_Mot, Fin_Mot-Debut_Mot) 
              Debug mot 
    
              For a=0 To 99 
                  If Alias.s(a,0)="" 
                      Debug "break" 
                      Break 
                  ElseIf Alias.s(a,0)= mot 
                      Debug mot+"   "+Str(Len(mot)) 
                      SendMessage_(GadgetID(#Editor_Alias), #EM_SETSEL, Debut_Mot+First_caratere_in_line, Fin_Mot+First_caratere_in_line) 
                      SendMessage_(GadgetID(#Editor_Alias), #EM_REPLACESEL,1,Alias.s(a,1)) 
                      SendMessage_(GadgetID(#Editor_Alias),#EM_GETSEL,@Sel_Debut,@Sel_Fin) 
                      Sel_Fin=Sel_Fin+1 
                      SendMessage_(GadgetID(#Editor_Alias),#EM_SETSEL,@Sel_Fin,@Sel_Fin) 
                      Break 
                  EndIf  
              Next a  
          EndIf 
EndProcedure  

        
Procedure NouvelleProc( Hwnd, msg,  wParam, lParam) 
  ;Ici on récupère l'adresse d'origine de la procédure grâce à la 
  ;chaine qui l'identifie: "OriginProc" et le handle de la fenêtre 
  ;voir la fonction SetProp. 
  OriginProc.l= GetProp_(Hwnd, "OriginProc") 
  Select msg 
    Case #WM_CHAR 

    Enter.l=#False  
    If wParam=13 
      Enter.l=#True 
    EndIf 

    If wParam=32 Or wParam=13 Or wParam=9 
        result=CallWindowProc_(OriginProc,Hwnd,msg,wParam,lParam) 
        Recup_Mot_En_Cours(Enter) 
        ProcedureReturn result 
    EndIf 
    
    Case #WM_DESTROY 
        result=CallWindowProc_(OriginProc,Hwnd,msg,wParam,lParam) 
        ;Supprimer avant fermeture du programme la donnée associée à la fenêtre. 
        SetWindowLong_(Hwnd, #GWL_WNDPROC, OriginProc) 
        RemoveProp_(Hwnd,"OriginProc") 
        ProcedureReturn result 
    
  EndSelect 
  ;On renvoie tous les autres évènements à la procédure d'origine. 
  ProcedureReturn CallWindowProc_(OriginProc,Hwnd,msg,wParam,lParam) 
EndProcedure    

Procedure OpenWindow_Window_Editeur() 
  If OpenWindow(#Window_Editeur, 381, 209, 398, 217, "Ecrivez sgt ou ggt suivi d'un espace dans l'éditeur", #PB_Window_SystemMenu|#PB_Window_TitleBar) 
    If CreateGadgetList(WindowID(#Window_Editeur)) 
      EditorGadget(#Editor_Alias, 8, 72, 380, 136) 
      ButtonGadget(#Button_Window_Editeur, 8, 8, 206, 50, "Editer le Fichier des Alias avec Notepad", #PB_Button_MultiLine) 
      
      StickyWindow(#Window_Editeur,1) 

      ;Avec cette fonction, on récupère l'adresse d'origine de la procédure 
      ;pour ensuite la restituer, une fois le traitement terminé. 
      OriginProc = SetWindowLong_(GadgetID(#Editor_Alias), #GWL_WNDPROC, @NouvelleProc()) 
      
      ;Cette fonction est très utile car elle permet d'associer une nouvelle donnée 
      ;à n'importe quelles fenêtres crées en utlisant une chaine de caractère pour 
      ;l'identification; ça évite d'utiliser une valeur globale. 
      ;Ici on associe la valeur OriginProc identifiée par la chaine "OriginProc" 
      ;au StringGadget 
      SetProp_(GadgetID(#Editor_Alias), "OriginProc", OriginProc) 
    EndIf 
  EndIf 
EndProcedure 

If CreateFile(0,"Alias.txt") 
    WriteStringN(0,"sgt"+Chr(9)+"SetGadgetText(") 
    WriteStringN(0,"ggt"+Chr(9)+"GetGadgetText(") 
EndIf 

Load_Editeur_Alias() 

OpenWindow_Window_Editeur() 
  
  Repeat 
    Event = WaitWindowEvent() 
    Select Event 
      Case  #PB_Event_Gadget 
        Select EventGadget() 
              Case #Button_Window_Editeur 
                  Directory.s=GetCurrentDirectory() 
                  RunProgram("Notepad.exe", "Alias.txt", Directory,#PB_Program_Wait) 
                  SetActiveGadget(#Editor_Alias) 
        EndSelect 
        
      Case #WM_CLOSE 
        quit=1 
        
    EndSelect 
  Until quit=1   
Dernière modification par nico le dim. 04/févr./2007 17:15, modifié 4 fois.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Ca fonctionne bien, sauf un invalid memory access a la ligne 144 quand on quitte... (win98)

Dri
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je viens de le modifier, tu pourrais le retester Dr Dri!
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Nickel, le programme se termine correctement

Dri
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Arf, j'ai désinstaller PB à mon taff (je fini mon stage demain !!! :D )
Je le testerai ce code mardi soir !!!
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bonjour à tous

J'ai pas compris ce qu'était un allias 8O
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message par Gillou »

@Nico
Super sympa, marche impec

@Kwai chang caine
Comme pour les noms de star ex :
Jean-Philippe Smet alias Johnny
On retient toujours mieux un mot simple et court. Et en programmation c'est pareil, au lieu de taper MessageRequester( on pourrait taper son alias par ex : MSG( , plus simple et surtout plus court à écrire. Et là Nico nous propose un programme qui remplace en automatique l'alias 'SGT' par son mot d'origine 'SetGadgetText('. Vivement l'intégration à Purebasic!!!

(Juste pour info, jaPBe intégre déjà cette fonction)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Oui JaPBe l'intègre et je remercie encore Gnozal d'avoir pris en compte ma demande car pour ma part je trouve la complétion complètement inadaptée. La plupart des mots clés Purebasic commence par les mêmes syllabes, résultat il faut avoir quasiment fini le mot pour avoir un choix correct ou alors on se retrouve avec une liste de 20 mots.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Merci pour l'info gillou, je ne connaissais pas du tout :wink:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Kwai chang caine a écrit :Merci pour l'info gillou, je ne connaissais pas du tout :wink:
moi non plus !! 8O
Répondre