TcyDBAdvGrid - EditorAcceptKey - Parser [Résolu]

jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 19 déc. 2012 à 11:45 - Dernière réponse : cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention
- 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

cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 19 déc. 2012 à 16:56
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_MAURICIO
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 19 déc. 2012 à 13:54
0
Utile
Oups une petite erreur, la deuxième procedure c'est
EditorSetFieldText.
Commenter la réponse de jderf
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 19 déc. 2012 à 16:41
0
Utile
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
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 19 déc. 2012 à 16:56
0
Utile
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
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 19 déc. 2012 à 16:58
0
Utile
"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
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 19 déc. 2012 à 22:52
0
Utile
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
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 20 déc. 2012 à 10:13
0
Utile
"ç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
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 20 déc. 2012 à 13:32
0
Utile
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
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 20 déc. 2012 à 14:35
0
Utile
"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
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 28 déc. 2012 à 11:42
0
Utile
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.