Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1537 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  D6 TEdit copier/coller et characteres invalides

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

D6 TEdit copier/coller et characteres invalides

n°420991
KrzAramis
Help Me
Posté le 08-06-2003 à 15:27:36  profilanswer
 

Bonjour a tous,
Je suis en train de developper une application qui se sert d'un TEdit
pour donner un nom a un fichier. J aimerai autant que faire ce peux minimiser
l'apparition de characteres indesirables du style:

 &  ~  ' { ( [ - | ` _ \ )]
etc.
J ai donc programmer sur l'evenement on Key press de mon Tedit le code:

Code :
  1. procedure TForm_Main.edit01KeyPress(Sender: TObject; var Key: Char);
  2. var
  3.   i : integer;
  4.   s : string;
  5.   sAncientText : string; //Text prior to Key press
  6. begin
  7.   // Paste
  8.   if (key = ^V) then
  9.   begin
  10.     try
  11.       sAncientText := Edit01.Text;
  12.       s := clipboard.AsText;
  13.       for i := 0 to Length(s) do begin
  14.         if (not (s in ['0'..'9','A'..'Z',' ','a'..'z','é','è','ç','à','ù']))
  15.          then
  16.           s[i] := #0;
  17.         end;
  18.       if sAncientText <> '' then begin
  19.         for i := 0 to Length(sAncientText) do begin
  20.           if (not (sAncientText[i] in ['0'..'9','A'..'Z',' ','a'..'z','é','è','ç','à','ù']))
  21.             then
  22.              sAncientText[i] := #0;
  23.         end; //for
  24.       end;
  25.       with Edit01 do begin
  26.         AutoSelect := True;
  27.         Text := sAncientText + s;
  28.         AutoSelect := False;
  29.       end;
  30.     except
  31.       on e: exception do
  32.         Key := #0;
  33.     end;
  34.   end
  35.   else if (not (Key in ['0'..'9','A'..'Z',' ','a'..'z','é','è','ç','à','ù',
  36.   Chr(VK_BACK),Chr(VK_DELETE),^C,^X])) then
  37.     Key := #0;
  38. end;


et sur l évenement KeyDown

Code :
  1. procedure TForm_Main.Edit01KeyDown(Sender: TObject; var Key: Word;
  2.   Shift: TShiftState);
  3. var i : integer;
  4.     s : string;
  5.     sAncientText : string; //Text prior to Key down
  6. begin
  7.   //Avoid paste via contexual menu or by shift Ins (undetected by KeyPress)
  8.   if (key = VK_INSERT) and (shift = [ssShift]) then
  9.     begin
  10.     try
  11.       sAncientText := Edit01.Text;
  12.       s := clipboard.AsText;
  13.       for i := 0 to Length(s) do begin
  14.         if (not (s[i] in ['0'..'9','A'..'Z',' ','a'..'z','é','è','ç','à','ù']))
  15.          then
  16.           s[i] := #0;
  17.         end;
  18.       with Edit01 do begin
  19.         AutoSelect := True;
  20.         Text := sAncientText + s;
  21.         AutoSelect := False;
  22.       end;
  23.     except
  24.       on e: exception do
  25.         Key := 0;
  26.     end;
  27.   end;
  28. end;


Que se passe t il ? ben quand l'utilisateur tape au clavier ca marche le hic vient du copier/coller
en effet lors du copier/coller le texte du presse papier est systematiquement ajouter au debut du TEdit:
Exemple: soit Ancient text: "Bonjour"
              press papier: "a tous <> %*µ"
supposons que le curseur soit a la fin de [i]bonjour lors de l'insertion cela donne
TEdit.TExt := 'a tous <> %*µBonjour';
Hors en mode pas a pas il montre que la variable 's' contient des #0 a la place des characteres
que je ne veux pas avant de l'ajouter a la propriete text du TEDit.
Ma premiere question est donc:
Comment faire pour que lors du collage le text s'ajoute à l'endroit indiquer par le curseur
et comment faire en sorte que le texte collé soit exempt de tous characteres indesirable ??

 
Etant donne la situation avant que le fichier soit généré je verifie une derniere fois aue tout est
en ordre et la HORREUR  :sweat: . Voici le code qui test si le TEdit est exempt de characteres invalide:

Code :
  1. procedure TForm_Main.ActAddExecute(Sender: TObject);
  2. var s : string;
  3.     WrongCharacter : boolean;
  4.     isEmpty : boolean;
  5.     i : integer;
  6. begin
  7.   WrongCharacter := False;
  8.   isEmpty := False;
  9.   [...]
  10.   if Ed_RName.Text = '' then begin
  11.     MessageDlg(Err_Msg_RNameMiss, mtWarning, [mbOK],0);
  12.     //The aim is to place the pointer in the Edit box
  13.     Ed_RName.SelStart := 0;  //seems to work
  14.     Exit;
  15.   end
  16.   else begin //the Edit box is not empty, verify if unauthorised characters are present
  17.   { TODO -oAramis -cString Management :
  18. The First character of the Edit Box is always wrong impossible to test
  19. the procedure }
  20.     s := Edit01.Text;
  21.     for i := 0 to Length(s) do begin
  22.       if (not (s in ['0'..'9','A'..'Z',' ','a'..'z','é','è','ç','à','ù']))
  23.         then begin
  24.           ShowMessage(s[i]);
  25.           WrongCharacter := True;
  26.         end;
  27.     end;// for
  28.   end; // else  
  29.   if WrongCharacter then begin
  30.     MessageDlg(Err_Msg_WrongChar, mtWarning, [mbOK], 0);
  31.     Edit01.SelStart := 0;
  32.     Exit;
  33.   end;


