Page 1 sur 2

Trouver une chaine dans l'EditorGadget

Publié : sam. 13/mars/2004 18:24
par Chris
Salut :)

Petit problème, j'ai besoin de récupérer la position d'une chaine dans un EditorGadget, pour la selectionner.

J'ai donc fait ça, mais ça ne fonctionne pas. Ca me retourne toujours -1, donc, rien trouvé

Code : Tout sélectionner

Procedure Selection()
  Global Find.FINDTEXT
  StringToFind.s = GetGadgetItemText(#Combo,GetGadgetState(#Combo),0)
  
  Find\lpstrText = @StringToFind
  
  Ret = SendMessage_(GadgetID(#Editor),#EM_FINDTEXT,#FR_MATCHCASE,@Find)
  Debug Ret
EndProcedure
Si quelqu'un a une idée :roll:

Chris :)

Publié : sam. 13/mars/2004 18:58
par Patrick88
au hazard, la liste d'objets ne commencerait pas à 1 au lieu de zéro ...

Publié : sam. 13/mars/2004 19:10
par Chris
Patrick88 a écrit :au hazard, la liste d'objets ne commencerait pas à 1 au lieu de zéro ...
Non, ça ne vient pas de là!

Ca vient certainement de la fonction SendMessage().
Il doit y avoir quelque chose qui m'échappe, mais quoi... ?

Chris :)

Publié : dim. 14/mars/2004 7:12
par Anonyme2
Chris, tu devrait regarder les variables cpMin et cpMax (structure CHARRANGE) de la variable Find.FINDTEXT.

cpMin
Character position index immediately preceding the first character in the range.
cpMax
Character position immediately following the last character in the range.

If the cpMin and cpMax members are equal, the range is empty. The range includes everything if cpMin is 0 and cpMax is —1.


Je pense que tu dois mettre cpMax à -1 pour que tous les caractères soient pris en compte dans la recherche. Par défaut, PB rempli les variable avec la valeur 0 donc cpMin vaut 0 mais pour une meilleur comphréhension, met cette variable à 0.

Et dis-nous si ça va.

Publié : dim. 14/mars/2004 11:29
par Chris
Non, ca ne fonctionne pas. :?

J'ai essayé de mettre:

cpMin à 0 et cpMax à -1
cpMin à -1 et cpMax à 0
les deux à -1
les deux à 0

Pour la syntaxe, j'ai fait comme ça:

Code : Tout sélectionner

  Find\lpstrText = @StringToFind
  Find\chrg\cpMin = -1
  Find\chrg\cpMax = -1
C'est bien comme ça, qu'il faut faire... Non???

Chris :)

Publié : dim. 14/mars/2004 11:40
par comtois
j'ai fait des essais aussi , et j'ai toujours -1

Code : Tout sélectionner

Global Texte$
Texte$ = "essai"

Procedure.l ChercheText(gadget) 
   toto.FINDTEXT
   toto\chrg\cpMin = 0
   toto\chrg\cpMax = -1
   toto\lpstrText = @Texte$
   ProcedureReturn SendMessage_(GadgetID(gadget),#EM_FINDTEXT,#FR_MATCHCASE,@toto)
EndProcedure 


OpenWindow(0,0,0,300,330,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Cherche") 
  CreateGadgetList(WindowID()) 
  EditorGadget(0,5,5,290,290)
   AddGadgetItem (0,-1,Texte$ )   
  ButtonGadget(1,5,300,100,20,"Cherche " + Texte$) 
Repeat 
  Select WaitWindowEvent() 
    Case #PB_Event_CloseWindow: End 
    Case #PB_Event_Gadget 
      Select EventGadgetID() 
        Case 1: Debug ChercheText(0) 
      EndSelect 
  EndSelect 
ForEver

Publié : dim. 14/mars/2004 14:12
par nico
Par défaut la recherche commence par la fin du fichier, donc si tu utilises:

Ret = SendMessage_(GadgetID(#Editor),#EM_FINDTEXT,#FR_MATCHCASE,@Find)

Find\chrg\cpMin=longueur de la recherche en commençant par fin du fichier
Find\chrg\cpMax=fin de la recherche en commençant par fin du fichier

soit pour une recherche sur tout le fihier:

Find\chrg\cpMin=Len(GetGadgetText(#Editor))
Find\chrg\cpMax=0 ou -1


ou alors tu utilises:

Ret = SendMessage_(GadgetID(#Editor),#EM_FINDTEXT,#FR_MATCHCASE|#FR_DOWN,@Find)

la référence devient le début du fichier,soit pour une reherche sur tout le fichier:

Find\chrg\cpMin=0
Find\chrg\cpMax=-1

2 jours pour en arriver là !
OUF :D

Publié : dim. 14/mars/2004 14:18
par comtois
ah oui cool , ça marche :)
bravo !

Code : Tout sélectionner

Global Texte$
Texte$ = "essai"

Procedure.l ChercheText(gadget) 
   toto.FINDTEXT
   toto\chrg\cpMin = 0
   toto\chrg\cpMax = -1
   toto\lpstrText = @Texte$
   ProcedureReturn SendMessage_(GadgetID(gadget),#EM_FINDTEXT,#FR_MATCHCASE|#FR_DOWN,toto)
EndProcedure 


OpenWindow(0,0,0,300,330,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Cherche") 
  CreateGadgetList(WindowID()) 
  EditorGadget(0,5,5,290,290)
   AddGadgetItem (0,-1,"Toto" )
   AddGadgetItem (0,-1,"Tututiti" )
   AddGadgetItem (0,-1,Texte$ )   
  ButtonGadget(1,5,300,100,20,"Cherche " + Texte$) 
Repeat 
  Select WaitWindowEvent() 
    Case #PB_Event_CloseWindow: End 
    Case #PB_Event_Gadget 
      Select EventGadgetID() 
        Case 1: Debug ChercheText(0) 
      EndSelect 
  EndSelect 
ForEver

Publié : dim. 14/mars/2004 14:47
par Chris
Merci :)

Toutefois, même si ça marche, ça ne marche pas quand même!!!
(Je sais, je suis très chiant. :lol: )

En fait, normalement, et si j'ai bien compris, la structure CHARRANGE devrait retourner la position de début, (cpMin) et celle de fin (cpMax), de la recherche. Et là, elle retourne les valeurs qu'on lui a donné, et pas autre chose.

Le problème, c'est que CHARRANGE est utilisée aussi pour les messages #EM_SETSEL, #EM_EXSETSEL, #EM_GETSEL, et #EM_EXGETSEL qui sont utilisés pour sélectionner le texte dans les RichEdit et Edit.

Vous me direz qu'on peut les entrer par le code,

Code : Tout sélectionner

Find\chrg\cpMin = Pos
Find\chrg\cpMax = Pos + Len(Texte$)
mais le but de la manoeuvre, c'est de faire fonctionner ce truc comme il doit fonctionner, et pas grâce à des bidouilles. :wink:

Voilà voilà !!!, c'est l'exercice du jour. :lol:

Chris :)

Publié : dim. 14/mars/2004 15:02
par nico
J'y ai passé deux jours et tu voudrais que je continue encore à chercher !

Publié : dim. 14/mars/2004 15:27
par nico
Un peu de sérieux :lol:
En fait, normalement, et si j'ai bien compris, la structure CHARRANGE devrait retourner la position de début, (cpMin) et celle de fin (cpMax), de la recherche. Et là, elle retourne les valeurs qu'on lui a donné, et pas autre chose
C'est seulement vrai, si tu utilises une structure FINDTEXTEX
avec le message: SendMessage_(GadgetID(Gadget), #EM_FINDTEXTEX,#FR_MATCHCASE|#FR_DOWN,toto)

Soit en reprenant l'exemple de Comtois:

Code : Tout sélectionner

Global Texte$ 
Texte$ = "essai" 

Procedure.l ChercheText(Gadget) 
  toto.FINDTEXTEX
  toto\chrg\cpMin = 0 
  toto\chrg\cpMax = -1 
  toto\lpstrText = @Texte$     
  position=SendMessage_(GadgetID(Gadget),#EM_FINDTEXTEX,#FR_MATCHCASE|#FR_DOWN,toto)
  Debug "toto\chrgText\cpMin= "+Str(toto\chrgText\cpMin)
  Debug "toto\chrgText\cpMax= "+Str(toto\chrgText\cpMax)  
  SendMessage_(GadgetID(Gadget),#EM_EXSETSEL, 0, toto\chrgText)
  ProcedureReturn position
EndProcedure 


OpenWindow(0,0,0,300,330,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Cherche") 
CreateGadgetList(WindowID()) 
EditorGadget(0,5,5,290,290) 
AddGadgetItem (0,-1,"Toto" ) 
AddGadgetItem (0,-1,"Tututiti" ) 
AddGadgetItem (0,-1,Texte$ )    
ButtonGadget(1,5,300,100,20,"Cherche " + Texte$) 
Repeat 
  Select WaitWindowEvent() 
    Case #PB_Event_CloseWindow: End 
    Case #PB_Event_Gadget 
      Select EventGadgetID() 
        Case 1: Debug ChercheText(0) 
      EndSelect 
  EndSelect 
ForEver
On pourrait aussi faire la sélection en utilisant les paramètres: position et position+len (texte$).


La prochaine question de Chris pourrait être: çà marche pour la première chaine trouvée mais pour la suivante.....

Publié : dim. 14/mars/2004 15:33
par Chris
Bravo!!! :10:
La prochaine question de Chris pourrait être: çà marche pour la première chaine trouvée mais pour la suivante.....
Ben, c'est toi qui voit :roll: :lol:

Chris :)

Publié : dim. 14/mars/2004 15:44
par nico
puisque maintenat tu as en retour le paramètre: toto\chrgText\cpMax
utilise le pour redéfinir ta nouvelle zone de recherche.

toto\chrg\cpMin = toto\chrgText\cpMax
toto\chrg\cpMax = -1

Ce qui te permettra de retrouver la chaine correspondante suivante.

Publié : dim. 14/mars/2004 16:13
par Invité
La réponse à l'exercice précédent:

Code : Tout sélectionner

Global Texte$ 
Texte$ = "essai" 

Procedure.l ChercheText(Gadget,pos) 
  toto.FINDTEXTEX
  toto\chrg\cpMin = pos
  toto\chrg\cpMax = -1
  toto\lpstrText = @Texte$     
  position=SendMessage_(GadgetID(Gadget),#EM_FINDTEXTEX,#FR_MATCHCASE|#FR_DOWN,toto)
  Debug "toto\chrgText\cpMin= "+Str(toto\chrgText\cpMin)
  Debug "toto\chrgText\cpMax= "+Str(toto\chrgText\cpMax)
  Debug "position= "+Str(position)
  SendMessage_(GadgetID(Gadget),#EM_EXSETSEL, 0, toto\chrgText)
  If position=-1
    MessageRequester("Info", "Pas de chaine trouvée"+Chr(10)+"Fin de Fichier,retour au début")
    ProcedureReturn 0
    Else
      ProcedureReturn toto\chrgText\cpMax
      EndIf
EndProcedure 


OpenWindow(0,0,0,300,330,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Cherche") 
CreateGadgetList(WindowID()) 
EditorGadget(0,5,5,290,290)
;Initialement pos=0
AddGadgetItem (0,-1,"Toto" )
AddGadgetItem (0,-1,Texte$+Texte$ ) 
AddGadgetItem (0,-1,"Tututiti" ) 
AddGadgetItem (0,-1,Texte$ )    
ButtonGadget(1,5,300,100,20,"Cherche " + Texte$) 
Repeat 
  Select WaitWindowEvent() 
    Case #PB_Event_CloseWindow: End 
    Case #PB_Event_Gadget 
      Select EventGadgetID() 
        Case 1
          pos= ChercheText(0,pos) 
      EndSelect 
  EndSelect 
ForEver

Publié : dim. 14/mars/2004 16:16
par nico
Et voilà ... :)