Page 1 sur 1
Plier du texte dans un editor gadget.
Publié : mar. 13/sept./2011 10:05
par hackotedelaplaque
Bonjour,
Cela fait une eternité que je n´ai plus posté ici mais je n´ai pas cessé de coder sur pb depuis.
Actuellement je développe un éditeur de texte. On passe au logiciel un fichier binaire et depuis une table de caractère l´editor gadget affiche du texte intelligible.
Je souhaite ajouter un système de pliage et depliage du texte par double clic. Par exemple si on double clic sur le mot "pause" l´expression se deplie en "pause de 10 secondes”.
Y´a t il un moyen de faire ça avec l´API windows?
Je précise que je ne souhaite pas basculer sur scintilla car j´exploite la fonction de mise en forme rtf de l´éditeur classique.
Merci de votre aide car là je sèche.
Re: Plier du texte dans un editor gadget.
Publié : mar. 13/sept./2011 10:23
par falsam
Bonjour,
dans ton exemple de Pause, pause de 10 secondes est une valeur fixe stockée dans une table ou une liste ou autres ?
Re: Plier du texte dans un editor gadget.
Publié : mar. 13/sept./2011 12:21
par hackotedelaplaque
Pour préciser, ”pause” est un code de controle de texte qui équivaut au word hexa 14BE et qui prend un argument le word suivant).
Depuis une table le programme lit BE14 et affiche dans l´editeur <pause>. Je voudrai qu´en double cliquant dessus il développe en <pause de XXXXh secondes>.
Les textes longs et courts sont stockés dans une liste chaînée de tyoe code à 2 champs de texte.
Re: Plier du texte dans un editor gadget.
Publié : mar. 13/sept./2011 21:40
par falsam
Le double-click n'étant pas détecter dans les évènements avec l'editorgadget, j'utilise un boutongadget pour illustrer ta demande.
Comment ce code fonctionne ?
Tu doubles-click gauche sur le mot que tu souhaites déplier.
Le programme se charge de copier en mémoire ce que tu as sélectionner puis compare cette sélection avec un référentiel. Si trouver, ce résultat est copié en mémoire puis collé à la place de la sélection.
Code : Tout sélectionner
Enumeration
#mainform
#editor
#Go
EndEnumeration
;Structure pour le referenciel de mots
Structure sWords
key.s
Dependence.s
EndStructure
;Buffer de comparaison avec le référenciel
Buffer.s
;//Quelques mots clé
Dim words.sWords(10)
words(0)\key="B10"
words(0)\Dependence="Pause de 10 secondes"
words(1)\key="B11"
words(1)\Dependence="Je prends un café"
words(2)\key="B12"
words(2)\Dependence="Touché coulé"
;Fenetre principale
OpenWindow(#mainform, 0, 0, 500, 500, "Pliage/dépliage", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ButtonGadget(#Go, 5, 10, 24, 24, "Go")
EditorGadget(#editor, 5, 40, 490, 420)
;Evitons les mauvais effets de la touche tabulation
RemoveKeyboardShortcut(0, #PB_Shortcut_Tab)
SetActiveGadget(#Editor)
Repeat
Event=WaitWindowEvent()
Select Event
Case #PB_Event_Menu
Case #PB_Event_Gadget
Select EventGadget()
Case #editor
Case #Go
;Copy de la selection
SendMessage_(GadgetID(#Editor), #WM_COPY,0,0)
;Que l'on stocke dans un buffer
;aprés transformation en majuscule
Buffer=UCase(GetClipboardText())
;Qui est Rapproché avec le referentiel
For i =0 To 2
If words(i)\key = Trim(Buffer)
SetClipboardText(words(i)\Dependence)
SendMessage_(GadgetID(#editor), #WM_PASTE, 0, 0)
EndIf
If UCase(words(i)\Dependence) = Trim(Buffer)
SetClipboardText(words(i)\key)
SendMessage_(GadgetID(#editor), #WM_PASTE, 0, 0)
EndIf
Next
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Re: Plier du texte dans un editor gadget.
Publié : mer. 14/sept./2011 17:53
par hackotedelaplaque
C'est pas mal du tout comme solution ce que tu proposes. Si je remplace le bouton par un menu contextuel via le click droit ça peut même être suffisamment ergonomique.
Je te remercie.
Re: Plier du texte dans un editor gadget.
Publié : mer. 14/sept./2011 21:13
par falsam
Tu peux aussi mettre en place une touche de raccourci lié à la fenêtre.
Le code dans ce cas :
Code : Tout sélectionner
Enumeration
#mainform
#editor
#Go
#Kbd_F4
EndEnumeration
;Structure pour le referenciel de mots
Structure sWords
key.s
Dependence.s
EndStructure
Global Dim words.sWords(10)
;Buffer de comparaison avec le référenciel
Global Buffer.s
Procedure OpenCloseBbracket()
;Copy de la selection
SendMessage_(GadgetID(#Editor), #WM_COPY,0,0)
;Que l'on stocke dans un buffer
;aprés transformation en majuscule
Buffer=UCase(GetClipboardText())
;Qui est Rapproché avec le referentiel
For i =0 To 2
If words(i)\key = Trim(Buffer)
SetClipboardText(words(i)\Dependence)
SendMessage_(GadgetID(#editor), #WM_PASTE, 0, 0)
EndIf
If UCase(words(i)\Dependence) = Trim(Buffer)
SetClipboardText(words(i)\key)
SendMessage_(GadgetID(#editor), #WM_PASTE, 0, 0)
EndIf
Next
EndProcedure
;//Quelques mots clé
words(0)\key="B10"
words(0)\Dependence="Pause de 10 secondes"
words(1)\key="B11"
words(1)\Dependence="Je prends un café"
words(2)\key="B12"
words(2)\Dependence="Touché coulé"
;Fenetre principale
OpenWindow(#mainform, 0, 0, 500, 500, "Pliage/dépliage", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ButtonGadget(#Go, 5, 10, 24, 24, "Go")
EditorGadget(#editor, 5, 40, 490, 420)
;Evitons les mauvais effets de la touche tabulation
RemoveKeyboardShortcut(0, #PB_Shortcut_Tab)
;Touche F5 à la place du bouton
AddKeyboardShortcut(#mainform, #PB_Shortcut_F4, #Kbd_F4)
SetActiveGadget(#Editor)
Repeat
Event=WaitWindowEvent()
Select Event
Case #PB_Event_Menu
If EventMenu()=#Kbd_F4
OpenCloseBbracket()
EndIf
Case #PB_Event_Gadget
Select EventGadget()
Case #editor
Case #Go
OpenCloseBbracket()
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
ForEver