D6 TEdit copier/coller et characteres invalides

D6 TEdit copier/coller et characteres invalides - Delphi/Pascal - Programmation

Marsh Posté le 08-06-2003 à 15:27:36    

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
Reply

Marsh Posté le 08-06-2003 à 15:27:36   

Reply

Marsh Posté le 08-06-2003 à 15:51:25    

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
Reply

Marsh Posté le 08-06-2003 à 15:52:52    

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
Reply

Marsh Posté le 08-06-2003 à 16:11:58    

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
Reply

Marsh Posté le 08-06-2003 à 16:15:47    

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
Reply

Marsh Posté le 08-06-2003 à 18:01:06    

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
Reply

Marsh Posté le 08-06-2003 à 18:44:05    

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
Reply

Marsh Posté le 08-06-2003 à 19:13:05    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed