Trouver une chaine dans l'EditorGadget

Programmation d'applications complexes
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Trouver une chaine dans l'EditorGadget

Message 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 :)
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

au hazard, la liste d'objets ne commencerait pas à 1 au lieu de zéro ...
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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 :)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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 :)
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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 :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'y ai passé deux jours et tu voudrais que je continue encore à chercher !
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.....
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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 :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.
Invité

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Et voilà ... :)
Répondre