Page 2 sur 3

Publié : dim. 23/janv./2005 21:53
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 

Publié : dim. 23/janv./2005 23:00
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 ?

Publié : mer. 09/févr./2005 22:49
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

Re: Tab pour un alinéa dans EditorGadget

Publié : mar. 05/févr./2013 15:11
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 ?

Re: Tab pour un alinéa dans EditorGadget

Publié : mar. 05/févr./2013 16:03
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

Re: Tab pour un alinéa dans EditorGadget

Publié : mer. 06/févr./2013 11:17
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)

Re: Tab pour un alinéa dans EditorGadget

Publié : mer. 06/févr./2013 13:34
par Backup
....

Re: Tab pour un alinéa dans EditorGadget

Publié : mer. 06/févr./2013 14:27
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.

Re: Tab pour un alinéa dans EditorGadget

Publié : mer. 06/févr./2013 15:19
par Backup
...

Re: Tab pour un alinéa dans EditorGadget

Publié : mer. 06/févr./2013 18:13
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.

Re: Tab pour un alinéa dans EditorGadget

Publié : mer. 06/févr./2013 18:53
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.

Re: Tab pour un alinéa dans EditorGadget

Publié : mer. 06/févr./2013 19:37
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.

Re: Tab pour un alinéa dans EditorGadget

Publié : mer. 06/févr./2013 20:11
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 ... ;)

Re: Tab pour un alinéa dans EditorGadget

Publié : jeu. 07/févr./2013 8:41
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 ^^.

Re: Tab pour un alinéa dans EditorGadget

Publié : jeu. 07/févr./2013 11:52
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.