Telemak67
Messages postés11Date d'inscriptionsamedi 15 avril 2006StatutMembreDernière intervention 4 janvier 2009
-
4 mai 2006 à 22:43
Telemak67
Messages postés11Date d'inscriptionsamedi 15 avril 2006StatutMembreDernière intervention 4 janvier 2009
-
12 mai 2006 à 21:26
Bonjour à tous,
J'ai juste une question :
existe - t'il un mot clef en delphi qui permet d'effectuer une recherche de string se trouvant dans un memo.
Pour faire simple : si je saisis le texte : [ Arbre Fruitier ] dans une zone de texte, je souhaite qu'il me trouve soit le mot [Arbre] ou le mot [Fruiter] se trouvant dans un memo (memos enregistrées dans une base de données MyBase...)
Autre exemple : saisie du texte [La Pomme Fruit Comestible ] dans une zone de texte, je souhaite qu'il me trouve les mots rencontrés : [La] ou [Pomme] ou [Fruit] ou [Commestible] dans les memos.
Un peu à l'instar du CTRL-F existant sous windows mais au fur et à mesure de la saisie que l'utilisateur effectue dans la zone de texte, mais sans qu'il y ait affichage de la boite de dialogue de recherche de windows..Car j'ai vu qu'il existait un composant FindDialog , mais je suppose que celui - ci affiche la boîte de dialogue windows....ce que je ne voudrais pas...
sisi231
Messages postés207Date d'inscriptionmercredi 5 mars 2003StatutMembreDernière intervention29 mars 20135 5 mai 2006 à 19:53
Voici un exemple tiré de l'aide de Delphi :
Cet exemple nécessite un TRichEdit, un TButton et un TFindDialog.
Cliquer sur le bouton affiche la boîte de dialogue de recherche sur la droite du contrôle de saisie. Spécifiez le texte à rechercher et cliquez sur le bouton Suivant pour trouver la première chaîne du contrôle éditeur de texte formaté correspondant.
procedure TForm1.Button1Click(Sender: TObject);
begin
FindDialog1.Position := Point(RichEdit1.Left + RichEdit1.Width, RichEdit1.Top);
FindDialog1.Execute;
end;
procedure TForm1.FindDialog1Find(Sender: TObject);
var
FoundAt: LongInt;
StartPos, ToEnd: Integer;
begin
with RichEdit1 do
begin
{ commence la recherche après la sélection en cours s'il y en a une }
{ sinon, commence au début du texte }
if SelLength <> 0 then
StartPos := SelStart + SelLength
else
StartPos := 0;
{ ToEnd indique la longueur entre StartPos et la fin du texte du contrôle éditeur de texte enrichi }
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
if FoundAt <> -1 then
begin
SetFocus;
SelStart := FoundAt;
SelLength := Length(FindDialog1.FindText);
end;
end;
Telemak67
Messages postés11Date d'inscriptionsamedi 15 avril 2006StatutMembreDernière intervention 4 janvier 2009 5 mai 2006 à 21:06
Salut, merci pour les réponses...
Sisi231, d'après ce que voits dans ton code.., celui - ci ouvre la boite de dialogue de recherche ?
En fait je voudrait éviter l'ouverture de la boîte de dialogue de recherche...
a+
Telemak67
Messages postés11Date d'inscriptionsamedi 15 avril 2006StatutMembreDernière intervention 4 janvier 2009 6 mai 2006 à 10:15
Pour mieux illustrer ce que je cherche à faire , c'est comme sous l'aide de delphi 7.. quand tu commences à taper le mot clef de recherche ..dans le listbox plus bas, il t'affiche les occurences qu'il trouve..
Exemple : si tu tapes le mot clef "base" dans l'index de recherche, il va afficher dans le listbox les lignes ou le mot "base" est rencontré...
Merci d'avance
a+
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 12 mai 2006 à 18:56
Connait pas de composant qui fait ça, mais ça peut exister. Tu peux peut être chercher par ici.
Sinon, il faut le coder... Il y a des techniques intelligentes, mais je les connais pas.
Une méthode bourrine consiste à rechercher la première lettre d'un des
mots rechercher dans tous les mémo. et à chaque fois qu'on la trouve,
on regarde si la deuxième lettre du mot recherché correspond à la
deuxième lettre du mot dans le mémo.
Mais si tu as plein de mémo remplis de texte, c'est super lent.
Un autre solution consiste très certainement à gérer un (des) arbre(s).
Attention l'arbre devrait être regénéré à chaque modification des
mémos...
Tu peux par exemple faire un arbre par lettre de l'alphabet, chaque
racine se subdivisant pour les deuxième lettre de mots existant dans
les mémos et ainsi de suite.
J'explique très mal...
Un petit exemple :
a
| all
| | aller
| | allo
| arriver
b
| bon
| bonjour
(Par contre, faudrait spécifier si chaque feuille ou noeud est un mot.)
Et si l'utilisateur tape "a", tu affiche facilment "aller", "allo" et "arriver".
S'il tape "al", tu peux afficher "aller" et "allo".
Voilou. Faudrait y réfléchir encore un peu, mais l'esprit est là.
Telemak67
Messages postés11Date d'inscriptionsamedi 15 avril 2006StatutMembreDernière intervention 4 janvier 2009 12 mai 2006 à 21:26
Merci pour ta réponse...
J'ai trouvé un moyen pour résoudre mon problème.. :
J'utilise un TStringList ce qui donne par exemple :
MotsSaisie : TStringList ;
MotsSaisie := TStringList.Create;
MotsSaisie.Delimiter := ' '; // On prend comme séparateur l'espace...
MotsSaisie.DelimitedText := ERecherche.Text;
Puis on va lancer une boucle pour chercher mots à mots :
For U := 0 to MotsSaisie.Count-1 do
begin
// puis on effectue la comparaison par rapport aux différents memos..
etc...
Pour la saisie d'un seul mot, le programme fonctionne parfaitement..par contre dès qu'il y un plus d'un mot de saisie en zone d'édition..j'ai une répétition dans ma sortie, du fait que la boucle retrouve le premier mot saisie...
Bon c'est pas trop top...
En fait je suis entrain d'étudier l'utilisation de la base de donnée Firebird, qui permet d'effectuer des requêtes SQL ( contrairement à MyBase...) et je pense qu'il sera plus facile d'effectuer une extraction des mots..