Recherche de texte dans des memos

Telemak67 Messages postés 11 Date d'inscription samedi 15 avril 2006 Statut Membre Dernière intervention 4 janvier 2009 - 4 mai 2006 à 22:43
Telemak67 Messages postés 11 Date d'inscription samedi 15 avril 2006 Statut Membre Derniè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...

Merci d'avance..
a+

6 réponses

Utilisateur anonyme
5 mai 2006 à 00:02
Salut,



Bon tu as dis des grosses boulettes mais on n'a rien vu : mdrrrrrrrrrr.



Pos et Copy ne te plaisent pas ??



A+
0
sisi231 Messages postés 207 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 29 mars 2013 5
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;

Cordialement.

SISI231
0
Telemak67 Messages postés 11 Date d'inscription samedi 15 avril 2006 Statut Membre Derniè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+
0
Telemak67 Messages postés 11 Date d'inscription samedi 15 avril 2006 Statut Membre Derniè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+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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à.
0
Telemak67 Messages postés 11 Date d'inscription samedi 15 avril 2006 Statut Membre Derniè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..

En tous les cas merci
a+
0
Rejoignez-nous