Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Utilitaire de saisie d'une date | |
| | |
Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Utilitaire de saisie d'une date Ven 25 Mai 2012 - 18:38 | |
| Tu as raison, c'est une engeance sournoise et pleine d'imagination pour trouver les imprévus du programmeur !
Tiens, je vais boire un coup pour me consoler, bon ap' (avec modération comme dit l'autre, on voit qu'il n'a pas soif, lui !) | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Utilitaire de saisie d'une date Ven 25 Mai 2012 - 18:46 | |
| WIKIPEDIA Depuis l'ajustement du calendrier grégorien, sont bissextiles les années1 : soit divisibles par 4 mais non divisibles par 100 ; soit divisibles par 400. Donc, inversement, ne sont pas bissextiles les années : soit non divisibles par 4 ; soit divisibles par 100, mais pas par 400. Ainsi, 2012 est bissextile. L'an 2008 était bissextile suivant la première règle. L'an 1900 n'était pas bissextile, car divisible par 100, ce qui est contraire à la première règle (ou exclusif), et non divisible par 400, ce qui confirme la seconde. L'an 2000 était bissextile car divisible par 400. Le calendrier julien, qui avait cours avant le calendrier actuel, ne distinguait pas les fins de siècles (années divisibles par 100). Une année était bissextile tous les 4 ans, sans autre exception. Le calendrier julien avait ainsi une année moyenne de 365,25 jours, au lieu des 365,2422 jours nécessaires au cycle terrestre. Ce qui a engendré l'accumulation d'une dizaine de jours de retard en quinze siècles. L'instauration du calendrier grégorien a permis d'une part de rattraper le retard en supprimant des jours, et d'autre part de ralentir le rythme en supprimant 3 années bissextiles tous les 400 ans. Ce calendrier grégorien offre selon les règles énoncées une année moyenne de 365,2425 jours, ce qui est encore un peu trop long, mais n'engendre qu'une erreur de 3 jours en 10 000 ans.
Bon on me réclame à l'apéro.
A+ | |
| | | ambroise
Nombre de messages : 264 Localisation : Haute-Savoie Date d'inscription : 29/04/2012
| Sujet: Re: Utilitaire de saisie d'une date Ven 25 Mai 2012 - 19:32 | |
| J'ai posté ce même code dans le fil "contrôler le contenu d'un edit", mais je pense qu'il a aussi sa place ici, ayant glané ici ou là les bonnes idées des Panoramiciens de ce fil. Merci à tous. - Code:
-
dim annee$ , mois$ , jour$ , annee_util$ , mois_util$ , jour_util$ , mil$ , aujourdhui$ , date_util$ , annee% , bissex% , bissex100% , bissex400% edit1_objet% label verif
annee$ = right$(date$,4) mil$ = mid$(annee$,1,1) edit1_objet% = 1
alpha 2 caption 2, "Entrez une date sous le format JJ/MM/AAAA"+chr$(13)+"Faute de quoi vous serez rappelé à l'ordre !"+chr$(13)+"Toutes les erreurs sont théoriquement signalées..."+chr$(13)+"Celui qui trouvera une faille gagnera... ce code gratuit !" top 2,30 left 2, 100
edit 1:on_change 1,verif top 1,100 left 1, 100
alpha 3 caption 3, "Ce code s'est largement inspiré des codes et/ou de l'aide de Klaus, Bignono, Jean-Claude, Jicehel, JL35"+chr$(13)+"Merci à eux..." top 3,150 left 3, 100
end
verif: if len(text$(edit1_objet%))=1 if numeric(right$(text$(edit1_objet%),1))=0 or right$(text$(edit1_objet%),1)="." text edit1_objet%,"" message "Quantième du jour en chiffres" return end_if if val(right$(text$(edit1_objet%),1))>3 text edit1_objet%,"" message "Quantième du jour sur 2 chiffres" return end_if end_if if len(text$(edit1_objet%))=2 if numeric(right$(text$(edit1_objet%),1))=0 or right$(text$(edit1_objet%),1)="." text edit1_objet%,left$(text$(edit1_objet%),1) message "Quantième du jour sur 2 chiffres" return end_if if val(text$(edit1_objet%))>31 or val(text$(edit1_objet%))<1 text edit1_objet%,"" message "Le quantième du jour ne peut être supérieur à 31" return end_if end_if
if mid$(text$(edit1_objet%),3,1)<>"/" and len(text$(edit1_objet%))= 3 text edit1_objet%,left$(text$(edit1_objet%),2) + "/" message "Le signe de séparation / doit être accolé aux chiffres" return end_if
if len(text$(edit1_objet%))=4 if numeric(right$(text$(edit1_objet%),1))=0 or right$(text$(edit1_objet%),1)="." text edit1_objet%,left$(text$(edit1_objet%),3) message "Quantième du mois en chiffres" return end_if if val(right$(text$(edit1_objet%),1))>1 text edit1_objet%,left$(text$(edit1_objet%),3) message "Quantième du mois sur 2 chiffres" return end_if end_if
if len(text$(edit1_objet%))=5 if numeric(right$(text$(edit1_objet%),1))=0 or right$(text$(edit1_objet%),1)="." text edit1_objet%,left$(text$(edit1_objet%),4) message "Quantième du mois en chiffres" return end_if if val(right$(text$(edit1_objet%),2))>12 text edit1_objet%,left$(text$(edit1_objet%),3) message "Le quantième du mois ne peut être supérieur à 12" return end_if if val(left$(text$(edit1_objet%),2))>30 and (val(mid$(text$(edit1_objet%),4,2))=4 or val(mid$(text$(edit1_objet%),4,2))=6 or val(mid$(text$(edit1_objet%),4,2))=9 or val(mid$(text$(edit1_objet%),4,2))=11) if val(mid$(text$(edit1_objet%),4,2))=4 then message "Le mois d'avril ne compte que 30 jours." if val(mid$(text$(edit1_objet%),4,2))=6 then message "Le mois de juin ne compte que 30 jours." if val(mid$(text$(edit1_objet%),4,2))=9 then message "Le mois de septembre ne compte que 30 jours." if val(mid$(text$(edit1_objet%),4,2))=11 then message "Le mois de novembre ne compte que 30 jours." return end_if end_if
if mid$(text$(edit1_objet%),6,1)<>"/" and len(text$(edit1_objet%))= 6 text edit1_objet%,left$(text$(edit1_objet%),5) + "/" message "Le signe de séparation / doit être accolé aux chiffres" return end_if if len(text$(edit1_objet%))=7 if numeric(right$(text$(edit1_objet%),1))=0 or right$(text$(edit1_objet%),1)="." text edit1_objet%,left$(text$(edit1_objet%),6) message "Quantième de l'année en chiffres" return end_if if val(right$(text$(edit1_objet%),1))>val(mil$) text edit1_objet%,left$(text$(edit1_objet%),6) message "Le quantième de l'année ne peut être supérieur à "+annee$ return end_if
end_if if len(text$(edit1_objet%))=8 if numeric(right$(text$(edit1_objet%),1))=0 or right$(text$(edit1_objet%),1)="." text edit1_objet%,left$(text$(edit1_objet%),7) message "Quantième de l'année en chiffres" return end_if
end_if if len(text$(edit1_objet%))=9 if numeric(right$(text$(edit1_objet%),1))=0 or right$(text$(edit1_objet%),1)="." text edit1_objet%,left$(text$(edit1_objet%),8) message "Quantième de l'année en chiffres" return end_if
end_if if len(text$(edit1_objet%))=10 annee% = val(right$(text$(edit1_objet%),4)) bissex% = annee% - int((annee% / 4))*4 bissex100% = annee% - int((annee% / 100))*100 bissex400% = annee% - int((annee% / 400))*400
if numeric(right$(text$(edit1_objet%),1))=0 or right$(text$(edit1_objet%),1)="." text edit1_objet%,left$(text$(edit1_objet%),9) message "Quantième de l'année en chiffres" return end_if if val(right$(text$(edit1_objet%),4))>val(annee$) text edit1_objet%,left$(text$(edit1_objet%),6) message "Le quantième de l'année ne peut être supérieur à "+annee$ return end_if if val(mid$(text$(edit1_objet%),4,2))=2 and val(left$(text$(edit1_objet%),2))>28 and bissex% > 0 message "Le mois de février "+ right$(text$(edit1_objet%),4) + " ne compte que 28 jours." return end_if if val(mid$(text$(edit1_objet%),4,2))=2 and val(left$(text$(edit1_objet%),2))>29 and bissex% = 0 message "Le mois de février "+ right$(text$(edit1_objet%),4) + " ne compte que 29 jours." return end_if if val(mid$(text$(edit1_objet%),4,2))=2 and val(left$(text$(edit1_objet%),2))>28 and bissex100% = 0 and bissex400% > 0 message "Le mois de février "+ right$(text$(edit1_objet%),4) + " ne compte que 28 jours." return end_if if val(mid$(text$(edit1_objet%),4,2))=2 and val(left$(text$(edit1_objet%),2))>29 and bissex100% = 0 and bissex400% = 0 message "Le mois de février "+ right$(text$(edit1_objet%),4) + " ne compte que 29 jours." return end_if
end_if if len(text$(edit1_objet%))>10 text edit1_objet%,left$(text$(edit1_objet%),10) return end_if
if len(text$(edit1_objet%))=10 if val(left$(text$(edit1_objet%),2))>30 and (val(mid$(text$(edit1_objet%),4,2))=4 or val(mid$(text$(edit1_objet%),4,2))=6 or val(mid$(text$(edit1_objet%),4,2))=9 or val(mid$(text$(edit1_objet%),4,2))=11) if val(mid$(text$(edit1_objet%),4,2))=4 then message "Le mois d'avril ne compte que 30 jours." if val(mid$(text$(edit1_objet%),4,2))=6 then message "Le mois de juin ne compte que 30 jours." if val(mid$(text$(edit1_objet%),4,2))=9 then message "Le mois de septembre ne compte que 30 jours." if val(mid$(text$(edit1_objet%),4,2))=11 then message "Le mois de novembre ne compte que 30 jours." end_if
mois$ = mid$(date$,4,2) jour$ = left$(date$,2) jour_util$ = left$(text$(edit1_objet%),2) mois_util$ = mid$(text$(edit1_objet%),4,2) annee_util$ = right$(text$(edit1_objet%),4)
aujourdhui$ = annee$+mois$+jour$ date_util$ = annee_util$+mois_util$+jour_util$
if val(date_util$) > val(aujourdhui$) then message "Vous avez entré une date du futur !"
return end_if
return
J'ai tiré profit de la leçon sur les années bissextiles. Modification du code le 26/05/2012 : le précédent code posait problème lors de certaines corrections de la date
Dernière édition par ambroise le Sam 26 Mai 2012 - 11:08, édité 3 fois | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Utilitaire de saisie d'une date Ven 25 Mai 2012 - 20:09 | |
| @Ambroise Involontairement j'ai mis le message WIKIPEDIA ici, Mais finalement c'est bien, vu que tu as suivi. Ton code fais parti du "concours". Dans ton code, la correction du 29/02/1900 est OK. Donc nous en avons 3, le tien, le mien et celui de Bignono, chacun pourra y faire son choix. Pour ma part, je vais repartir sur ma conception et revoir la saisie pour l'utilisateur. N'empêche qu'on est des bons. A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Utilitaire de saisie d'une date Ven 25 Mai 2012 - 21:31 | |
| et les premiers à le reconnaître... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Utilitaire de saisie d'une date Ven 25 Mai 2012 - 22:45 | |
| Salut tout le monde. D’après ce que j’ai pu récolter sur la question de l’année bissextile : Règle : Une année est bissextile (elle possède un 29 février) si son millésime est divisible par 4 (ex: 1904 1980 1996), mais pas par 100 (ex: 1900), à moins qu'il soit divisible par 400 (ex: 2000), sauf s'il est divisible par 4000 (ex: 4000 8000 12000 ). Justification: L'ANNEE : durée "moyenne" de la rotation de la Terre autour du Soleil (valeur: 365,24220 jours) Une année civile de 365 jours présente donc un déficit annuel de : 365,24220 – 365 = 0, 24220 jour par rapport à l'année astronomique. En ajoutant un 29 février tous les 4 ans, l’année civile moyenne devient : 365 + 0,25 = 365,25 jours; soit un excédent annuel moyen de : 365,25 – 365,24220 = 0,0078 jour. En supprimant un 29 février par siècle, l'année civile moyenne devient : 365,25 – 0,01 = 365,24 jours; soit un déficit annuel moyen de : 365,24220 – 365,24 = 0,00220 jour. En ajoutant un 29 février tous les 400 ans, l’année civile moyenne devient alors égale à : 365,24 + 0,0025 = 365,2425 jours; d'où un excédent annuel moyen de : 365,2425 – 365,2422 = 0,0003 jour. En supprimant un 29 février tous les 4000 ans, l'année civile moyenne devient 365,24250 – 0,00025 = 365,24225 ; soit encore un excédent annuel de : 365,24225 – 365,24220 = 0,00005 jour. L'année 4000, ne sera pas bissextile , ainsi que 8000 et 12000 ... Alors, les optimistes et ceux qui veulent coder « une saisie de date » sans erreur, doivent revoir leurs copies ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Utilitaire de saisie d'une date Ven 25 Mai 2012 - 22:54 | |
| Ah oui tiens c'est vrai, j'avais pas pensé à l'année 4000 | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Utilitaire de saisie d'une date Ven 25 Mai 2012 - 23:10 | |
| Et pourtant, l’année 4000, c’est dans moins de 2 millénaires ! C’est donc très bientôt ! | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Utilitaire de saisie d'une date Ven 25 Mai 2012 - 23:37 | |
| | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Utilitaire de saisie d'une date Sam 26 Mai 2012 - 1:34 | |
| Dans notre calendrier grégorien actuel, l'année civile comporte donc 365 jours (année normale) ou 366 jours (année bissextile). Il y a un excédent de l'année civile moyenne sur l'année astronomique de 0,00005 jour soit 0,00005*24*60*60 = 4,32 secondes. Le résidu de 0.00005 jour est un excédent. On doit donc retrancher un jour et non ajouter. Ce qui donne que l’année 20000 aura 365 jours et non 367 !! Mais d’ici là, ils naitront plusieurs génies pour proposer et imposer d’autres calendriers! Et nous autres, nous ne sauront jamais si l’année 20000 sera de 365 ou 366 jours. Quelle perte pour l’humanité !!! | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Utilitaire de saisie d'une date Sam 26 Mai 2012 - 8:22 | |
| J'ai mal à la tête Finalement je vais prendre le calendrier Maya, au moins je serais là pour en voir la fin | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Utilitaire de saisie d'une date Sam 26 Mai 2012 - 8:55 | |
| C'est amusant, ces réflexions sur une routine générale pouvant vérifier n'importe quelle date. Pour cela, on trouve facilement des algorithmes sur le net (Google est mon ami...). Mais est-ce vraiment utile ? Dans la demande initiale, ne s'agissait-il pas tout simplement de contrôler si une date "utile" est valide ? Date de naissance, date d'échéance, ... Donc, des dates au maximum entre (aujourd'hui-200 ans) et (aujourd'hui+200 ans) ? | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Utilitaire de saisie d'une date Sam 26 Mai 2012 - 9:38 | |
| Côté pratique (et pour mettre dans le programme), c'est évidemment ça. Et pour le cas particulier de la généalogie, jusqu'à plus ample informé, on recherche plutôt ses ancêtres que ses descendants ! Alors, l'an 4000... Et de toute façon, comme dit Jean Claude, on va tous y passer en décembre (je ne sais plus à quelle heure), selon les mayas.
C'était un exercice de style amusant de papydall ! | |
| | | ambroise
Nombre de messages : 264 Localisation : Haute-Savoie Date d'inscription : 29/04/2012
| Sujet: Re: Utilitaire de saisie d'une date Sam 26 Mai 2012 - 10:59 | |
| Bonjour, Voici mon petit code pour contrôler une saisie de date future : - Code:
-
annee$ = right$(date$,4) mois$ = mid$(date$,4,2) jour$ = left$(date$,2) annee_util$ = right$(text$(1),4) mois_util$ = mid$(text$(1),4,2) jour_util$ = left$(text$(1),2) aujourdhui$ = annee$+mois$+jour$ date_util$ = annee_util$+mois_util$+jour_util$
if val(date_util$) > val(aujourdhui$) then message "Vous avez entré une date du futur !"
Le code fonctionne mais voyez-vous un code plus simple ou plus intelligent ? J'ai remarqué dans l'aide de Panoramic que la fonction date$ affichait MM/DD/YYYY . Alors que date$ affiche bien à la française DD/MM/YYYY | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Utilitaire de saisie d'une date Sam 26 Mai 2012 - 14:23 | |
| Klaus à dit: - Citation :
- C'est amusant, ces réflexions sur une routine générale pouvant vérifier n'importe quelle date. Pour cela, on trouve facilement des algorithmes sur le net (Google est mon ami...). Mais est-ce vraiment utile ?
Certes c'était pas le but, mais tout de même cet échange nous a appris beaucoup de choses sur le calcul des années bissextiles et s'est déroulé dans un climat de bonne humeur.... @Ambroise, j'ai beaucoup de choses à faire ce WE. Je regarderais ton code en début de semaine. A+ | |
| | | ambroise
Nombre de messages : 264 Localisation : Haute-Savoie Date d'inscription : 29/04/2012
| Sujet: Re: Utilitaire de saisie d'une date Sam 26 Mai 2012 - 15:33 | |
| - Klaus a écrit:
- ... Donc, des dates au maximum entre (aujourd'hui-200 ans) et (aujourd'hui+200 ans) ?
Ah non ! Le généalogiste ne se limite pas dans le passé. Et les données doivent être saisies minutieusement si on veut que les recherches informatiques ultérieures dans les tableurs aboutissent. @Jean Claude Bonnes et saines occupations durant ce long we de Pentecôte ! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Utilitaire de saisie d'une date Sam 26 Mai 2012 - 19:08 | |
| Salut tout le monde. Le problème initial était de saisir une date valide dans un formulaire par exemple. Nous sommes allés assez loin et c’est amusant avant d’être utile ! On a échangé des messages dans une ambiance de bonne humeur. Mais pour être pratique, je pense qu’on doit prendre en considération qu’une année dont le millésime est divisible par 4, non divisible par 100, divisible par 400 est bissextile. C’est largement suffisant. Si j’ai évoqué qu’il ne doit pas être divisible par 4000 (j’ai trouvé l’information sur internet) c’est dans un esprit humoristique (et sans doute du point de vue théorique !) Et non pratique. Alors, si vous estimez que vous irez au delà de l’année 4000 (voir 8000,12000) vous savez comment procéder ! | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Utilitaire de saisie d'une date Sam 26 Mai 2012 - 21:02 | |
| | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| | | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Utilitaire de saisie d'une date Dim 27 Mai 2012 - 7:06 | |
| Bonjour à tous et à Ambroise, J'ai pensé que au lieu de saisir la date au format jj/mm/aaaa, et qu'en utilisant 3 edit dans lesquels on ne saisirai que les chiffres des jours pour le premier, des mois pour le second et de l'année pour le dernier ce serait plus simple à programmer et plus simple d'utilisation. Ainsi l'utilisateur n'a pas les slash à saisir. Dès qu'on a saisi les 2 chiffres du jour, on donne le focus au mois, puis à l'année. J'ai vite fait la structure du code, mais je n'ai pas le temps d'implémenter les tests car je travaille sur autre chose. Si quelqu'un veut bien complèter le code dans mon esprit, sinon je verrais plus tard. - Code:
-
label verif1,verif2,verif3 edit 1:left 1,200:top 1,50:width 1,20:on_change 1,verif1 edit 2:left 2,240:top 2,50:width 2,20:on_change 2,verif2 edit 3:left 3,280:top 3,50:width 3,40:on_change 3,verif3 alpha 4:left 4,200:top 4,25:caption 4,"FORMAT DATE JJ/MM/AAAA" alpha 5:left 5,225:top 5,55:caption 5,"/" alpha 6:left 6,265:top 6,55:caption 6,"/" set_focus 1 end
verif1: ' routine de vérification des jours return verif2: ' routine de vérification des mois return verif3: ' routine de vérification des années return
A+ | |
| | | ambroise
Nombre de messages : 264 Localisation : Haute-Savoie Date d'inscription : 29/04/2012
| Sujet: Re: Utilitaire de saisie d'une date Dim 27 Mai 2012 - 8:56 | |
| C'est la solution de Jean Claude. Pour le contrôle du 28 et du 29 février qui dépend de l'année entrée puis du mois entré., il faut commencer par un edit sur l'année, puis un edit sur le mois et un edit sur le jour. La question n'est pas d'entrer la date, la question est de contrôler automatiquement les entrées utilisateur afin qu'il rentre à coup sûr une date valide. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Utilitaire de saisie d'une date Dim 27 Mai 2012 - 13:08 | |
| A mon tour de mettre mon grain de sel. Dans mon code, on saisit le jour, puis le mois (je dernier jour du mois est alors automatiquement ajusté si besoin), puis on saisit l'année. En quittant l'année (ici, par le bouton Valider, mais ça peut être autre chose), on contrôle l'année bissextile et on ajuste éventuellement le dernier jour du mois de février. L'année étant saisie, si l'on revient sur la date ou le mois, le contrôle de l'année bissextile se fait aussi. - Code:
-
' saisie de date par Klaus
label ch_mois, val_date, bisextile
dim i%, nj%, j_mois%(12), s$, a%, f% data 31,29,31,30,31,30,31,31,30,31,30,31 for i%=1 to 12 read j_mois%(i%) next i%
' pour 31 jours nj% = 31 combo 1031 : top 1031,10 : left 1031,10 : width 1031,50 text 1031,"Jour" for i%=1 to 31 item_add 1031,str$(i%) next i%
' pour 30 jours combo 1030 : hide 1030 : top 1030,10 : left 1030,10 : width 1030,50 text 1030,"Jour" for i%=1 to 30 item_add 1030,str$(i%) next i%
' pour 29 jours combo 1029 : hide 1029 : top 1029,10 : left 1029,10 : width 1029,50 text 1029,"Jour" for i%=1 to 29 item_add 1029,str$(i%) next i%
' pour 28 jours combo 1028 : hide 1028 : top 1028,10 : left 1028,10 : width 1028,50 text 1028,"Jour" for i%=1 to 28 item_add 1028,str$(i%) next i%
' pour le mois combo 1012 : top 1012,10 : left 1012,70 : width 1012,50 text 1012,"Mois" : on_click 1012,ch_mois for i%=1 to 12 item_add 1012,str$(i%) next i%
' pour l'année edit 1099 : top 1099,10 : left 1099,130 : width 1099,40 text 1099,"Année"
' pour valider button 10 : top 10,10 : left 10,200 : caption 10,"Valider" on_click 10,val_date
end
ch_mois: off_click 1012 s$ = text$(1012) if numeric(s$)=0 text 1012,"Mois" else if val(s$)<1 text 1012,"1" else if val(s$)>12 then text 1012,"12" end_if end_if s$ = text$(1012) i% = j_mois%(val(s$)) if i%<>nj% s$ = text$(1000+nj%) if numeric(s$)=1 if val(s$)>i% then s$ = str$(i%) end_if text 1000+i%,s$ show 1000+i% hide 1000+nj% nj% = i% end_if on_click 1012,ch_mois return
val_date: if numeric(text$(1099))=0 text 1099,"Année" set_focus 1099 return end_if if text$(1012)="2" then gosub bisextile return
bisextile: f% = 0 if numeric(text$(1099))=0 f% = 1 else ' ici, on détermine si c'est une année bisextile a% = val(text$(1099)) if a%-int(a%/4)*4=0 then f% = 1 if a%-int(a%/400)*400=0 then f% = 0 ' fin de contrôle d'année bisextile: f%=1 si c'est vrai end_if if f%=0 if text$(1000+nj%)="29" text 1028,"28" else text 1028,text$(1000+nj%) end_if show 1028 hide 1000+nj% nj% = 28 else if val(text$(1000+nj%))>29 text 1029,"29" else text 1029,text$(1000+nj%) end_if show 1029 if nj%<>29 then hide 1000+nj% nj% = 29 end_if return
| |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Utilitaire de saisie d'une date Dim 27 Mai 2012 - 18:45 | |
| Salut Klaus,
j'ai regardé ton code, et j'ai du mal à m'y retrouver. Pourrais-tu me dire quelles sont les variables exploitables en sortie et comment afficher le résultat dans caption 0 par exemple.
A+
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Utilitaire de saisie d'une date Dim 27 Mai 2012 - 19:17 | |
| Voilà le programme qui met la date dans caption 0: - Code:
-
' saisie de date par Klaus
label ch_mois, val_date, bissextile
dim i%, nj%, j_mois%(12), s$, a%, f% data 31,29,31,30,31,30,31,31,30,31,30,31 for i%=1 to 12 read j_mois%(i%) next i%
' pour 31 jours nj% = 31 combo 1031 : top 1031,10 : left 1031,10 : width 1031,50 text 1031,"Jour" for i%=1 to 31 item_add 1031,str$(i%) : ' jour sur 1 ou 2 chiffres ' item_add 1031,right$("0"+str$(i%),2) : ' jour sur 2 chiffres next i%
' pour 30 jours combo 1030 : hide 1030 : top 1030,10 : left 1030,10 : width 1030,50 text 1030,"Jour" for i%=1 to 30 item_add 1030,str$(i%) : ' jour sur 1 ou 2 chiffres ' item_add 1030,right$("0"+str$(i%),2) : ' jour sur 2 chiffres next i%
' pour 29 jours combo 1029 : hide 1029 : top 1029,10 : left 1029,10 : width 1029,50 text 1029,"Jour" for i%=1 to 29 item_add 1029,str$(i%) : ' jour sur 1 ou 2 chiffres ' item_add 1029,right$("0"+str$(i%),2) : ' jour sur 2 chiffres next i%
' pour 28 jours combo 1028 : hide 1028 : top 1028,10 : left 1028,10 : width 1028,50 text 1028,"Jour" for i%=1 to 28 item_add 1028,str$(i%) : ' jour sur 1 ou 2 chiffres ' item_add 1028,right$("0"+str$(i%),2) : ' jour sur 2 chiffres next i%
' pour le mois combo 1012 : top 1012,10 : left 1012,70 : width 1012,50 text 1012,"Mois" : on_click 1012,ch_mois for i%=1 to 12 item_add 1012,str$(i%) : ' mois sur 1 ou 2 chiffres ' item_add 1012,right$("0"+str$(i%),2) : ' moisr sur 2 chiffres next i%
' pour l'année edit 1099 : top 1099,10 : left 1099,130 : width 1099,40 text 1099,"Année"
' pour valider button 10 : top 10,10 : left 10,200 : caption 10,"Valider" on_click 10,val_date
end
ch_mois: off_click 1012 s$ = text$(1012) if numeric(s$)=0 text 1012,"Mois" else if val(s$)<1 text 1012,"1" else if val(s$)>12 then text 1012,"12" end_if end_if s$ = text$(1012) i% = j_mois%(val(s$)) if i%<>nj% s$ = text$(1000+nj%) if numeric(s$)=1 if val(s$)>i% then s$ = str$(i%) end_if text 1000+i%,s$ show 1000+i% hide 1000+nj% nj% = i% end_if on_click 1012,ch_mois return
val_date: if numeric(text$(1099))=0 text 1099,"Année" set_focus 1099 return end_if if text$(1012)="2" then gosub bissextile : ' mois sur 1 ou 2 chiffres ' if text$(1012)="02" then gosub bissextile : ' mois sur 2 chiffres caption 0,"Date saisie: "+text$(1000+nj%)+"/"+text$(1012)+"/"+text$(1099) return
bissextile: f% = 0 if numeric(text$(1099))=0 f% = 1 else ' ici, on détermine si c'est une année bissextile a% = val(text$(1099)) if a%-int(a%/4)*4=0 then f% = 1 if a%-int(a%/400)*400=0 then f% = 0 ' fin de contrôle d'année bissextile: f%=1 si c'est vrai end_if if f%=0 if text$(1000+nj%)="29" text 1028,"28" else text 1028,text$(1000+nj%) end_if show 1028 hide 1000+nj% nj% = 28 else if val(text$(1000+nj%))>29 text 1029,"29" else text 1029,text$(1000+nj%) end_if show 1029 if nj%<>29 then hide 1000+nj% nj% = 29 end_if return
Je jour est accessible par le text$(1000+nj%) (nj% étant toujours 28, 29, 30 ou 31, selon le mois et l'année nissextile). Le mois est dans text$(1012), et l'année par text$(1099). En même temps, j'ai ajouté, par des commentaires, le code pour forcer le jour et le mois toujours sur 2 chiffres. Si l'on veut des jours et mois toujours sur 2 chiffres, il | |
| | | ambroise
Nombre de messages : 264 Localisation : Haute-Savoie Date d'inscription : 29/04/2012
| Sujet: Re: Utilitaire de saisie d'une date Dim 27 Mai 2012 - 20:06 | |
| Merci Klaus pour ce codage intéressant : je l'étudie. Une question : pourquoi afficher les combo avec 1 pixel de décalage les uns des autres ? Suggestion 1 : on pourrait ne proposer que les mois à 31 jours si l'utilisateur entrait le 31. Il s'apercevrait ainsi de son erreur s'il avait entré un 31 pour l'un des mois : 4, 6, 9, 11... Suggestion 2 : On pourrait peut-être utiliser la fonction modulo (mod()] à la place des lignes if a%-int(a%/4)*4=0 then f% = 1 if a%-int(a%/400)*400=0 then f% = 0 | |
| | | Contenu sponsorisé
| Sujet: Re: Utilitaire de saisie d'une date | |
| |
| | | | Utilitaire de saisie d'une date | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |