TcyDBAdvGrid - EditorAcceptKey - Parser [Résolu]

Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
- - Dernière réponse : cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
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
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_MAURICIO
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
0
Merci
Oups une petite erreur, la deuxième procedure c'est
EditorSetFieldText.
Commenter la réponse de jderf
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
0
Merci
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.
Commenter la réponse de cs_MAURICIO
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
0
Merci
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
Commenter la réponse de jderf
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
0
Merci
"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.
Commenter la réponse de cs_MAURICIO
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
0
Merci
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
Commenter la réponse de jderf
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
0
Merci
"ç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.
Commenter la réponse de cs_MAURICIO
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
0
Merci
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
Commenter la réponse de jderf
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
0
Merci
"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.
Commenter la réponse de cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
0
Merci
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.
Commenter la réponse de cs_MAURICIO

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.