Un TEdit proposant... comme dans Excell

jennybless Messages postés 38 Date d'inscription samedi 30 septembre 2006 Statut Membre Dernière intervention 10 août 2007 - 24 févr. 2007 à 12:24
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 2 mars 2007 à 21:31
Salut Tout le monde!

J'ai un Tedit que j'aimerai bien voir être proposant (je ne parle pas comme celui de Google par exemple, qui est au fait un Tcombox).
Mais ce qui s'passe par exemple dans les cellules d'Excell. Dans ce dernier, quand un mot a été saisi... la prochaine fois ou juste après s'il vous saisissait un mot probablement semblable. Il te propose un mot similaire à celui que tu venais de faire entrer la dernière fois.
Je dirai que c'est du ''case sensitive''.
Pourriez-vous me venir au secours... Sincèrement merci!

JennyBless

11 réponses

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
24 févr. 2007 à 15:36
il y a surement un composant qui existe deja ... mais je ne le connais pas.

mais si tu veux le faire toi meme, quelques conseils :

 - un champ Historique (TStringList) dans ton edit
 - selStart et selLength pour selectionner le texte ajouté et positionner le curseur (je suppose que sellength peut etre negatif)

apres a toi de jouer ...
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
24 févr. 2007 à 16:05
Salut Jennybless,

Je pense que ce code devrait te convenir. La mémorisation se fait dans un TStringList (mots de 3 lettres minimum). La recherche ne tient pas compte de la distinction Min/Maj (comme Excel qui est "no case sensitive"). N'oublie pas de libérer le TStringList quand tu n'en as plus besoin. Tu peux également le sauver dans un fichier pour récupérer les entrées textes lors de la prochaine exécution de ton programme.
Les événements OnKeyPress et OnExit peuvent être assignés à plusieurs Edit (de par l'emploi de Sender as TEdit).

J'espère ne pas avoir fait d'erreurs...

A +
Thierry

var
   OldStrings: TStringList;


function SearchInList(S: string): integer;
var
  I: integer;
begin
   Result:= -1;
   for I:= OldStrings.Count - 1 downto 0 do // on commence par la dernière entrée
     if AnsiCompareText(Copy(OldStrings[I],1,length(S)), S) = 0 then
     begin
       Result:= I;
       Break;
    end;
end;


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
   I,P: integer;
begin
  if (Key >= #32) and (Sender is TEdit) then
  with (Sender as TEdit) do
  begin
     P:= SelStart;
     SelText:= Key;
     Key:= #0;
     I:= SearchInList(Text);
     if I >= 0 then
     begin
        Text:= Copy(Text,1,P+1) + Copy(OldStrings[I],P+2,Length(OldStrings[I]));
        SelStart:= P+1;
        SelLength:= Length(Text);
     end;
  end;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
var
  S: string;
begin
  if Sender is TEdit then
  with (Sender as TEdit) do
  begin
    S:= TrimRight(Text);
    if (Length(S) >= 3) and (OldStrings.IndexOf(S) < 0) then
       OldStrings.Add(S);
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  OldStrings:= TStringList.Create;
  OldStrings.CaseSensitive:= false;
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   OldStrings.Clear;
   OldStrings.Free;
end;
0
jennybless Messages postés 38 Date d'inscription samedi 30 septembre 2006 Statut Membre Dernière intervention 10 août 2007
25 févr. 2007 à 15:22
Salut Thierry!


Tes codes fonctionnenent en parfaite santé.
Seulement, il y a une chose que j'ai constaté: le phenomène case sensitive marche seulement avec le tout premier enregistrement de ma table (à condition qu'il y est
déjá un mot similaire au dit premier enregistrement).
Quand j'entre un mot qui a probablement des traits avec un certain enregistrement (qui ne pas le premier). Ça ne marche pas comme ça marche correctement avec le premier. Je ne sais pas si je suis clair dans mes dires?


Jennybless




 
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
25 févr. 2007 à 17:47
Bonjour Jennybless.

A vrai dire, je ne comprend pas très bien ton problème.
Peux-tu me donner une liste de mots dans l'ordre et qui ont causé problèmes ?


Remarque: avec le code ci-dessus, si ta liste contient le mot 'bonjour' et que, par après tu tapes "BO", cela va donner "BOnjour". Excel, à la sortie de la cellule, retransforme en 'bonjour', ce que le code ne fait pas. C'est cela que tu souhaites ? Perso, je n'aimerais pas trop que mon B majuscule soit remplacé par "b".

Thierry
0

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

Posez votre question
jennybless Messages postés 38 Date d'inscription samedi 30 septembre 2006 Statut Membre Dernière intervention 10 août 2007
26 févr. 2007 à 12:05
Salut Thierry!


Je t'ai entendu dire de te donner une liste des mots par ordre. Veux-tu dire que les dits codes marcheraient mieux quand la liste des mots serait classée par ordre. Si c'est ça alors c'est moi qui est tors. Donc, je veux la reorganiser alors. Au cas contraire, voici du moins la petite liste à laquelle je fais mon test:

silvie
pélé
israel
henry
silvie
israel

Jennybless
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
26 févr. 2007 à 12:46
Bonjour Jennybless.

Non, je n'ai pas dit que le code marcherait mieux sur une liste classée par ordre. Ne trie pas le stringlist.
J'ai fait un test avec ta petite liste et tout marche parfaitement !
Où est donc ton problème ?

Thierry
0
jennybless Messages postés 38 Date d'inscription samedi 30 septembre 2006 Statut Membre Dernière intervention 10 août 2007
27 févr. 2007 à 13:12
Salut Thierry!

Déjà le fait que tes codes n'ont aucun buggs et marchent bien. C'est un grand pas!!!. Mais au moins rien n'empêche toujours que j'te pose une question peu ''stupide''.
Que veux-tu dire par ''Ne trie pas le stringlist.''
La seule autre manière de me venir encore une fois en aide c'est de ne pas te fatiguer de mes questions (à moins que ça ne te derange pas.)
Peut être en m'expliquant ce language de ''Ne trie pas le stringlist'' m'aidera faire le case sensitive des autres mots de ma liste.

Rappel: je ne dis pas que ça ne marche pas. Ça le fait parfaitement!!! Mais seulement pour le premier enregistrement. Je parle juste de ce qui s'passe avec moi.
Prière de me supporter enocre un tout petit peu afin que je decèle complèment mon cas.

Merci,
Jennybless
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
27 févr. 2007 à 19:47
Salut Jenny,

Cela ne me dérange pas de te répondre, mais je voudrais comprendre le problème.
Ta question de départ portait sur un TEdit qui devait se remplir automatiquement avec les précédents textes entrés par l'utilisateur.  
Or je constate que tu fais cela dans le cadre d'une base données.
Est-ce que ton souhait ne serait pas de compléter l'Edit avec un mot existant dans ta table de données ? (même si ce mot s'y trouve depuis 1 mois !).
Sois un peu plus précise, stp.
A +
Thierry
0
jennybless Messages postés 38 Date d'inscription samedi 30 septembre 2006 Statut Membre Dernière intervention 10 août 2007
28 févr. 2007 à 18:03
Salut Thierry!


