Tab pour un alinéa dans EditorGadget

Programmation d'applications complexes
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Suite à ton Post, je viens de me replonger dans le code car j'avais entrevue depuis d'autres possibilités; j'ai changé la façon de faire et j'ai rajouté la possibilité de paramétrer le Tab.

Code : Tout sélectionner

; By Nico
; le 23/01/05

Structure settextex
  flags.l
  codepage.l
EndStructure

text.settextex
#ST_SELECTION=2
text\flags=#ST_SELECTION
text\codepage=#CP_ACP

Texte.s="{\rtf\tab "

distance=10 ; équvaut à peu près à 10/2 espaces
            ; c'est pour donner un ordre d'idée
            ; car ça se calcule en unit.

If OpenWindow(0,0,0,320,220,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Simulate Tab") And CreateGadgetList(WindowID(0)) 
  EditorGadget (0,10,60,300,140,#PB_Container_Raised) 
  ButtonGadget(1, 10, 10, 300, 20, "Standard Button")  

  SetWindowLong_(GadgetID(0),#GWL_STYLE,GetWindowLong_(GadgetID(0),#GWL_STYLE)-#ws_tabstop)
  SendMessage_(GadgetID(0),#EM_SETTABSTOPS,1,@distance) 
  AddGadgetItem(0, -1, "Texte$") 

  Repeat 
    EventID = WaitWindowEvent() 
    Select EventID 
      Case  #PB_EventGadget 
        Select EventGadgetID() 
          Case 0 

        EndSelect 
        
      Case #WM_KEYDOWN
        If EventwParam()=9
          ; Simulation du Tab avec du tag Rich Edit
          SendMessage_(GadgetID(0), #EM_SETTEXTEX, text.settextex, @Texte)
        EndIf 
        
      Case #WM_CLOSE 
        Quit=1 

    EndSelect 
  Until Quit=1 
EndIf 
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Salut,

Cool le code Nico.
Je cherchais ça et je suis tombé sur le sujet suite au nouveau poste et au dernier code que tu as mis aujourd'hui :-).
Mais j'ai un pb.
Si je fais Maj+Tab pour aller sur le bouton, il ne m'est plus possible ni avec Tab ni Maj+Tab de revenire sur l'EditorGadget.
Est-ce normal ?
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

Désolé de ma longue absence :(


Merci Nico, c'est super :D



Une petite question bonus: y'a t'il un moyen -facilement- (sinon je m'en passerait) de faire tab sur un bloc de lignes ?

Par exemple je selectionne deux lignes, j'appuie sur TAB, et les deux lignes sont décalées au lieu de se remplacer par un tab ?

merci
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Tab pour un alinéa dans EditorGadget

Message par blendman »

salut

Je cherche à paramètrer la tabulation (dans un editorgadget).
J'ai testé le code plus haut, notamment :

Code : Tout sélectionner

Procedure SetTab(gad,tabulation=10)
  SetWindowLong_(GadgetID(gad),#GWL_STYLE,GetWindowLong_(GadgetID(gad),#GWL_STYLE)-#WS_TABSTOP)
  SendMessage_(GadgetID(gad),#EM_SETTABSTOPS,1,@tabulation) 
EndProcedure
Cependant, ça ne marche pas toujours et ensuite, lorsque j'utilise plusieurs fois la procédure (en cours de programme, par exemple, pour changer la longueur des tabulations), le programme se fige.
j'imagine que cela ne s"utilise par comme ça ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Tab pour un alinéa dans EditorGadget

Message par nico »

Essaye ça:

Code : Tout sélectionner

Procedure SetTab(gad,tabulation=10)
  SetWindowLong_(GadgetID(gad),#GWL_STYLE,GetWindowLong_(GadgetID(gad),#GWL_STYLE)-#WS_TABSTOP)
  SendMessage_(GadgetID(gad),#EM_SETTABSTOPS,1,@tabulation) 
  InvalidateRect_(GadgetID(gad),0, 1)
EndProcedure
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Tab pour un alinéa dans EditorGadget

Message par blendman »

salut

J'ai testé, mais ça ne donne rien, si ce n'est que cela crée une sorte de rectangle autour de l'éditorgadget, mais hélas ça ne change pas la taille des tabulations.

Je peux donner le code complet, mais c'est assez long (j'ai repris pas mal de code trouvés sur le forum anglais, à propos du format RTF)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Tab pour un alinéa dans EditorGadget

Message par Backup »

....
Dernière modification par Backup le mar. 19/août/2014 10:09, modifié 1 fois.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Tab pour un alinéa dans EditorGadget

Message par blendman »

Dobro a écrit :pourquoi ne pas utiliser Scintilla ?
Merci pour ton exemple, c'est intéressant.
En fait, je réalise pour mes besoins personnels un petit éditeur de texte type RTF, avec quelques fonctions comme alignement de la ligne, édition, police d'écriture (bold, couleur..), ce genre de chose ^^, paragraphe, liste à puce, load/save RTF...

je ne sais pas si Scintilla est prévu spécifiquement pour ça.

Je viens de regarder et tester quelques exemples, c'est plutôt sympa c'est clair, à voir si on peut l'utiliser facilement pour du texte type Richedit.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Tab pour un alinéa dans EditorGadget

Message par Backup »

...
Dernière modification par Backup le mar. 19/août/2014 10:09, modifié 1 fois.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Tab pour un alinéa dans EditorGadget

Message par Mesa »

Je crois que vous confondez tabulation avec taquet de tabulation.
Ça se passe en 2 temps:
Il faut d'abord poser des taquets de tabulations à une distance voulu puis quand on ajoute une tabulation avec la touche Tab, on ajoute un "caractère" qui prendra toute la place jusqu'au prochain taquet.

Le code suivant devrait marcher aussi avec le richedit que l'on trouve dans le forum anglais car richedt est un descendant de "editorgadget".

Code : Tout sélectionner



text.settextex

#ST_SELECTION=2
text\flags=#ST_SELECTION
text\codepage=#CP_ACP

Texte.s="{\rtf\tab "


; Macro LOWORD(Value)
;   Value & $FFFF
; EndMacro
; 
; Macro HIWORD(Value)
;   (Value >> 16) & $FFFF
; EndMacro 
; 
; Macro MAKELONG(a,b) 
;   ((a&$ffff)+b<<16)
; EndMacro
Procedure LOWORD(Value)
  ProcedureReturn Value & $FFFF
EndProcedure

Procedure HIWORD(Value)
  ProcedureReturn (Value >> 16) & $FFFF
EndProcedure

Procedure MAKELONG(low, high)
  ProcedureReturn low | (high<<16)
EndProcedure 

Procedure.f initTaquetTab()
  Value=GetDialogBaseUnits_()
  ;Debug Value 
  baseunitX=LOWORD(Value)
  baseunitY=HIWORD(Value)
  ;   Debug LOWORD(Value);horizontal dialog box base unit
  ;   Debug HIWORD(Value);vertical dialog box base unit
  ;The horizontal base unit returned by GetDialogBaseUnits is equal to the average 
  ;width, in pixels, of the characters in the system font; 
  ;the vertical base unit is equal To the height, in pixels, of the font.
  
  hdc = GetDC_(GetDesktopWindow_()) 
  If hdc 
    Ecrdpihz.l  = GetDeviceCaps_(hdc, #LOGPIXELSX) 
  EndIf 
  ;   If hdc 
  ;     Ecrdpivt.l = GetDeviceCaps_(hdc, #LOGPIXELSY) 
  ;   EndIf 
  ReleaseDC_(GetDesktopWindow_(), hdc) 	
  
  ; 1 horizontal Dialog Template Unit = (DPI écran / 96 * baseunitX)/4
  ; 1 vertical Dialog Template Unit = (DPI écran / 96 * baseunitY)/8
  pixelX.f = (Ecrdpihz/96)*baseunitX/4
  ; pixelY.f = (Ecrdpihz/96)*baseunitX/8
  ; 	Debug pixelX
  ; 	Debug pixelY
  ProcedureReturn pixelX
EndProcedure

facteur.f=initTaquetTab() ; transforme un nombre de caractère en dialog template units
;Debug facteur

; Si ModeTabulation = 0 alors taquets de tabulation tous les 32 dialog template units
; Si ModeTabulation = 1 alors taquets de tabulation tous les "taquet1" dialog template units
; Si ModeTabulation > 1 alors x taquets de tabulation chacun à la distance "taquets(x)"

;ModeTabulation = 0
ModeTabulation = 1
;ModeTabulation = 5  ; 5 taquets de tabulation

taquet1=5*facteur   ; 1 taquet de tabulation à 5 caractères
Dim taquets(5)  ; 5 taquets de tabulation en nombre de caractères
taquets(0) = 5*facteur
taquets(1) = 10*facteur
taquets(2) = 15*facteur
taquets(3) = 20*facteur
taquets(4) = 25*facteur
;Debug taquets(0)


If OpenWindow(0,0,0,320,220,"Simulate Tab",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
  EditorGadget (0,10,60,300,140) 
  CreateImage(0,300,20)
  StartDrawing(ImageOutput(0))
  Box(0,0,300,20,#White)
  Line(0,10,300,1,0)
  For i=0 To 30
    Line(10*i,0,1,20,0)
  Next i
  
  StopDrawing() 
  ImageGadget(1, 10, 40, 300, 20,ImageID(0)) 
  
  SetWindowLong_(GadgetID(0),#GWL_STYLE,GetWindowLong_(GadgetID(0),#GWL_STYLE)-#WS_TABSTOP)
  SendMessage_(GadgetID(0),#EM_SETTABSTOPS,ModeTabulation,@taquet1) 
  ;SendMessage_(GadgetID(0),#EM_SETTABSTOPS,ModeTabulation,@taquets()) 
  ; 	ModeTabulation
  ; 	The number of tab stops contained in the Array. If this parameter is zero, 
  ;   @taquet1 parameter is ignored And Default tab stops are set at every 32 dialog 
  ; 	template units. If this parameter is 1, tab stops are set at every n dialog 
  ; 	template units, where n is the distance pointed To by the @taquet1 parameter. 
  ; 	If this parameter is greater than 1, @taquets() is a pointer To an Array of tab stops.
  ; 	  
  ; 	@taquet1 ou @taquets()
  ; 	A pointer To an Array of unsigned integers specifying the tab stops, in dialog 
  ; 	template units. If the ModeTabulation parameter is 1, this parameter is a pointer To an 
  ; 	unsigned integer containing the distance between all tab stops, in dialog template 
  ; 	units. 
  
  AddGadgetItem(0, -1, "Texte$") 
  
  
  Repeat 
    EventID = WaitWindowEvent() 
    Select EventID 
      Case  #PB_Event_Gadget 
        Select EventGadget 
          Case 0 
            
        EndSelect 
        
      Case #WM_KEYDOWN
        If EventwParam()=9
          ; Simulation du Tab avec du tag Rich Edit
          SendMessage_(GadgetID(0), #EM_SETTEXTEX, text.settextex, @Texte)
        EndIf 
        
      Case #WM_CLOSE 
        Quit=1 
        
    EndSelect 
  Until Quit=1 
EndIf 
La petite grille noire = 1 trait tous les 10 pixels

On peut simplifier le code en se passant de Procedure.f initTaquetTab() et de facteur.f et en definissant taquet1 ou taquets() au pif et voir ce que ça donne.

Si vous attrapez un mal de tête en lisant ce code, c'est normal, c'est l'effet que ça m'a fait en l'écrivant. :D

Mesa.
Dernière modification par Mesa le mer. 06/févr./2013 19:29, modifié 1 fois.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Tab pour un alinéa dans EditorGadget

Message par blendman »

Dobro : merci, j'ai téléchargé le goscintilla pour voir ce que ça peut donner.
On pourrait donc s'en servir pour créer un éditeur de texte (type wordpad ou openoffice (en plus simple) avec si j'ai bien compris.
Je vais ausculter tout ça ^^
Mesa a écrit :Je crois que vous confondez tabulation avec taquet de tabulation.
Ça se passe en 2 temps:
Il faut d'abord poser des taquets de tabulations à une distance voulu puis quand on ajoute une tabulation avec la touche Tab, on ajoute un "caractère" qui prendra toute la place jusqu'au prochain taquet.
salut

Merci pour ton code, je l'ai testé, mais il ne répond pas au problème ^^, même en le modifiant (ou alors, je n'ai pas réussi).
L'idée c'est de pouvoir changer le nombre de caractère (ou la taille de la tabulation) comme on le souhaite.
Hors, là, je ne vois pas du tout comment faire avec ce code.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Tab pour un alinéa dans EditorGadget

Message par Mesa »

Tu parles de tabulation ou de la marge de gauche de l'editorgadget ?
(Ce n'est pas du tout la même chose, et c'est plus simple avec une marge)

Mesa.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Tab pour un alinéa dans EditorGadget

Message par Backup »

blendman a écrit :Dobro : merci, j'ai téléchargé le goscintilla pour voir ce que ça peut donner.
On pourrait donc s'en servir pour créer un éditeur de texte (type wordpad ou openoffice (en plus simple) avec si j'ai bien compris.
Je vais ausculter tout ça ^^

ben mon Editeur EPB est basé dessus :D
bien sur j'ai du apporter quelques Ajouts .. mais l'essentiel de EPB est fait avec GoScintilla ... ;)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Tab pour un alinéa dans EditorGadget

Message par blendman »

Mesa a écrit :Tu parles de tabulation ou de la marge de gauche de l'editorgadget ?
(Ce n'est pas du tout la même chose, et c'est plus simple avec une marge)
je parle bien de tabulation. Les marges, j'ai réussi à le faire c'est effectivement assez simple.

En fait, dans Openoffice, on peut régler la taille d'une tabulation. Et dès qu'on appuie sur tab, cela crée une tabulation de la taille désiré. Je voudrai pouvoir faire la même chose ^^.
Mesa a écrit :ben mon Editeur EPB est basé dessus
yep, j'ai vu ça ;). D'ailleurs, je pense que c'est pareil pour l'éditeur de purebasic ou japbe.
Mais un éditeur de code source et un éditeur de texte ne proposent pas tout à fait les mêmes choses, donc, il faut que je regarde si on peut faire tout ce que j'aimerai ajouter à mon éditeur de texte ^^.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Tab pour un alinéa dans EditorGadget

Message par Mesa »

En fait, dans Openoffice, on peut régler la taille d'une tabulation. Et dès qu'on appuie sur tab, cela crée une tabulation de la taille désiré. Je voudrai pouvoir faire la même chose ^^.
Il y a quelque chose qui m'échappe car mon code fait exactement cela.

Lance mon code, pose le point d'insertion en position 0, devant le 'T' de 'Texte$', appuie sur Tab et 'Texte$' se déplace à droite sur le taquet.

Si tu veux utiliser les taquets par défaut, utilise "ModeTabulation = 0" et "SendMessage_(GadgetID(0),#EM_SETTABSTOPS,ModeTabulation,0)".

Si tu veux utiliser un taquet de x caractères, utilise "ModeTabulation = 1" et "taquet1=x*facteur" et "SendMessage_(GadgetID(0),#EM_SETTABSTOPS,ModeTabulation,@taquet1)"

Si tu veux x taquets de longueurs différentes, utilise "ModeTabulation = 2" et créer un tableau de taquets "Dim taquets(x)" et remplir le tableau avec les longueurs de chaque taquets et "SendMessage_(GadgetID(0),#EM_SETTABSTOPS,ModeTabulation,@taquets())"

Ensuite, la touche Tab se positionne sur chaque taquets que ce soit les taquets par défaut, un taquet perso ou plusieurs taquets perso.

Si tu dois changer de taquets en cours d'utilisation, je te conseillerais d'utiliser un tableau de taquets et ModeTabulation = 2 et de gérer le tableau.

Par contre, est-ce que editorgadget est capable de gérer un jeu de taquets différents pour chaque paragraphes... ?

Mesa.
Répondre