TcyDBAdvGrid - EditorAcceptKey - Parser

Résolu
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 - 19 déc. 2012 à 11:45
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 28 déc. 2012 à 11:42
Bonjour à tous,

Encore une petite question sur les compos de Mauricio !

Pour restreindre la saisie dans un champ d'un DBgrid j'utilise le ValidChars du Tfield

Pour un TFloatField
FieldByName('AR_QTE').ValidChars := #13, '0'..'9', ',', '.';

Mais mon problème n'est pas là, je veux par exemple pour un Float, interdire la saisie deux virgules
Donc j'ai besoin d'avoir accès à la valeur en cours de saisie dans le InplaceEdit de la cellule et c'est là mon hic !
Mauricio a ajouté deux event au DBGrid

Par exemple :
Saisie clavier [1]
EditorAcceptKey(Sender: TObject; Key: Char;  var Accept: Boolean)

ici j'ai pas connaissance de la valeur globale en cours de saisie InplaceEdit.Text, seulement la touche Key
Affchage 1 dans la Cell, en réalité c'est InplaceEdit.Text = 1
EditorAcceptKey(Sender: TObject;  var Value: String; var Parse: Boolean)


ici value = InplaceEdit.Text mais j'ai plus la key et c'est déjà trop tard.


C'est deux event ne m'aide pas à régler le traitement de saisie, hors, Mauricio ne faisant pas les choses à moitié, c'est surement moi qui bug sur leur utilisation !
J'ai regardé le code de cyBaseDBGrid.pas avec les fonctions SetEditText et CanEditAcceptKey mais je ne comprends pas mieux.

Au vu de cette ligne :
if FEditorOptions.IsIntegerField
then ModifiedValue := IntToStr(Round(Parser.ParserResult))
else ModifiedValue := floatToStr(Parser.ParserResult);
La solution c'est peut-être le Parser, mais je ne sais pas comment on utilise un parser ??
D'ailleur j'ai collé le EditorOptions.Parse := false pour que le ValidChars fonctionne avec les TFloatField

Merci.

Jean

10 réponses

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
19 déc. 2012 à 16:56
Je viens de rajouter la propriété cachée InplaceEdit dans mes 2 DBGrids:

TcyDBAdvGrid = class(TcyCustomDBAdvGrid)
private
protected
public
property InplaceEditor; // à ajouter !

TcyDBGrid = class(TcyCustomDBGrid)
private
protected
public
property InplaceEditor; // à ajouter !

Tu peux maintenant contrôler la saisie dans son intégralité :
procedure TFrmCyDBAdvGrid.cyDBAdvGrid1EditorAcceptKey(Sender: TObject; Key: Char; var Accept: Boolean);
begin
cyDBAdvGrid1.InplaceEditor.SelText est le texte sélectionné qui va être écrasé par "Char"
cyDBAdvGrid1.InplaceEditor.Text est le texte actuel dans le InplaceEdit
end;

PS: Selon ta version de Delphi, il se pourrait que tu dois faire ceci :
with TEdit(cyDBAdvGrid1.InplaceEditor) do
begin
SelText est le texte sélectionné qui va être écrasé par "Char"
Text est le texte actuel dans le InplaceEdit
end;

Composants Cindy pour Delphi
Faites une donation.
3
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
19 déc. 2012 à 13:54
Oups une petite erreur, la deuxième procedure c'est
EditorSetFieldText.
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
19 déc. 2012 à 16:41
Salut,

décidément, elle t' a plu ma DBGrid!

Si tu mets EditorOptions.Parse à false, l' utilisateur ne pourra pas saisir n' importe quoi pour le champ:
Si c' est une champ Float, il ne pourra pas saisir 2 fois le symbol décimal.

Si tu mets EditorOptions.Parse à true, ton utilisateur pourra taper dans la cellule "2+2". S' il valide (fait Enter), le champ aura pour valeur "4".
Mais, si tu mets EditorOptions.Parse à true, il pourra taper n' importe quoi car c' est la DBGrid qui va calculer la valeur du champ (si c' est possible biensur).
A+

Composants Cindy pour Delphi
Faites une donation.
0
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
19 déc. 2012 à 16:56
Salut Mauricio,

c'est sure qu'elle m'a plu ! C'est quand même autre chose que le Dbgrid !

Ok, pour EditorOptions.Parse=false, mais l'interdiction de 12..36 se fait au niveau du DataSet (juste avant le OnValidate je suppose). Moi je voulais un truc à la volée, du style 12."Bip"
Je vais me contenter de le gérer en décallé dans le OnValidate pour au moins avoir un jolie message d'erreur.

EditorOptions.Parse = true , Ok , je suis aller voir le ocde TcyMathParser et je vois mieux ce que c'est

J'ai encore pleins de choses à decouvrir, c'est chouette delphi. J'avais pas toucher à la prog depuis les année 90 avec Turbo Pascal ! Ca un peu évoluer sauf la boucle for !!

Merci, A+

Jean
0

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

Posez votre question
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
19 déc. 2012 à 16:58
"Ok, pour EditorOptions.Parse=false, mais l'interdiction de 12..36 se fait au niveau du DataSet"
- Non, l' utilisateur ne peut pas taper 2 fois le symbol "." (au moins, dans ma version Delphi ...) !

a+


Composants Cindy pour Delphi
Faites une donation.
0
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
19 déc. 2012 à 22:52
Bonsoir Mauricio,

J'ajouterai la publicaton de la propriété InplaceEditor aussi dans le miens comme ça je reste conforme avec la version officielle
Je vais pouvoir maintenant, controler de pré ce que saisie l'utilisateur.


Pour le 12..36, j'ai fait le test en D7, ça fonctionne pas. Mais comme cela ce passe au niveau du DataSet, ça doit surtout dépendre du type de datatset, moi c'est une TZtable.

Aller, bonne fin de soirée .... et à demain pour une autre question

Jean
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
20 déc. 2012 à 10:13
"ça doit surtout dépendre du type de datatset"
Non, ça dépend uniquement du type de champ!

a+


Composants Cindy pour Delphi
Faites une donation.
0
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
20 déc. 2012 à 13:32
Bonjour Mauricio,

Une double virgule, c'est du controle de saisi, donc c'est soit dans le Dbgrid, soit c'est au niveau du DataSet ??

Par exemple : chaque type de DataSet défini en interne, en fonction du champ, son propre TField.ValidChars et a une fonction de contrôle de saisi et des règles de "math" (pas deux fois '+' ou '-', pas de fois ',' etc ..) ou alors, le même process mais dans le DBgrid ?

Le TField ne peux pas faire de contrôl de saisie !
Tu me perds un peu là Mauricio !!

A+
Jean
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
20 déc. 2012 à 14:35
"Le TField ne peux pas faire de contrôl de saisie ! "
Bem si car le TField a des déscendants: TIntegerField, TDateField TFloatField etc ...

a+


Composants Cindy pour Delphi
Faites une donation.
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
28 déc. 2012 à 11:42
Salut jderf,

tu peux télécharger la dernière version des compos Cindy (v5.13).
La propriété InplaceEditor est disponible!

a+


Composants Cindy pour Delphi
Faites une donation.
0
Rejoignez-nous