créer des alias dans un éditeur
Publié : dim. 04/févr./2007 11:26
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