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
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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;
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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+
jderf
Messages postés189Date d'inscriptionmercredi 29 décembre 2004StatutMembreDernière intervention 2 octobre 20141 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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 ...) !
jderf
Messages postés189Date d'inscriptionmercredi 29 décembre 2004StatutMembreDernière intervention 2 octobre 20141 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
jderf
Messages postés189Date d'inscriptionmercredi 29 décembre 2004StatutMembreDernière intervention 2 octobre 20141 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 !!