Si i:= 0 le premier character quel qu il soit donne tjrs WrongChar = True par contre
si je modifie la boucle pour la faire commencer à 1 ca marche sauf que si le premier character est
mauvais je suis mal :/
D ou ma 2nd Question:
[i]Pourquoi qd i est égal à zero le code donne systematiquement WrongChar = True ,
Comment pallier a ce probleme?

 
Merci d'avance à toutes et à tous.
 
Aramis @->--  [:ddr555]


Message édité par KrzAramis le 08-06-2003 à 16:10:58

---------------
The Only Way for Evils to Triumph is for Good Men to do Nothing @->-- Cours Réseaux@->-- Mon Site
mood
Publicité
Posté le 08-06-2003 à 15:27:36  profilanswer
 

n°420998
antp
Super Administrateur
Champion des excuses bidons
Posté le 08-06-2003 à 15:51:25  profilanswer
 

Plutôt que d'autoriser quelques caractères (t'en laisses peu :/) pourquoi ne pas interdire que les quelques caractères interdits ?
à savoir:

? * | ¦ < > / \ " :


 


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°420999
antp
Super Administrateur
Champion des excuses bidons
Posté le 08-06-2003 à 15:52:52  profilanswer
 

for i := 0 to Length(s)
 
-> sachant que s[0] = longueur de la chaîne, ce code est hyper aléatoire... c'est plutôt for i := 1 to Length(s)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°421015
KrzAramis
Help Me
Posté le 08-06-2003 à 16:11:58  profilanswer
 

antp a écrit :

Plutôt que d'autoriser quelques caractères (t'en laisses peu :/) pourquoi ne pas interdire que les quelques caractères interdits ?
à savoir:

? * | ¦ < > / \ " :


 
 


ben c est toute la puissance du copier coller !
Je changerai le code t en fais pas  [:ddr555]


---------------
The Only Way for Evils to Triumph is for Good Men to do Nothing @->-- Cours Réseaux@->-- Mon Site
n°421018
KrzAramis
Help Me
Posté le 08-06-2003 à 16:15:47  profilanswer
 

antp a écrit :

for i := 0 to Length(s)
 
-> sachant que s[0] = longueur de la chaîne, ce code est hyper aléatoire... c'est plutôt for i := 1 to Length(s)


Mon probleme c est que j utilise deja code autre part dans mon programme et il marche tres bien . Ce que je ne comprends pas c est pourquoi dans ce cas c est different .!
s[0] donne t il tjrs la taille de la chaine ?
Lors du key press le programme s est il que la chaine sera au minimum de longueur 1 ???
Je dois dire que j en perds mon delphi la !  
Bref un truc de regler la suite risque d etre plus coton !
 
@->--


---------------
The Only Way for Evils to Triumph is for Good Men to do Nothing @->-- Cours Réseaux@->-- Mon Site
n°421057
antp
Super Administrateur
Champion des excuses bidons
Posté le 08-06-2003 à 18:01:06  profilanswer
 

Je sais pas si s[0] te renvoie toujours la longueur, je sais que c'est le cas pour les ShortString (et les chaînes de longueur fixe).
Par contre comme les chaînes commencent à 1, faut pas aller lire s[0] :p
Tu dis que dans tes autres softs ça marche, c'est vraiment un gros coup de bol alors...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°421060
KrzAramis
Help Me
Posté le 08-06-2003 à 18:44:05  profilanswer
 

Je suis etonne car le code je l ai pas invente je l ai pris d une discussion sur le meme sujet. Donc qd je test il faut que je commence a 1. bon d accord.
Quand au evenements.. j ai juste coder ceux presente dans ce thread (Key down et press). Apparament c est KeyPress qui prend le charactere.
Pour finir j ai deja empecher l entree de certain characteres dans d autre soft mais je me suis jamais interresse au probleme du copie/coller !
 
@->--


---------------
The Only Way for Evils to Triumph is for Good Men to do Nothing @->-- Cours Réseaux@->-- Mon Site
n°421070
antp
Super Administrateur
Champion des excuses bidons
Posté le 08-06-2003 à 19:13:05  profilanswer
 

ce que je fais c'est éventuellement empêcher de taper les caractères, mais je mets toujours un test plus loin pour que les autres moyens (copier coller par ex) soient bloqués eux-aussi


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  D6 TEdit copier/coller et characteres invalides

 

Sujets relatifs
Copier en VB une macro dans un nouveau fichier[VBA/Access] Copier un formulaire d'une appli à une autre [résolu]
[VB \ exel]Copier une ligne d'une table .... .. ..Copier un fichier avec CopyFile --> erreur à cause du uses Windows
[c++ builder] Copier puis executer fichier en c/c++ ?[ C ] Comment copier un fichier en qelques ligne?
[C] copier un fichier de données formatées via une fonction externe...[MySQL] Copier le contenu d'un champ dans un autre.
[dBASE] Copier la structure d'une table pour mettre sous ExcelComment copier un fichier indefiniment sur une même partition ?
Plus de sujets relatifs à : D6 TEdit copier/coller et characteres invalides


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR