jennybless
Messages postés38Date d'inscriptionsamedi 30 septembre 2006StatutMembreDernière intervention10 août 2007
-
24 févr. 2007 à 12:24
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 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!
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 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)
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 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;
jennybless
Messages postés38Date d'inscriptionsamedi 30 septembre 2006StatutMembreDernière intervention10 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?
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
jennybless
Messages postés38Date d'inscriptionsamedi 30 septembre 2006StatutMembreDernière intervention10 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:
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 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 ?
jennybless
Messages postés38Date d'inscriptionsamedi 30 septembre 2006StatutMembreDernière intervention10 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.
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 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
jennybless
Messages postés38Date d'inscriptionsamedi 30 septembre 2006StatutMembreDernière intervention10 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).
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 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;