Page 1 sur 1

Question EditorGadget

Publié : mer. 29/janv./2014 0:56
par majikeyric
Salut,

Lorsqu'on place une grande quantité de texte dans un editor gadget, y a t-il un moyen pour "se positionner" sur la dernière ligne du texte ?
J'ai pas trouvé de façon de le faire avec les fonctions disponibles ?!!

Merci

Re: Question EditorGadget

Publié : mer. 29/janv./2014 1:16
par Backup
l'editor de text de Purebasic répond aux normes du RTF ;)

fait une recherche sur le RTF .... (il me semble avoir fait un Tuto la dessus... )

ici :
http://www.purebasic.fr/french/viewtopi ... =21&t=6664
Tuto Numero 15 de la section "utilisateur Avertis"

un truc du genre devrai marcher

Code : Tout sélectionner

Procedure Editor_Locate2(Gadget,x,Y)
; ;Par Progi1984
  ; Set cursor position
  REG = GadgetID(Gadget)
  CharIdx = SendMessage_(REG,#EM_LINEINDEX,Y-1,0)
  LLength = SendMessage_(REG,#EM_LINELENGTH,CharIdx,0)
  If LLength >= x-1
    CharIdx + x-1
  EndIf
  Range.CHARRANGE
  Range\cpMin = CharIdx
  Range\cpMax = CharIdx
  SendMessage_(REG,#EM_EXSETSEL,0,Range)
EndProcedure

Re: Question EditorGadget

Publié : mer. 29/janv./2014 2:07
par falsam
majikeyric a écrit :J'ai pas trouvé de façon de le faire avec les fonctions disponibles ?!!
Solution sans API

Code : Tout sélectionner

  Enumeration
    #Mainform
    #Editor
  EndEnumeration
  
  Define.l Event, GEvent
  
  Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
  
  Procedure Open_MainForm()
    OpenWindow(#Mainform, 0, 0, 500, 400, "Test", WindowStyle)
    EditorGadget(#Editor, 10, 10, 480, 380)
  EndProcedure
  
  Procedure Start()
    Open_MainForm()
    
    ;Quelques ligne pour le test
    For n=1 To 1000
      AddGadgetItem(#Editor, -1, "Ligne "+Str(n))
    Next
    
    ;Et on se place sur la derniere ligne
    SetActiveGadget(#Editor)
    
    ;Se rendre à la ligne 31
    ;SetGadgetItemText(#Editor, 30, GetGadgetItemText(#Editor, 30))
    
    ;Se rendre sur la derniere ligne
    SetGadgetItemText(#Editor, CountGadgetItems(#Editor), GetGadgetItemText(#Editor, CountGadgetItems(#Editor)))
  EndProcedure
  
  start()
  
  Repeat
    Event  = WaitWindowEvent(10)
    
    GEvent = EventGadget()
    Select Event
      Case #PB_Event_Gadget
        Select GEvent
        EndSelect
          
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver

Re: Question EditorGadget

Publié : mer. 29/janv./2014 15:01
par majikeyric
Merci pour vos 2 solutions :D

Celle sans API, n'était pas aussi évidente que ça : pour se positionner sur une ligne, en changer le contenu et avoir le focus.

Je ne savais pas que l'editor acceptait le RTF, c'est intéressant !

Re: Question EditorGadget

Publié : mer. 29/janv./2014 15:07
par falsam
majikeyric a écrit :Celle sans API, n'était pas aussi évidente que ça : pour se positionner sur une ligne, en changer le contenu.
Oui :)

Tout comme la ListIconGadget() on peut ajouter ou insérer un item, supprimer un item, les compter etc .... mais bizarrement on ne peut pas se positionner directement sur une ligne sans passer par l'astuce que je mentionne.

Re: Question EditorGadget

Publié : mer. 29/janv./2014 16:07
par Ar-S
il est vrai que coté gestion de texte dans de la liste PB est perfectible. Pour ce genre de projets, j'opterai pour une alliance structure/tableau ou map

Code : Tout sélectionner

structure Mots
NumLigne.i
NumMot.i
Mot.s
endstructure
Ainsi l'editor ne sert que pour l'affichage, le traitement se faisant avec de simple replacestring pour la modification et SetGadgetItemText pour le positionnemnt. le tout utilisant les données du tableau.
Peut-être que c'est un résonnement à la con j'ai pas testé mais ça me parait palier (^^)
On travail qu'avec du pré calculé en somme.