[resolu] position du curseur dans un éditorgadget ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

[resolu] position du curseur dans un éditorgadget ?

Message par Ar-S »

Pour un petit projet en cours, j'aimerai réussir à trouver comment récupérer la position du curseur dans un editorgadget.
Cette position serait l'endroit ou l'on clique dans le texte qui se trouve dans ce même editor.

Code : Tout sélectionner

;-PB 4.30
Enumeration
    #Window_0
    #editor
    #Button_1
EndEnumeration
;}
Global NouveauTexte$, texte$,NbrDeCar

Procedure OpenWindow_Window_0()
    If OpenWindow(#Window_0, 450, 200, 523, 193, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
        EditorGadget(#editor, 10, 10, 500, 135)
        SetGadgetText(#editor,"Mon editor plein de texte"+Chr(10)+Chr(10)+"des trucs, tout ça blabla"+Chr(10)+Chr(10)+"alors j'aimerai bien pouvoir placer mon curseur par exemple ici et qu'en"+Chr(10)+"cliquant sur le bouton, ça insère le mot cassoulet")
        ButtonGadget(#Button_1, 8, 150, 505, 35, "clique ici pour insérer le mot cassoulet")
    EndIf
EndProcedure

Procedure InserMot(gadget,mot$)
    Texte.s=GetGadgetText(gadget)
    NbrDeCar=Len(texte$)
;    (... code à ajouter dont je n'ai aucune idée)
;    text_Avant_Inser$=  ???? ; ce qu'il y a après le curseur
;    text_Apres_Inser$= ??? ; ce qu'il y a avant le curseur
    NouveauTexte$=text_Avant_Inser$+mot$+text_Apres_Inser$
    SetGadgetText(gadget,NouveauTexte$)
EndProcedure

OpenWindow_Window_0()

;{- Event loop
Repeat
    Select WaitWindowEvent()
            ; ///////////////////
        Case #PB_Event_Gadget
            Select EventGadget()
                Case #editor
                Case #Button_1
                    MotAInserer.s="cassoulet"
                    InserMot(#editor,MotAInserer)
                    
            EndSelect
            ; ////////////////////////
        Case #PB_Event_CloseWindow
            Select EventWindow()
                Case #Window_0
                    CloseWindow(#Window_0)
                    Break
            EndSelect
    EndSelect
ForEver
;
;}
C'est donc la procedure InserMot(gadget,mot$) qui me pose problème.
Je n'ai pas trouver autre chose qu'un positionnement de pixel or je préfèrerai un position par rapport au curseur dans l'editor mais je pense que vous m'avez compris.
Dernière modification par Ar-S le dim. 20/déc./2009 20:06, modifié 1 fois.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: position du curseur dans un éditorgadget ?

Message par Ar-S »

J'ai bien essayé une proce du fofo anglais mais elle me revoie 1 à chaque fois :

Code : Tout sélectionner

;-PB 4.30
Enumeration
    #Window_0
    #editor
    #Button_1
EndEnumeration

Global NouveauTexte$, texte$,NbrDeCar

;Procedure InserMot(gadget,mot$)
;    Texte.s=GetGadgetText(gadget)
;    NbrDeCar=Len(texte$)
    ;    (... code à ajouter dont je n'ai aucune idée)
    ;    text_Avant_Inser.s=  ???? ; ce qu'il y a après le curseur
    ;    text_Apres_Inser.s= ??? ; ce qu'il y a avant le curseur
;    NouveauTexte$=text_Avant_Inser$+mot$+text_Apres_Inser$
;    SetGadgetText(gadget,NouveauTexte$)
;EndProcedure


    hwnd= OpenWindow(#Window_0, 450, 200, 523, 193, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    hED=EditorGadget(#editor, 10, 10, 500, 135)
    SetGadgetText(#editor,"Mon editor plein de texte"+Chr(10)+Chr(10)+"des trucs, tout ça blabla"+Chr(10)+Chr(10)+"alors j'aimerai bien pouvoir placer mon curseur par exemple ici et qu'en"+Chr(10)+"cliquant sur le bouton, ça insère le mot cassoulet")
    ButtonGadget(#Button_1, 8, 150, 505, 35, "clique ici pour insérer le mot cassoulet")


Repeat
    e=WaitWindowEvent()
    If e=#PB_Event_Gadget And EventGadget()=#Button_1
        GetCaretPos_(@p.POINT)   ;Get current cursor position in the client area
        Debug GetCaretPos_(@p.POINT)   ;Get current cursor position in the client area
        chrIdx=SendMessage_(hED, #EM_EXGETSEL, #Null, @Selection.CHARRANGE)
        Debug "line: "+ Str(SendMessage_(hED, #EM_LINEFROMCHAR, chrIdx, 0) + 1)
        SetFocus_(hED)
    EndIf
    
Until e=#PB_Event_CloseWindow
;
;}
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: position du curseur dans un éditorgadget ?

Message par Jacobus »

Si tu n'as rien contre les API...

Code : Tout sélectionner

Procedure Editor_InsertText(gadget,Text$) 
  ProcedureReturn SendMessage_(GadgetID(gadget),#EM_REPLACESEL,0,Text$) 
EndProcedure
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: position du curseur dans un éditorgadget ?

Message par nico »

Code : Tout sélectionner

Procedure InserMot(gadget,mot$)
  SetClipboardText(mot$)
  SendMessage_(GadgetID(gadget),#WM_PASTE,0,0)
EndProcedure
Edit:Griller
Le code de Jacobus est mieux!
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: position du curseur dans un éditorgadget ?

Message par Ar-S »

Ohlala je teste ça tout de suite..
Moi j'aime les API, et vu mes franches prises de tête pour mettre PB sous linux, je les aime encore plus ! :mrgreen:
merci beaucoup !

---après test----

Je vous aime ! :D
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: [resolu] position du curseur dans un éditorgadget ?

Message par Jacobus »

Quand je serais bien luné, un de ces quatre, je donnerai le code complet de mon éditeur perso, fait avec des bouts de codes piochés ça et là (dont l'excellent travail de nico sur les images), plus des trucs à moi. Je caresse toujours l'espoir que Fred nous fasse un véritable éditeur de texte. On ne sait jamais...
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [resolu] position du curseur dans un éditorgadget ?

Message par Ar-S »

C'est vrai qu'un éditeur plus poussé serait vraiment un gros plus.
Je suis en train de me faire un petit editeur wysiwyg, enfin je dis petit mais c'est un boulot assez long.
Mais vu que c'est pour moi je vais y aller tranquillement. D'abord l'editor pour le code html, ensuite j'en ferai un pour le css (j'utilise des onglets) avec prévisualisateur au dessous.
ça reste un truc très basic ou je pourrai insérer dans la source les balises via des boutons ainsi que les media image, flash sans avoir à taper le code.
Idem pour les caractères accentués..
je sais bien qu'il y a de bon soft comme comodo mais ça me fait un peu bosser en PB et découvrir de nouveaux trucs (comme cet Api très commode).
Encore merci :wink:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Re: [resolu] position du curseur dans un éditorgadget ?

Message par GeBonet »

Salut,

Dans ce que j'ai pu pêcher à gauche ou a droite voilà ce qui devrait te convenir...
Avec petit éditeur...
Je pense... :roll:

Code : Tout sélectionner

;la Position du curseur :
; Author: Danilo
; Date: 08. August 2003
Procedure EditorGadgetCursorX (Gadget)
      ; returns X-Pos of Cursor
      REG = GadgetID (Gadget)
      SendMessage_ (REG, #EM_EXGETSEL ,0,Range.CHARRANGE)
      ProcedureReturn (Range\cpMax-( SendMessage_ (REG, #EM_LINEINDEX , SendMessage_ (REG, #EM_EXLINEFROMCHAR ,0,Range\cpMin),0))+1)
EndProcedure

Procedure EditorGadgetCursorY (Gadget)
      ; returns Y-Pos of Cursor
      REG = GadgetID (Gadget)
      SendMessage_ (REG, #EM_EXGETSEL ,0,Range.CHARRANGE)
      ProcedureReturn SendMessage_ (REG, #EM_EXLINEFROMCHAR ,0,Range\cpMin)+1
EndProcedure

Procedure EditorGadgetCursorPos (Gadget)
      ; returns relative Position of Cursor
      SendMessage_ ( GadgetID (Gadget), #EM_EXGETSEL ,0,Range.CHARRANGE)
      ProcedureReturn Range\cpMax
EndProcedure

Procedure EditorGadgetLocate (Gadget,x,y)
      ; 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

OpenWindow (1,200,200,300,200, "EditorGadget" , #PB_Window_SystemMenu )

EditorGadget (1,5,5,290,190)
 
AddGadgetItem (1,-1, "Hallo!" )
AddGadgetItem (1,-1, "" )
AddGadgetItem (1,-1, "Hier ein paar Proceduren" )
AddGadgetItem (1,-1, "zur Steuerung des Cursors" )
AddGadgetItem (1,-1, "im EditorGadget." )
EditorGadgetLocate (1,7,2)
Repeat
      Select WaitWindowEvent ()
            Case #PB_Event_CloseWindow : End
      EndSelect
      SetWindowText_ ( WindowID (1), "X: " + Str ( EditorGadgetCursorX (1))+ " Y: " + Str ( EditorGadgetCursorY (1))+ " -- Position: " + Str ( EditorGadgetCursorPos (1)))
ForEver 
Windows 7 et Windows 8.1 Pb 5.0 jusque 5.24 Lts 64 et 5.3 (64)/b]
“Ceux qui rêvent éveillés ont conscience de mille choses qui échappent à ceux qui ne rêvent qu’endormis.”
-Edgar Allan Poe-
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [resolu] position du curseur dans un éditorgadget ?

Message par Ar-S »

L'api SendMessage_ est vraiment ce que je cherchais,
le code que tu fournis ajoute d'autres commandes à SendMessage_ ce qui est bon à prendre.
Merci GeBonnet, :P
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Re: [resolu] position du curseur dans un éditorgadget ?

Message par GeBonet »

@Ar-s
Ben voilà si tu apprécie, va faire un tour sur ce site... Et pour les autres aussi ?

Télécharger la partie : PureBasic plain code for PW5E examples (001 - 083)
http://programmingforfun.net/pw5e/pw5e.htm

Et aussi le "Yate", qui est un éditeur pas mal avancé...
http://programmingforfun.net/yate/yate.htm#release_list
Tant les exemples que Yate sont construits en faisant appel massivement à des API.
Avec Yate, il y a les différentes étapes de l'évolution jusque septembre 2009...

Le tout reposent essentiellement sur les exemples du livre de Charles Petzold "Programmez sous Windows" 5ème Edition (la dernière de 2001) qui à été un "Best Seller" mondial. Exemples qui Sont transposé en PureBasic.
Pour les amateurs... J'avais déjà passé ces adresses il y a quelques mois sans trop d'intérêt apparent ???
Découvert sur "Developpez.com". Et pourtant :roll:

Depuis, j'ai eu le Bouquins de Petzold entre les mains, et il m'a permis de récupérer quelques années de retard que j'avais pris sur les dessous de Windows.
Malheureusement, il était d'une bibliothèque. :cry: :cry:
En espérant agréer plus de monde cette fois !
Windows 7 et Windows 8.1 Pb 5.0 jusque 5.24 Lts 64 et 5.3 (64)/b]
“Ceux qui rêvent éveillés ont conscience de mille choses qui échappent à ceux qui ne rêvent qu’endormis.”
-Edgar Allan Poe-
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [resolu] position du curseur dans un éditorgadget ?

Message par Ar-S »

En tout cas cette fois tu auras au moins un lecteur de ces liens :)

Après avoir parcourus pas mal d'exemple, je suis confronté aux réticences des version de PB, j'ai des erreurs sur tous les codes que ce soit avec 4.30 ou 4.40
J'essayerai donc à taton de reprendre les API utilisées pour les tester indépendamment.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Re: [resolu] position du curseur dans un éditorgadget ?

Message par GeBonet »

Bonjour,

Effectivement... Pour les source de "yate", il y a certains problèmes... Aussi je n'ai fait que regarder et tester les ".exe" avec !
Mais pour les exemples "Petzold" je pars souvent sur "bezier.pb, Sinewae et digclock.pb, linedemo.pb" Et quelques autres comme je le fait avec les "Nehe-tutoriels", "sample_n3xtd" justement pour tester les versions de PB quand elles sortent ! (Entendre et rétrécir les fenêtres... super). Ce que je viens de refaire sans problème pour ceux là en tout cas ! Aussi, l'IDE, je le lance par "PureBasic.exe /LOCAL" puisque j'ai toujours installé, PB 4.20-PB 4.31 et le dernier PB 4.40...
Mais j'utilise aussi JaPBe qui semble me poser moins de problème que l'IDE natif en premier lieu...
Puis il y a le fait des modifications dans PB lui même... Détails aussi souvent je place ce morceau de code :

Code : Tout sélectionner

Global Rep$                                        ;  Localisation de l'application
Rep$=GetPathPart(ProgramFilename())  ; ATTENTION : Pour JaPBe, Ici il faut que l'option "exe" dans le répertoire source soit coché
SetCurrentDirectory(Rep$)					   ;                        **********************************************************************************           
Debug Rep$
Au début des codes qui font références à un Include ailleurs que leurs propre répertoire pour forcer le départ du répertoire ou est situé le code qui va s'exécuter... (en cochant l'option "creer l'executable temporaire dans le répertoire source"... ), mais ce n'est pas toujours concluant... Mais bon, pour moi le principal n'est pas là, mais bien connaitre une autre forme des appels et la construction... Ouvrir une autre voie !

Ben voilà, bon amusement... :lol:
EN tout cas moi, j'ai trouvé très intéressant et suis loin d'avoir assimilé :cry:
Windows 7 et Windows 8.1 Pb 5.0 jusque 5.24 Lts 64 et 5.3 (64)/b]
“Ceux qui rêvent éveillés ont conscience de mille choses qui échappent à ceux qui ne rêvent qu’endormis.”
-Edgar Allan Poe-
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Re: [resolu] position du curseur dans un éditorgadget ?

Message par GeBonet »

Pour clôturer ce sujet, Il faut explorer tout le site pour y charger "Trimmer" par exemple, qui ne compile pas les parties non utilisés au moment de la compilation. Est aussi livré avec ses sources. Du moins pour ce qui est de "Yate" ! Lire les Readme.txt ou Yate.txt un exemple :
Use pbwingui.bat to compile the Yate source code. Pbwingui.bat assumes the presence of
the Trimmer1.1/Trimmer1.2 app, available at http://programmingforfun.net.
To compile with Trimmer you will probably have to modify the Trimmer1.1.exe path
in pbwingui.bat
.
To compile without Trimmer you will have to modify the batch file considerably. Really, it's easier to just get Trimmer.
A successful compilation results in an ANSI and a Unicode executable. The ANSI build has an 'A' appended to the file name.
All releases of Yate are copyrighted freeware. Feel free to borrow code at will, but I do ask that you give credit if you snag anything substantial.
--maker
maker@programmingforfun.net
Windows 7 et Windows 8.1 Pb 5.0 jusque 5.24 Lts 64 et 5.3 (64)/b]
“Ceux qui rêvent éveillés ont conscience de mille choses qui échappent à ceux qui ne rêvent qu’endormis.”
-Edgar Allan Poe-
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [resolu] position du curseur dans un éditorgadget ?

Message par Ar-S »

En fait j'ai surtout des soucis avec les Macros API des codes

ex :

Code : Tout sélectionner

Macro HIWORD(n) :  (n >> 16) : EndMacro
Macro LOWORD(n) : (n & $FFFF) : EndMacro ; etc...
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Re: [resolu] position du curseur dans un éditorgadget ?

Message par GeBonet »

Macro du module Petzold.pbi ?

Code : Tout sélectionner

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; API MACROS; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Macro HIWORD(n) :  (n >> 16) : EndMacro
Macro LOWORD(n) : (n & $FFFF) : EndMacro
Si c'est le cas, moi je n'ai aucuns problèmes... ???
Mais j'ai déjà eu ce genre de problème avec l'un ou l'autre code qui activais justement des macros du même genre que celles-ci...
Et je n'ai jamais vraiment compris pourquoi D'une fois à l'autre elles fonctionnent ou non ??? :cry: Et je ne peu attribuer cela qu'à
une configuration précise du compilateur... Problème, lequelle ? Il faudrait passer son temps à modifier jusqu'à provoquer l'erreur !
Ou encore "type" de variable ".l", ".q", ".d" etc...
Autre détails, si tu travaille avec plusieurs versions, être certains que le compilateur est bien celui qui correspond à l'IDE... Moi il m'arrivais souvent de "penser" travaller sur une version alors que je compilais
avec une autre... Raison de ma manière de lancer sous la forme "Purebasic.exe /LOCAL"
As tu essayé avec JaPBe... Configuration de JaPBe... "de Préférences" ==> Fichier(s) Inclus ="Win32 macros" coché ???

D'une manière générale, c'est bien là une des grosse lacune de PB, un manque de DOC sur les erreurs et surtout sur la manière de bien configurer les choses en fonction de tel ou telle autres choses !
"Survival anglais" est bien plus loquace... Mais anglais :( Et la c'est ma compréhension qui en prend un coup :( . JaPBe à ce sujet n'est pas beaucoup plus explicite et produit des erreurs qui parfois ne sont due qu'à la manière de configurer les préférences ! ET comme pas suffisamment d'explication alors je tourne... Au point que parfois, j'ai envie de larguer et de retourner vers des cieux comme PowerBasic, ou même je me dis que j'aurais mieux fait de carrément partir sur le C# ou Python... :wink:
Pour moi qui revient... Cela aurait été du pareils au même, mais voilà, PB avec sa communauté me semblait bien plus intéressant et proche de la machine... Mais le manque d'un certain type de DOC à un certain moment ça pèse... !!! :cry:
Windows 7 et Windows 8.1 Pb 5.0 jusque 5.24 Lts 64 et 5.3 (64)/b]
“Ceux qui rêvent éveillés ont conscience de mille choses qui échappent à ceux qui ne rêvent qu’endormis.”
-Edgar Allan Poe-
Répondre