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
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

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.

)
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,
mais le but de la manoeuvre, c'est de faire fonctionner ce truc comme il doit fonctionner, et pas grâce à des bidouilles.
Voilà voilà !!!, c'est l'exercice du jour.
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
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!!!
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
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à ...
