Problème avec un TDateTimePicker

[Résolu]
Signaler
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
-
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
-
Bonjour,
Sur une fiche j'ai mis un TDateTimePicker mais a l'essai de ce composant je m'aperçois que lorsque je change la date il passe deux fois sur l'évènement On Change et je ne comprends pas pourquoi.

Sur OnChange, j'ai mis:

procedure TfrmPlanning.DateTimePicker1Change(Sender: TObject);
begin
If DateTimePicker1.Date < Date Then
        begin
        Application.MessageBox('vous ne pouvez pas saisir une date inférieure à la date du jour...!', 'Erreur',mb_Ok);
        DateTimePicker1.dateTime := Date;
        End;
end;

Je ne comprends pas pourquoi l'évènement On Change se produit deus fois.

De plus sur :
DateTimePicker1.dateTime := Date;
le DateTimePicker1 ne se met pas à jour sur la date.

Quelqu'un peut m'expliquer pourquoi?

D'abance merci

Cordialement

Codial

14 réponses

Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

pour le moment je n'ai pas trouvé...à part mettre un panel de la taille de l'edit du TDateTimePicker ("cache-cache")

tu affiches le panel ou tu le caches (show ou hide)

tu peux aussi faire "panel1.caption:=datetostr(DateTimePicker1.DateTime);" quand tu veux qu'il affiche la date...

pouah... rien de terrible pour le moment.... que du bricolage

DrJerome
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
salut,

je viens de faire le test en format TIME.

quand tu change l'heure par clavier/souris, l'event est trigé UNE fois. Mais i tu change l'heure ET les minutes, l'event est trigé deux fois.

et le "DateTimePicker1.dateTime := Date;" ne trig pas l'event.

et j'ai aussi modifié le .Datetime dans l'event, et il n'est pas retrigé.

en bref, chez moi ça marche.

es-tu sur que tu n'as changé, disons, que le jour? ou le jour ET le mois?
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

Saludo amigos ;)

c'est normal :

quand tu essaies de changer manuellement la date sur ton DateTimePicker ça fait un événement "Onchange"

Dans l'événement OnChange tu as écris: "DateTimePicker1.dateTime := Date;"
c'est en soit même une modification qui décleche un 2° événement "OnChange"

DrJerome
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

ceci bien sûr par le changement par le listbox du DateTimePicker (et non pas par l'edit du DateTimePicker qui est un événement correct)

DrJerome
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

2 solutions :




1° solution :
<hr />procedure TForm1.DateTimePicker1CloseUp(Sender: TObject);
begin
If DateTimePicker1.Date < Date Then
        begin
        Application.MessageBox('vous ne pouvez pas saisir une date inférieure à la date du jour...!', 'Erreur',mb_Ok);
        DateTimePicker1.dateTime := Date;
        end;
end;

procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
If (DateTimePicker1.Date < Date) and not (DateTimePicker1.DroppedDown) Then
        begin
        Application.MessageBox('vous ne pouvez pas saisir une date inférieure à la date du jour...!', 'Erreur',mb_Ok);
        DateTimePicker1.dateTime := Date;
        end;
end;

<hr />
2° solution (solution sans message) :
<hr />procedure TForm1.FormCreate(Sender: TObject);
begin
     DateTimePicker1.MinDate:=Date;
end;
<hr />

DrJerome
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

variante de la 1° solution :





<hr />

procedure Monmessage;
begin
        Application.MessageBox('vous ne pouvez pas saisir une date inférieure à la date du jour...!', 'Erreur',mb_Ok);
        TfrmPlanning.DateTimePicker1.dateTime := Date;
end;



procedure TForm1.DateTimePicker1CloseUp(Sender: TObject);
begin
     If DateTimePicker1.Date < Date Then
     Monmessage;
end;



procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
     If (DateTimePicker1.Date < Date) and not (DateTimePicker1.DroppedDown) Then
     Monmessage;
end;



<hr />




DrJerome
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

variante de la 1° solution :





<hr />

procedure Monmessage;
begin
    

Application.MessageBox('vous ne pouvez pas saisir une date inférieure à la date du jour...!', 'Erreur',mb_Ok);
     TfrmPlanning.DateTimePicker1.dateTime := Date;
end;




procedure TfrmPlanning.DateTimePicker1CloseUp(Sender: TObject);
begin


     If DateTimePicker1.Date < Date Then
     Monmessage;
end;






procedure TfrmPlanning.DateTimePicker1Change(Sender: TObject);
begin
    

If (DateTimePicker1.Date < Date) and not (DateTimePicker1.DroppedDown) Then
     Monmessage;

end;

<hr />





DrJerome
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

il y avait une petite coquille : il fallait lire "

frmPlanning.DateTimePicker1.dateTime := Date;" (à la place de "
frmPlanning.DateTimePicker1.dateTime := Date;"



en fait on peut simplifier encore ainsi :





<hr />

procedure Monmessage;
begin


     If frmPlanning.DateTimePicker1.Date < Date then
     begin
     Application.MessageBox('vous ne pouvez pas saisir une date inférieure à la date du jour...!', 'Erreur',mb_Ok);
     frmPlanning.DateTimePicker1.dateTime := Date;
     end;

end;




procedure TfrmPlanning.DateTimePicker1CloseUp(Sender: TObject);
begin
    

Monmessage;
end;






procedure TfrmPlanning.DateTimePicker1Change(Sender: TObject);
begin
    

If not DateTimePicker1.DroppedDown Then
     Monmessage;
end;




<hr />
désolé pour ma présence itérative...je disparais ;)