Vraiment t'as raison. C'est moi qui t'es du moins induit en erreur (pas tellement une erreur, mais c'est moi qui t'es mal compris).


Au fait, je parle très EXACTEMENT d'une base de données. Cette liste des mots (ou des noms) se trouve dans une base de données (dans un champ). Si tu te rappeles bien Thierry...je crois t'avoir dis que ça ne marche qu'avec le premier enregistrement se trouvant dans le champ de ma base de données (bref, je parle d'une base de données).


Grand merci d'avance,


Jennybless


 


 
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
1 mars 2007 à 10:49
Bonjour Jenny,

Dans ce cas, il existe la solution de faire une recherche dans la Table directement, mais cela va entrainer un déplacement d'enregistrement. C'est faisable, mais comme tu es débutante, je préfère m'en tenir à la solution du Stringlist.
Ce qu'il faut donc, au lancement de ton programme, c'est remplir ce StringList avec toutes les valeurs différentes se trouvant dans la table. On peut le faire dans l'événement OnCreate de ta fiche principale. Mais attention la table doit être préalablement active = true !
Voici un code reprenant toutes les valeurs différentes du champ "libelle" de la table1. Sans faire de distinction entre majuscules et minuscules.

procedure TForm1.FormCreate(Sender: TObject);
var
  S: string;
begin
      OldStrings:= TStringList.Create;
      OldStrings.CaseSensitive:= false;
      Table1.First;
      while not Table1.Eof do
      begin
            S:= Table1.FieldByName('libelle').asString;
            if (S <> '') and (OldStrings.IndexOf(S) < 0) then
                OldStrings.Add(S);
            Table1.Next;
      end;
      Table1.First;
end;

Les autres procédures restent valables.

A +
Thierry
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
2 mars 2007 à 21:31
juste une correction :

Case sensitive : saisie semsible a la "case" c'est a dire aux majuscules et minuscules :

avec case sensitive : BonJouR != bonjour
sans case sensitive : BonJouR == bonjour

Ici ce que tu demande c'est un code "d'auto-completion" c'est a dire qui complete, grace a un dictionnaire, les saisie utilisateurs.

<hr size="2" width="100%" />Croc (click me)
0
Rejoignez-nous