DrJerome
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Bonjour,
Tout d'abord merci pour vos explications et réponses.
Pour Loda: J'ai fais des test et même avec une procédure comme:procedure TfrmPlanning.DateTimePicker1Change(Sender: TObject);
begin
   ShowMessage('OnChange');
end;
L'évènement OnChange s'effectue deux fois!

Pour DRJEROME:
j'ai testé celà:
procedure TfrmPlanning.DateTimePicker1CloseUp(Sender: TObject);
begin
Monmessage;
end;


procedure TfrmPlanning.DateTimePicker1Change(Sender: TObject);
begin
   ShowMessage('OnChange');
end;


et il semble que l'évènement OnChange s'effectue avant l'évènement CloseUP.

C'est à dire que pour mon cas il effectue quand même un filtre sur un DBGrid avant de me lancer le message!

Par ailleurs:

If (DateTimePicker1.Date < Date) and not (DateTimePicker1.DroppedDown) Then
     Monmessage;
ne fonctionne pas, Monmessage ne s'affiche pas.

Je continue de tester.

Cordialement

Codial


 


 
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

Salut,

<hr />
"et il semble que l'évènement OnChange s'effectue avant l'évènement CloseUP"
<hr />

oui, c'est pourquoi j'avais proposé 1 code pour "OnChange" asocié à 1 code pour "CloseUP"

dommage, chez moi ça marchait bien ... c'est peut-être un problème de version Delphi....

DrJerome
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Bonjour,

je travaille avec D7 pro. Ceci dit j'ai résolu mon problème en effectuant mes tests que dans l'évènement On CloseUp et ça a l'air de fonctionner.

Encore merci pour ton aide.


Ceci dit j'ai encore une question: Peut on vider la partie texte du TDateTimePicker et si coui comment?

Cordialement

Codial
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Bonsoir,

oui c'est ce que j'ai fait avec des Edit!!!!

Encore merci

Codial
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

Bonsoir,

tu as fais un truc du style "Edit1.Parent=DateTimePicker1;"
Bonne idée

tu n'étais pas obligé de mettre  "Réponse acceptée" mais c'est gentil en tout cas

A+

DrJerome ;)
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
je suis étonné, chez moi il ne s'est trigé qu'une fois. Note que j'ai fait le test en mode "heure". Si je refait un test je te dirais.

bon code,

ps: je me repete peut-être, mais si tu change deux paramèetres(meure et minute par ex.), il est trigé deux fois.