un Agenda..

Programmation d'applications complexes
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

un Agenda..

Message par Zorro »

En fait non , un debut d'Agenda :)
J'ai longuement hesité sur comment faire ça ...

notamment, la partie Calendrier ....
vu qu'un agenda , ça doit pouvoir permettre la selection d'un jour, et son changement de couleur au cas ou on ecrit un truc a ce rappeler dans ce jour

je me voyais mal barré avec le Gadget calendar ....

ensuite, il ne me restais plus qu'a soit creer un Calendrier maison, avec un Canvas .... (bof , j'aime pas le canvas :lol: :mrgreen: )
autre solution, plus simple , utiliser les boutons ... seulement c'est pareil, les boutons en Purebasic c'est plutot pas terrible pour les colorers

j'ai ressorti une vielle procedure que j'avais fait de Creations de bouton image , qui me permet de creer des bouton de toutes les couleurs , bon ... c'est parti ...

plus qu'a recupe une ou deux procedure de calcul de date... en creer quelque unes, pis utiliser une List chainée structuré pour attribuer a chaque bouton un message, une couleur en fonction et ça roule ....

le code suivant vous montre ou j'en suis (il est pas fini )
mais l'essentiel y est !

on peut choisir une année (avec les boutons flechés), le calendrier se met a jour

on peut sélectionner un jour , puis ecrire dans l'editeur , le message sera retenu...le bouton du jour changera de couleur il passera en jaune
pour dire qu'il y a un truc a lire dedans ....
si on efface tout le text, le bouton redeviens "normal"
le jour actuel est lui en bleu ... si un message se trouve dedans , il est en Orange .... (pour signaler que c'est iminent )

Si on change d'année une sauvegarde de l'année est effectuée
donc les messages réaparaitrons, les jours seront de nouveaux en surbrillance, lors du relancement du prg ou si on ré-affiche l'année

BREF , maintenant, ça retiens tout, c'est Utilisable sans problemes ..

ajout d'un systeme d'alarme pour prevenir des Rendez vous ....

Ajout du passage en Systray ....
Image



2 ICONES UTILE AU PRG (SYSTRAY)
a mettre dans le meme dossier que le prg

agenda.ico
Image

agenda2.ico

Image



COMMENT PARAMETRER UNE ALARME :
Petit retour a l'Agenda (Voir le premier Code du Topic )

j'ai adopté les procedure de chargement/Sauvegarde de Falsam (Format Json ) merci a lui

j'ai ajouté un systeme d'alerte voici comment ça marche :

comme avant on peut entrer du texte (n'oubliez pas de sélectionner le bon jour AVANT d'ecrire le texte )
ce Texte est conservé, ça peut donc servir de Journal Intime ou d'Agenda Simple , pense bete , etc .... )

pour ajouter une alerte (24 Alertes possible par jour actuellement ) voici comment procéder

dans l'editeur là ou l'on écris nos messages , il suffit de mettre une heure de déclenchement de l'Alerte entre "$"
et le message qui va avec entre "[]"

voici quelques exemples d'alerte qui marche :
pour une alerte a 22h00
$22:00$
[le message qui va s'afficher ]


mais on peut aussi bien sur le mettre sur une seule ligne comme ça
$22:59$ [message a afficher]
on peut aussi ecrire le message sur plusieurs lignes
$22:59$ [message a afficher
sur plusieurs
Lignes]
plusieurs alertes pour le meme jour

$23:44$ [message de 23:44 ]

on peut ecrire du text au milieu

$23:45$ [message de 23:45 ]

on peut meme faire ainsi :

$23:46$ <-- ceci indique l'heure de l'alerte

du text normal en plein miilieu d'une alerte
ce text n'aparaitra pas dans le message

[message de 23:46 ] <-- ceci est le message qui apparaitra a 23:46

simple non ?? :)

lorsqu'on a répondu a une alerte en refermant la boite d'alerte , celle ci se désactive
meme si on edite son heure !!! , une alerte passé est donc désactivée ..

si on veux remettre a zero les Flags et prendre en compte une modification d'une ancienne Alerte désactivée
il faut simplement apres la modification cliquer sur le bouton du jour concerné ...
cela aura pour effet de remettre les flags a zero ..et de réactiver les Alertes meme anciennes ..

Code : Tout sélectionner


;***********************************************
;Titre  :*Agenda_Projet
;Auteur  : Zorro
;Date  :20/08/2017
;Heure  :12:49:56
;Version Purebasic :  PureBasic 5.71 (Windows - x86)
;Version de l'editeur :EPB V2.64
; Libairies necessaire : Aucune
;***********************************************
; infos :
; Merci a Kernadec pour ses retours de bugs et d'idée
; Merci a Falsam pour l'ecriture/lecture  Json
Enumeration 400
		#titre
		#titre_calendar
		#bouton_avant
		#bouton_apres
		#File
		#bouton_affiche_mois
		#efface
		#win
		#scroll_area
		#Editor
		#auteur
		#titre_annee
		#font_titre
		#font_annee
		#font_mois
		#font_Tag
		#fonte_editeur
		#SysTrayIcone
		#image_icone
		#image_icone2
		#PopUp
		#bouton_av
		#bouton_ar
		#text_num_page
		#jour_selectione
		#bouton_commute_icone
		#bouton_help
		
EndEnumeration
LoadFont(#font_mois,"Arial",12,#PB_Font_Bold)
LoadFont(#font_tag,"Arial",6)
; **************************************************
; Structure Obligatoire, c'est la dedans que ce trouve tout les details de chaque bouton Gadget
; Cela  permet d'avoir les infos necessaire pour recuperer les valeurs d'un gadgets, ou modifier les valeurs du gadget
;à Â  
;é è ê
;î
;ô
;û ü ù
;ÿ
;ç 

; via les procedures Get et Set
; **************************************************
Structure gadgetZ
		x.i
		y.i
		Larg.i
		Haut.i
		Coul_ecriture.l
		coul_fond.l
		txt.s
		type_fonte.s
		taille_fonte.i
EndStructure
Global Dim gadgetZ.gadgetZ(500) ; ici dimentionner en fonction du nombre de gadget Z_button
; ***********************************************************
;- ***** Declaration ***************
Declare init_list()
Declare charge_list(annee.s)
Declare sauvegarde_list()
Declare.s get_date(bouton)
Declare bissextile(annee)
Declare nbjanvier(ldate.s)
Declare nbr_jour_mois(date.s)
Declare.b recherche_dans_list(dte)
Declare verif_alarme_text( )
Declare verif_alarme()
Declare verif_text()
Declare.s get_jour(date.s)
Declare get_jour_num(date.s)
Declare setbutton_z_color(id,coul_ecriture, coul_fond)
Declare setgadget_z_font(id, police.s)
Declare setgadget_z_text(id,txt.s)
Declare set_z_button(id_gadget)
Declare create_z_button(id_gadget, x,  y, larg, haut,coul_ecriture, coul_fond, txt.s,type_fonte.s, taille_fonte.i)
Declare calendrier (larg,haut,coul_ecriture,coul_fond,date.s)
Declare Minimize(Flag.b) 
; ********************************
Global Jo.s="Lu,Ma,Me,Je,Ve,Sa,Di"
Global Mo.s="Janvier,Fevrier,Mars,Avril,Mai,Juin,Juillet,Aout,Septembre,Octobre,Novembre,Decembre"
Global _numero_jour_depart ; le numero du jour du 01/01/ de l'annee actuelle
Global Dim DaysSelected(32) ; to return multiple days selected in a calendar
Global dte ,Position_y,j,Id_calendrier.i
Global ajout_annee
Global Mem_date ,Pos_Ascenseur.i
Global Flag_sauvegarde=#False ; permet de savoir si on commence Vierge ou si on tiens compte de la liste fabrique au chargement/lancement du prg
Global Position_mois=0
Global num_page=1 
Global Icone_statut=#true; couleur de l'icone systray par le bouton on off
; cette Structure contien le text , l'Id , et la Date de chaque jour , ainsi que le tableau des alarmes
Structure jour
		Id.i ; numero du gadget
		Date_text.s ; la date  liée au gadget
		Text.s [11]; le text associé a ce jour
		Saint.s
		Array Alarme.s(24) ; 24 Alarmes possible par jours
		Array Message_alarme.s(24)
		Array Action.b(24) ; active desactive une alarme
EndStructure
Declare.b recherche_dans_list(dte)
Declare verif_text()
Declare.s get_jour(date.s)
; ******************* on creer un element par defaut *********
Global Newlist jour.jour()
If Filesize(GetCurrentDirectory()+"Agenda.ini")>-1 ; File exist ?
		If OpenFile(#file,GetCurrentDirectory()+"Agenda.ini")
				Pos_Ascenseur.i=ReadInteger(#file)
		CloseFile(#file) ;|
		Else
				Pos_Ascenseur.i=0
		Endif
Endif
;************* Fabrication de la liste des jours ***************
init_list()
Annee.s=str(Year(Date())) ;; Recup année actuelle
Charge_list(Annee.s)
; .ico format is available only on Windows
IconeName$ = "agenda.ico" ; <-- indiquez ici un icone pour le prg dans le Systray
IconeName2$="agenda2.ico"
LoadImage(#image_icone2, IconeName2$)
LoadImage(#image_icone, IconeName$)


Global Hauteur_fenetre=600 ; Minimum 400 ;o)
LoadFont(#font_titre,"Arial",24,#PB_Font_Bold)
If OpenWindow(#win, 0, 0, 1024, Hauteur_fenetre, "Agenda_Projet",  #PB_Window_ScreenCentered|#PB_Window_Tool|#PB_Window_Invisible)
		StickyWindow(#win, #true) 
		AddSysTrayIcon(#SysTrayIcone, WindowID(#win), ImageID(#image_icone))
		SysTrayIconToolTip(#SysTrayIcone, "Agenda Projet by Zorro")
		CreatePopupMenu(#PopUp)                    ; Cree un menu Pop-Up            , CreatePopUp menu
		MenuItem(1,"Quitter.")           ; Ajout des menus                , add items
		SetGadgetFont(#PB_Default, FontID(#font_titre))
		TextGadget(#titre, 600, 10, 150, 45, "Agenda")
		SetGadgetFont(#PB_Default, #PB_Default)
		TextGadget(#auteur, 750, 30, 200, 20, "By Zorro")
		;
		ButtonGadget(#bouton_help,900,30,80,25,"Help")
		
		;
		
		;-Timer creation
		AddWindowTimer(#win, 888,2000); Actualisation affichage automatique
		AddWindowTimer(#win, 889,30000); verif alarme toute les 30 secondes
		; **********************************************
		Larg=50:Haut=40:Coul_ecriture=Rgb(0,255,0) : Coul_fond=Rgb(0,0,0)
		type_fonte.s="Arial" : taille_fonte.i=10
		; **********************************************
		Date.s="01/01/"+str(year(date()))
		Calendrier (Larg,Haut,Coul_ecriture,Coul_fond,Date.s)
		Resultat = EditorGadget(#Editor ,550, 100, 450, Hauteur_fenetre-168)
		If LoadFont(#fonte_editeur, "Arial", 12)
				SetGadgetFont(#Editor, FontID(#fonte_editeur))   ; la police par defaut est remplacee par celle chargee (Arial 16)
		EndIf
		Compteur_Ligne=GadgetHeight(#Editor)+(Gadgety(#Editor))
		create_Z_Button(#efface, GadgetX(#editor),  Compteur_Ligne,Larg, Haut,RGB(0,0,0), RGB(0,125,0), "Efface",type_fonte.s, taille_fonte.i)
		; ******************** bouton AV/AR *******************************
		create_Z_Button(#bouton_av, GadgetX(#editor)+GadgetWidth(#editor)-(Larg*2),  Compteur_Ligne,Larg, Haut,RGB(0,0,0), RGB(0,125,0), "->",type_fonte.s, taille_fonte.i)
		create_Z_Button(#bouton_ar, GadgetX(#editor)+(LArg*2),  Compteur_Ligne,Larg, Haut,RGB(0,0,0), RGB(0,125,0), "<-",type_fonte.s, taille_fonte.i)
		TextGadget(#text_num_page, GadgetX(#editor)+(GadgetWidth(#editor))/2, Compteur_Ligne+10, 20, 20, str(num_page))
		; ****** Color Foncees *********************
		SetWindowColor(#win,rgb(125,125,125))
		SetGadgetColor(#titre,#PB_Gadget_BackColor,rgb(125,125,125))
		SetGadgetColor(#auteur,#PB_Gadget_BackColor,rgb(125,125,125))
		SetGadgetColor(#text_num_page,#PB_Gadget_BackColor,rgb(125,125,125))
		SetGadgetColor(#Editor,#PB_Gadget_BackColor ,rgb(0,0,0))
		SetGadgetColor(#Editor,#PB_Gadget_FrontColor ,rgb(0,200,0))
		; une partie de la coloration se trouve dans la procedure Calendrier
		; *******************************************
		TextGadget(#jour_selectione, GadgetX(#editor), gadgetY(#editor)-20, 500, 20, "jour selectionné")
		SetGadgetFont(#jour_selectione, FontID(#font_mois))
		SetGadgetColor(#jour_selectione,#PB_Gadget_BackColor,rgb(125,125,125))
		SetGadgetColor(#jour_selectione,#PB_Gadget_FrontColor,rgb(125,255,125))
		; ********************** Preselection de Aujourd'hui**************************************
		date_du_jour.s=FormatDate("%dd/%mm/%yyyy", Date())
		Nbr_jour=nbjanvier(date_du_jour.s)
		;Debug  Nbr_jour
		SelectElement( Jour(),Nbr_jour)
		Mem_date=Nbr_jour
		SetGadgetText(#Editor,Jour()\Text.s[1])
		SetButton_Z_Color(jour()\Id.i,$0, RGB(42,145,0))
			a = Val ( StringField (date_du_jour.s,3, "/" ))
										If (bissextile( a) =#true )
												If Nbr_jour=60
														Fete.s="Auguste"
													
												Endif
												If Nbr_jour>60
														Nbr_jour=Nbr_jour-1
														Restore fetes
														for i=1 to Nbr_jour
																read.s fete.s
														Next i
												Endif
												If Nbr_jour<60
												Nbr_jour=nbjanvier(date_du_jour.s)
												Restore fetes
														for i=1 to Nbr_jour
																read.s fete.s
														Next i
												Endif
												
										Else ; pas année bissextile
												Restore fetes
												for i=1 to Nbr_jour
														read.s fete.s
												Next i
										Endif
		
		SetGadgetText(#jour_selectione,"Jour Selectionné :" +Get_jour(date_du_jour.s) +" "+date_du_jour.s+ " ST "+fete.s)
		SetGadgetFont(#jour_selectione, FontID(#font_mois))
		; ************************************************************
		State=#True
		Minimize(State)
		;-Boucle Principale
		Repeat
				event= WaitWindowEvent(10)
				select event
						Case #PB_Event_SysTray
								Select EventType()
										Case #PB_EventType_RightClick         ; Un click droit affiche le menu  , Right click display menu       
												DisplayPopupMenu(#PopUp, windowId(#win))
										Case #PB_EventType_LeftClick         ; Un click 
												State=-State
												Minimize(State) 
								EndSelect
						Case #PB_Event_Menu
								Select EventMenu()           
										Case 1 
												OpenFile(#file,GetCurrentDirectory()+"Agenda.ini")
														WriteInteger(#file,Pos_Ascenseur.i)
												CloseFile(#file) ;<
												;
												Sauvegarde_list()
												End
								EndSelect ;<
						Case #PB_Event_Timer
								;-Verif couleur bouton
								If EventTimer() = 888
										verif_text() ; active les jours qui contiennent un text
								Endif
								If EventTimer() = 889
										;- VERIF ALARME
										date_du_jour.s=FormatDate("%dd/%mm/%yyyy", Date())
										
										
										Nbr_jour=nbjanvier(date_du_jour.s)
										
										Annee_actuelle=Val(Stringfield(date_du_jour.s,3,"/"))
										SelectElement(jour(),Nbr_jour)  ; commence a 1 pas a zero
										For x=1 to 10 ; pour chaque page
												If jour()\text.s[x]<>""
														Verif_Alarme_Text( ) ; toute les 10 secondes
														Verif_alarme() ; verifie si une Alarme est a declencher aujourd'hui
												Endif
										Next x
								Endif
						Case #PB_Event_Gadget   
								if EventGadget()<367 ; on click sur un bouton
										;;SetButton_Z_Color(Mem_date, Rgb(0,255,0) ,$0)
										Get_date(EventGadget()) ; renvoi la date du jour choisi
										Mem_date=EventGadget()
										
										;**********
										; apparamment, le numero du gadget variable "Mem_date"  EST le numero du jour de l'année , mais bon on refait :
										;debug jour()\Date_text.s 
										date_du_jour.s=FormatDate("%dd/%mm/%yyyy", ParseDate("%dd/%mm/%yyyy",jour()\Date_text.s ))
										Nbr_jour=nbjanvier(date_du_jour.s)
										;debug Nbr_jour
										
										debug Nbr_jour
										a = Val ( StringField (date_du_jour.s,3, "/" ))
										If (bissextile( a) =#true )
												If Nbr_jour=60
														Fete.s="Auguste"
													
												Endif
												If Nbr_jour>60
														Nbr_jour=Nbr_jour-1
														Restore fetes
														for i=1 to Nbr_jour
																read.s fete.s
														Next i
												Endif
												If Nbr_jour<60
												Nbr_jour=nbjanvier(date_du_jour.s)
												Restore fetes
														for i=1 to Nbr_jour
																read.s fete.s
														Next i
												Endif
												
										Else ; pas année bissextile
												Restore fetes
												for i=1 to Nbr_jour
														read.s fete.s
												Next i
										Endif
										
										;**********
										
										
										SetGadgetText(#Editor,Jour()\Text.s[num_page])
										SetButton_Z_Color(jour()\Id.i,$0, RGB(42,145,0))
										SetGadgetText(#jour_selectione,"Jour Selectionné :" +Get_jour(jour()\Date_text.s) +" "+jour()\Date_text.s+ " ST "+fete.s)
										
										
										
										
										;***************** reinit les Alarmes  *************************
										For i=0 to 24
												;jour()\Action.b(i)=#True ; remet les alarme en services
										Next i
										; ************************************************************************
								Endif
								Select EventGadget()
										Case #bouton_help
												MessageRequester("Help","Pour une alerte a 22h00"+chr(10)+"$22:00$ [le message qui va s'afficher ]" + chr(10) +" On peut creer des alertes sur plusieurs lignes")
										Case #bouton_av 
												num_page=num_page+1
												If num_page>10
														num_page=1
												Endif
												SelectElement( Jour(),Mem_date)
												SetGadgetText(#text_num_page,str(num_page)) 
												SetGadgetText(#Editor,Jour()\Text.s[num_page]) 
										Case #bouton_ar 
												num_page=num_page-1
												If num_page<1
														num_page=10
												Endif
												SelectElement( Jour(),Mem_date)
												SetGadgetText(#text_num_page,str(num_page)) 
												SetGadgetText(#Editor,Jour()\Text.s[num_page]) 
										Case #bouton_affiche_mois
												sauvegarde_list()
												init_list()
												Date.s="01/01/"+str(year(date()))
												Charge_list(str(year(date())))
												Calendrier (Larg,Haut,Coul_ecriture,Coul_fond,Date.s) ; recreation du calendrier
												;
												SetGadgetAttribute(#scroll_area, #PB_ScrollArea_Y, Position_mois )
										Case #scroll_area
												Pos_Ascenseur.i=GetGadgetAttribute(#scroll_area, #PB_ScrollArea_Y )
										Case #bouton_avant
												ClearGadgetItems(#Editor) ; efface l'editeur
												; **********************************************
												Larg=50:Haut=40:Coul_ecriture=Rgb(0,255,0) : Coul_fond=Rgb(0,0,0)
												type_fonte.s="Arial" : taille_fonte.i=10
												; **********************************************
												sauvegarde_list()
												init_list()
												ajout_annee=ajout_annee-1
												Date.s="01/01/"+str(year(date())+ajout_annee)
												Charge_list(str(year(date())+ajout_annee))
												Calendrier (Larg,Haut,Coul_ecriture,Coul_fond,Date.s) ; recreation du calendrier
										Case #bouton_apres
												ClearGadgetItems(#Editor) ; efface l'editeur
												; **********************************************
												Larg=50:Haut=40:Coul_ecriture=Rgb(0,255,0) : Coul_fond=Rgb(0,0,0)
												type_fonte.s="Arial" : taille_fonte.i=10
												; **********************************************
												sauvegarde_list()
												init_list()
												ajout_annee=ajout_annee+1
												Date.s="01/01/"+str(year(date())+ajout_annee)
												Charge_list(str(year(date())+ajout_annee))
												Calendrier (Larg,Haut,Coul_ecriture,Coul_fond,Date.s) ; recreation du calendrier
										Case #editor
												;-Editor
												Select EventType()
														Case #PB_EventType_Change 
																SelectElement(Jour(), Mem_date)
																Jour()\Text.s[num_page]=GetGadgetText(#Editor) 
																verif_text() ; active les jours qui contiennent un text
																;***************** reinit les Alarmes  *************************
																For i=0 to 24
																		;jour()\Action.b(i)=#True ; remet les alarme en services
																		jour()\Alarme.s(i)="" ; eteinds l'alarme
																		Jour()\Message_alarme.s(i)="" ; efface le text de l'alarme
																Next i
																; ************************************************************************
												EndSelect
										Case #Efface
												ClearGadgetItems(#Editor) ; efface TOUTES LES PAGES DE l'editeur
												For x=1 to 10
														Jour()\text.s[x]=""
												Next x
												;***************** reinit les Alarmes  *************************
												For i=0 to 24
														;jour()\Action.b(i)=#True ; remet les alarme en services
														jour()\Alarme.s(i)="" ; eteinds l'alarme
														Jour()\Message_alarme.s(i)="" ; efface le text de l'alarme
												Next i
												; ************************************************************************
										Case #bouton_commute_icone
												Icone_statut=-Icone_statut
												
												;******************************
												;;
								EndSelect
				EndSelect
		Until event= #PB_Event_CloseWindow
		OpenFile(#file,GetCurrentDirectory()+"Agenda.ini")
				WriteInteger(#file,Pos_Ascenseur.i)
		CloseFile(#file) ;
		;
		Sauvegarde_list()
EndIf 
;-Fin
End

;
;

;-Zone Procedures
Procedure init_list()
		;-Fabrique Liste
		ClearList(Jour())
		For i=0 to 366 ; par defaut un poil plus grand pour les annees bixectile
				AddElement(Jour())
				Jour()\Id.i=0
				Jour()\Date_text.s=""
				For x=1 to 10
						Jour()\Text.s[x]=""
				Next x
		Next i
EndProcedure
;
Procedure Charge_list(Annee.s)
		Name_file.s="Agenda_"+Annee.s+".json"           
		If FileSize(GetCurrentDirectory()+Name_file.s)>-1
				LoadJSON(0, Name_file)
				ExtractJSONList(JSONValue(0), jour())
		EndIf
		;conversion()
		;***************** reinit les Alarmes  *************************
		For i=0 to 24
				;jour()\Action.b(i)=#True ; remet les alarme en services
				jour()\Alarme.s(i)="" ; eteinds l'alarme
				Jour()\Message_alarme.s(i)="" ; efface le text de l'alarme
		Next i
		; ************************************************************************
EndProcedure
;
Procedure Sauvegarde_list()
		;***************** reinit les Alarmes  *************************
		For i=0 to 24
				;jour()\Action.b(i)=#True ; remet les alarme en services
				jour()\Alarme.s(i)="" ; eteinds l'alarme
				Jour()\Message_alarme.s(i)="" ; efface le text de l'alarme
		Next i
		; ************************************************************************
		Annee.s=GetGadgetText(#titre_annee)
		Name_file.s="Agenda_"+Annee.s+".json" 
		If FileSize(GetCurrentDirectory()+Name_file.s)>-1
				CopyFile(GetCurrentDirectory()+Name_file.s,GetCurrentDirectory()+"Back_"+Name_file.s)
		Endif
		If CreateJSON(0)
				InsertJSONList(JSONValue(0), jour())
		EndIf
		SaveJSON(0, GetCurrentDirectory()+Name_file) 
		
EndProcedure
;
Procedure.s Get_date(bouton)
		;by Zorro
		If recherche_dans_list(EventGadget())=#true
				Procedurereturn jour()\Date_text.s  ; renvoi la date du bouton choisi
		Else
				ProcedureReturn ""
		Endif
EndProcedure
;
Procedure bissextile(annee)
		; annee bissextile ou pas ?
		If (annee % 4 = 0 And annee % 100 <> 0) Or annee % 400 = 0
				bissextile = #true
		Else
				bissextile = #false
		EndIf
		ProcedureReturn bissextile
EndProcedure
;
Procedure nbjanvier(ldate.s)
		;Calcul du nombre de jours par rapport au premier janvier de la date
		nbmois.s = "0,31,59,90,120,151,181,212,243,273,304,334"
		j = Val ( StringField (ldate,1, "/" ))
		m = Val ( StringField (ldate,2, "/" ))
		a = Val ( StringField (ldate,3, "/" ))
		nbjanvier = Val ( StringField (nbmois,m, "," ) )+ j
		If (bissextile( a) =#true And m > 2)
				nbjanvier = nbjanvier + 1
		EndIf
		ProcedureReturn nbjanvier
EndProcedure
;
Procedure nbr_jour_mois(date.s)
		;By Zorro
		Protected annee,i
		nbj_m.s="31,28,31,30,31,30,31,31,30,31,30,31"
		nbj_m_bi.s="31,29,31,30,31,30,31,31,30,31,30,31"
		i=val(stringfield(date.s,2,"/"))
		annee=val(stringfield(date.s,3,"/"))
		if bissextile(annee)=#False
				ProcedureReturn Val (Stringfield(nbj_m.s,i,","))
		Else
				ProcedureReturn Val (Stringfield(nbj_m_bi.s,i,","))
		Endif
EndProcedure
;
Procedure.b recherche_dans_list(dte)
		;by Zorro
		find=#false
		If ListSize(jour())>0
				Foreach jour() ; on regarde si ce jour est dans la liste
						If dte=jour()\Id.i
								find=#true
								Break
						Endif
				Next
				ProcedureReturn find
		Endif
EndProcedure
;
Procedure Verif_Alarme_Text( )
		; Verifie si une Alarme est presente dans le Text du jour Actuel
		; La liste est deja positione sur le bon jour
		ReDim jour()\Alarme.s(24)
		ReDim Jour()\Message_alarme.s(24)
		Protected txt.s ,o=0,dep=0,dep2=0
		For x=1 to 10 ; nbr_page
				For i=1 to Len(jour()\Text.s[x])
						;Ligne.s=StringField( jour()\text.s,1,chr(10))
						ppos=FindString(jour()\text.s[x],"$",dep)
						ppos_fin=FindString(jour()\text.s[x],"$",ppos)
						ppos_m=FindString(jour()\text.s[x],"[",dep2)+1
						ppos_m_fin=FindString(jour()\text.s[x],"]",ppos_m)
						If ppos>0
								jour()\Alarme.s(o)=mid(jour()\text.s[x],ppos,7)
								dep=ppos+7
								jour()\Alarme.s(o)=Trim(removeString( jour()\Alarme.s(o),"$",#PB_String_NoCase,1,2))
								If ppos_m>0
										If ppos_m_fin> ppos_m
												Jour()\Message_alarme.s(o)=mid(jour()\Text.s[x],ppos_m,(ppos_m_fin-ppos_m))
												Jour()\Message_alarme.s(o)=Trim(removeString(Jour()\Message_alarme.s(o),"[",#PB_String_NoCase))
												Jour()\Message_alarme.s(o)=Trim(removeString(Jour()\Message_alarme.s(o),"]",#PB_String_NoCase))
												dep2=ppos_m_fin
										Endif
								Endif
								If o>23 ; Pas plus de 24 alarmes par jours
										MessageRequester("Erreur","Trop d'alarmes, pour plus d'alarmes augmenter la dimension du tableau...")
										o=24
								Endif 
								o=o+1
						Endif
				Next i
		Next x
EndProcedure
Procedure Verif_alarme()
		; By Zorro
		; Declenche l'alarme
		Time.s=FormatDate("%hh:%ii", Date())
		For i=0 to 24; our les 24 alarmes possibles
				if ParseDate("%hh:%ii",jour()\Alarme.s(i))<= ParseDate("%hh:%ii",Time.s) and jour()\Alarme.s(i)<>""; ha... une alarme se presente
						;calldebugger
						MessageRequester("Alerte !" ,"Aujourd'hui a :"+jour()\Alarme.s(i)+chr(10)+ Jour()\Message_alarme.s(i))
						For u=0 to 10 ; pour chaque page
								If Jour()\Text.s[u]<>""
										Jour()\Text.s[u]=ReplaceString( Jour()\Text.s[u],"$ ","$") 
										Jour()\Text.s[u]=ReplaceString( Jour()\Text.s[u]," $","$")
										Jour()\Text.s[u]=ReplaceString( Jour()\Text.s[u],"$"+jour()\Alarme.s(i)+"$","-"+jour()\Alarme.s(i)+"-") ; remplace $10:00  par seulement 10:00 ce ne sera plus vu comme une alarme !
										;
										Jour()\Text.s[u]=ReplaceString( Jour()\Text.s[u],"[ ","[")
										Jour()\Text.s[u]=ReplaceString( Jour()\Text.s[u]," [ ","[")
										Jour()\Text.s[u]=ReplaceString( Jour()\Text.s[u],"["+Jour()\Message_alarme.s(i)+"]","("+Jour()\Message_alarme.s(i)+")")
										SetGadgetText(#Editor,Jour()\Text.s[u]) 
										Dim jour()\Alarme.s(24)
										Dim Jour()\Message_alarme.s(24)
										Verif_Alarme_Text( )
								Endif
						Next u
				Endif
		Next i
EndProcedure
Procedure verif_text()
		;By Zorro      
		Protected date_du_jour.i ,Nbr_jour,date_observe.i
		Protected Date_j.s
		Date_j.s=FormatDate("%dd/%mm/%yyyy", Date())
		date_du_jour.i=ParseDate("%dd/%mm/%yyyy",Date_j.s)
		SelectElement(jour(),1)  ; commence a 1 pas a zero
		While NextElement(jour())       
		date_observe.i=ParseDate("%dd/%mm/%yyyy",jour()\Date_text.s)
		Nbr_jour=jour()\id
		For x=1 to 10
				If jour()\text.s[x]<>""
						Flag_ok=#true
				Endif
		Next x
		If Flag_ok=#true
				If date_observe.i<date_du_jour.i
						SetButton_Z_Color(jour()\Id.i,RGB(0,255,0), RGB(143,0,131) ); jour Actif (Rayant un text)  mais plus ancien que la date du jour ! on dessine en violet
				ElseIf date_observe.i>date_du_jour.i ; on dessine en Jaune
						SetButton_Z_Color(jour()\Id.i,$0, RGB(254,255,141)) ; jour Actif (ayant un text) 
						
				ElseIf date_observe.i=date_du_jour.i  ; jour Actif (ayant un text)  mais etant aujourd'hui (orange )
						
						coul_ecriture=RGB(0,0,0)
						coul_fond=RGB(255,132,58)
						SetButton_Z_Color(Nbr_jour,coul_ecriture, coul_fond)
						if  Icone_statut=#true
								ChangeSysTrayIcon(#SysTrayIcone,  imageid(#image_icone2)) ;; change l'icone systray
						Else
								ChangeSysTrayIcon(#SysTrayIcone,  imageid(#image_icone)) ;; change l'icone systray
						Endif
						
				Endif
		ElseIf Flag_ok=#False And  date_observe.i=date_du_jour.i ; Jour etant Aujourd'hui sans Text (Bleu)
				Annee.s=GetGadgetText(#titre_annee)
				_Annee.i=Year(Date());
				If Val(Annee.s)=_Annee.i
						coul_ecriture=RGB(0,0,0)
						coul_fond=RGB(0,108,233)
						SetButton_Z_Color(Nbr_jour,coul_ecriture, coul_fond)
						ChangeSysTrayIcon(#SysTrayIcone,  imageid(#image_icone)) ; change l'icone systray
				Endif
		Else
				If jour()\id.i<>Mem_date 
						SetButton_Z_Color(jour()\Id.i,Rgb(0,255,0), $0) ; jour selectionné
				Endif
		Endif
		;Next
		Flag_ok=#False
Wend
EndProcedure
;
Procedure.s Get_jour(Date.s)
		;Zorro
		;Renvoi le jour de la date
		Protected J.s
		J.s="Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche"
		num_date.i=ParseDate("%dd/%mm/%yyyy", date.s)
		nnn=DayOfWeek(num_date.i) 
		If nnn=0:nnn=7:Endif
		jour.s=StringField(J.s,nnn,",")
		ProcedureReturn jour.s
EndProcedure
;
Procedure Get_jour_num(Date.s)
		; Zorro
		;Renvoi le numero du jour de la date
		Protected J.s
		J.s="Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche"
		num_date.i=ParseDate("%dd/%mm/%yyyy", date.s)
		jour=DayOfWeek(num_date.i)
		If jour=0:jour=7:Endif
		ProcedureReturn jour
EndProcedure
;
Procedure SetButton_Z_Color(id,coul_ecriture, coul_fond)
		;by Zorro
		gadgetZ(id)\Coul_ecriture= coul_ecriture
		gadgetZ(id)\coul_fond=coul_fond
		Set_Z_button(Id)
EndProcedure
;
Procedure SetGadget_Z_Font(Id, police.s)
		;by Zorro
		gadgetZ(id)\type_fonte.s=police.s
		Set_Z_button(Id)
EndProcedure
;
Procedure SetGadget_Z_text(Id,txt.s)
		;by Zorro
		gadgetZ(id)\txt.s =txt.s
		Set_Z_button(Id)
EndProcedure
;
Procedure Set_Z_button(Id_gadget)
		; By Zorro
		; permet d'activer les changements apporte dans la structure d'un Z_button
		Shared Id
		Id=Id_gadget
		Protected x,y,larg,haut,txt.s,type_fonte.s,coul_ecriture,coul_fond
		x=gadgetz(Id)\x
		y=gadgetz(Id)\y
		larg=gadgetz(Id)\Larg
		Haut=gadgetz(Id)\Haut
		coul_ecriture=gadgetz(Id)\coul_ecriture
		coul_fond=gadgetz(Id)\coul_fond
		txt.s=gadgetz(Id)\txt.s
		type_fonte.s=gadgetz(Id)\type_fonte.s
		taille_fonte.i=gadgetz(Id)\taille_fonte.i
		If Larg<=0:Larg=8:EndIf
		If Haut<=0:Haut=8:EndIf
		If Isimage
				FreeImage(Id)
		EndIf
		If IsFont
				FreeFont(Id)
		EndIf
		If type_fonte.s="" : type_fonte.s="Arial":EndIf
		If  taille_fonte.i=0: taille_fonte.i=8:EndIf
		If LoadFont(Id, type_fonte.s, taille_fonte.i)
				If CreateImage(Id, larg, haut)
						StartDrawing(ImageOutput(Id))
								DrawingMode(#PB_2DDrawing_Transparent)
								Box(0, 0,larg, haut, coul_fond)
								DrawingFont(FontID(Id))
								FrontColor(coul_ecriture)
								DrawText((Larg-TextWidth(txt))/2,(Haut-TextHeight(txt))/2,Txt.s) 
						StopDrawing()
				EndIf
		EndIf
		If IsGadget(Id)
				SetGadgetAttribute(Id, #PB_Button_Image, ImageID( Id))
		EndIf
EndProcedure
;
Procedure create_Z_Button(Id_gadget, x,  y, Larg, Haut,coul_ecriture, coul_fond, txt.s,type_fonte.s, taille_fonte.i)
		; by Zorro
		; cree un bouton image avec couleur fond+ couleur ecriture +texte
		; Id servira a donner le numero du gadget, le numero de l'image, et le numero de la fonte !!
		; si le bouton existe deja, il est efface , puis recree !
		If Larg<=0:Larg=8:EndIf
		If Haut<=0:Haut=8:EndIf
		gadgetz(Id_gadget)\x=x
		gadgetz(Id_gadget)\y=y
		gadgetz(Id_gadget)\Larg=larg
		gadgetz(Id_gadget)\Haut=Haut
		gadgetz(Id_gadget)\coul_ecriture=coul_ecriture
		gadgetz(Id_gadget)\coul_fond=coul_fond
		gadgetz(Id_gadget)\txt.s=txt.s
		gadgetz(Id_gadget)\type_fonte.s=type_fonte.s
		gadgetz(Id_gadget)\taille_fonte.i=taille_fonte.i
		Shared Id
		Id=Id_gadget
		If IsFont(Id)
				FreeFont(Id)
		EndIf
		If IsImage(Id)
				FreeImage(Id)
		EndIf
		If IsGadget(Id)
				FreeGadget(Id)
		EndIf
		If type_fonte.s="" : type_fonte.s="Arial":EndIf
		If  taille_fonte.i=0: taille_fonte.i=8:EndIf
		If LoadFont(Id, type_fonte.s, taille_fonte.i)
				If CreateImage(Id, larg, haut)
						StartDrawing(ImageOutput(Id))
								DrawingMode(#PB_2DDrawing_Transparent)
								Box(0, 0,larg, haut, coul_fond)
								DrawingFont(FontID(Id))
								FrontColor(coul_ecriture)
								DrawText((Larg-TextWidth(txt))/2,(Haut-TextHeight(txt))/2,Txt.s) 
						StopDrawing()
				EndIf
		EndIf
		ButtonImageGadget(Id,x,y,larg,Haut,ImageID( Id))
		ProcedureReturn #True
EndProcedure
;
Procedure Calendrier (Larg,Haut,Coul_ecriture,Coul_fond,Date.s)
		;By Zorro
		;-Calendrier
		;;;;ClearList(Jour())
		;
		ScrollAreaGadget(#scroll_area, 10, 100, 450,Hauteur_fenetre-168, 400, 3800, 30)
		;
		SetGadgetFont(#scroll_area, FontID(#font_tag))
		TextGadget(#titre_calendar, 1, 1, 130, 35, "Calendrier by Dobro")
		SetGadgetFont(#PB_Default, #PB_Default)
		SetGadgetColor(#scroll_area,#PB_Gadget_BackColor,rgb(125,125,125))
		; Titre Annee
		Annee.s=stringfield(date.s,3,"/")
		X_titre_annee=4*Larg-(Larg/2)
		; ********************************************************
		;Larg=50:Haut=40:Coul_ecriture=Rgb(0,255,0) : Coul_fond=Rgb(0,0,0)
		;type_fonte.s="Arial" : taille_fonte.i=10
		; **********************************************
		;Date.s="01/01/"+year(date())
		_numero_jour_depart=Get_jour_num(Date.s)
		; **********************************************
		Compteur_Ligne=Compteur_ligne+5
		Compteur_colonne=_numero_jour_depart-1
		For M=1 to 12 ; pour les 12 Mois
				Nbr_jours_mois=nbr_jour_mois("01/"+RSet(str(M),2,"0")+"/"+Annee.s)
				y_mois=(Compteur_Ligne*Haut)-Haut
				Y_jour=y_mois+(Haut/2)
				SetGadgetFont(#PB_Default, FontID(#font_mois))
				nn=TextGadget( #pb_any,X_titre_annee,y_mois,150,30,stringfield(Mo.s,M,","))
				SetGadgetColor(nn,#PB_Gadget_BackColor,rgb(125,125,125))
				If M= Month(Date()) ; le mois Actuel est en cours de fabrication 
						Position_mois= GadgetY(nn,#PB_Gadget_ContainerCoordinate)  ; on recup le y du gadget ayant le nom du mois actuel
				Endif
				SetGadgetFont( #PB_Default, #PB_Default)
				For jj=1 to 7 ; sur 7 colonnes
						nn=TextGadget( #pb_any,jj*Larg,y_jour,150,30,stringfield(Jo.s,jj,","))
						SetGadgetColor(nn,#PB_Gadget_BackColor,rgb(125,125,125))
				Next jj
				For J=1 to Nbr_jours_mois ; ici on creer les jours en fonction du mois (30 ou 31 jours )
						Compteur_jour=Compteur_jour+1
						Compteur_colonne=Compteur_colonne+1
						IF Compteur_colonne<=7
						Else
								Compteur_colonne=1
								Compteur_Ligne=Compteur_ligne+1
						Endif
						Txt.s=str(J)
						create_Z_Button(Compteur_jour, Compteur_colonne*Larg-(Larg/2),  Compteur_Ligne*Haut, Larg, Haut,coul_ecriture, coul_fond, txt.s,type_fonte.s, taille_fonte.i)
						;AddElement(jour())
						SelectElement(Jour(),Compteur_jour)
						If Jour()\text.s[x]=""
								jour()\Date_text.s =Rset(Txt.s,2,"0")+"/"+Rset(Str(M),2,"0")+"/"+Annee.s
								jour()\Id.i=Compteur_jour
						Endif
				Next J
				Compteur_Ligne=Compteur_ligne+3
		Next M
		; ********************* Date du jour **************************
		_Annee.i=Year(Date()); Annee de depart
		_Mois.i=Month(Date()); mois de depart
		_jour.i=Day(Date()); jour de depart
		date_du_jour.s=FormatDate("%dd/%mm/%yyyy", Date())
		coul_ecriture=RGB(0,0,0)
		coul_fond=RGB(0,108,233)
		Nbr_jour=nbjanvier(date_du_jour.s)
		If Val(Annee.s)=_Annee.i
				SetButton_Z_Color(Nbr_jour,coul_ecriture, coul_fond)
		Endif
		Coul_ecriture=Rgb(0,255,0)
		Coul_fond=Rgb(0,0,0)
		; ***********************************************************
		Compteur_Ligne=0
		Compteur_colonne=0
		Compteur_jour=0
		CloseGadgetList()
		; ********** boutons changement Annee ***********************************************************
		Compteur_Ligne=GadgetY(#scroll_area)-(Haut+10)
		create_Z_Button(#bouton_avant, 1*Larg-(Larg/2),  Compteur_Ligne,Larg, Haut,coul_ecriture, coul_fond, "<-",type_fonte.s, taille_fonte.i)
		create_Z_Button(#bouton_apres, 7*Larg-(Larg/2),  Compteur_Ligne , Larg, Haut,coul_ecriture, coul_fond, "->",type_fonte.s, taille_fonte.i)
		;
		If LoadFont(#font_annee,"Arial",24,#PB_Font_Bold)
				TextGadget( #titre_annee,X_titre_annee,Compteur_Ligne,150,45,Annee.s)
				SetGadgetFont(#titre_annee, FontID(#font_Annee))
		Endif
		SetGadgetColor(#titre_annee,#PB_Gadget_BackColor,rgb(125,125,125))
		SetGadgetFont( #PB_Default, #PB_Default)
		; *******************************************************************************************
		SetGadgetAttribute(#scroll_area, #PB_ScrollArea_Y , 3800) ; pour mettre a jour l'affichage
		SetGadgetAttribute(#scroll_area, #PB_ScrollArea_Y , 0)
		SetGadgetAttribute(#scroll_area, #PB_ScrollArea_Y, Pos_Ascenseur.i )
		; *********************** bouton affiche Mois ************************************
		Compteur_Ligne=GadgetHeight(#scroll_area)+(Gadgety(#scroll_area))
		create_Z_Button(#bouton_affiche_mois, 1*Larg-(Larg/2),  Compteur_Ligne,Larg, Haut,RGB(0,0,0), RGB(0,125,0), "RePos",type_fonte.s, taille_fonte.i)
		; ************************************************************************
		create_Z_Button(#bouton_commute_icone, 4*Larg-(Larg/2),  Compteur_Ligne,Larg+4, Haut,RGB(0,0,0), RGB(0,125,0), "ico_on_off",type_fonte.s, taille_fonte.i)
		
EndProcedure
Procedure Minimize(Flag.b) ; pour le systray
		If Flag = #True
				HideWindow(#Win, 1)      ; Reduit la fenetre   , Minimize window
				OpenFile(#file,GetCurrentDirectory()+"Agenda.ini")
						WriteInteger(#file,Pos_Ascenseur.i)
				CloseFile(#file)  ;<
				Sauvegarde_list()
		Else    
				HideWindow(#Win, 0)      ; Affiche la fenetre  , Display the window
		EndIf
EndProcedure





Datasection
		fetes:
		data.s "Jour de l'an","Basile","Geneviéve","Odilon","Edouard","Ephiphanie","Raymond","Lucien","Alix","Guillaume","Paulin","Tatiana","Yvette","Nina"
		data.s "rémi","Marcel","Roseline","Prisca","Marius","Sébastien","Agnès","Vincent","Barnard","Fr_de_salle","Conv_St_Paul","Paule","Angèle","Th d'aquin"
		data.s "Gildas","Martine","Marcelle","Ela","Chandeleur","Blaise","Véronique","Agathe","Gaston","Eugénie","Jacqueline","Apolline","Arnaud","N-D-Lourdes"
		data.s "Félix","Béatrice","Valentin","Claude","Julienne","Alexis","Bernadette","Gabin","Aimé","Damien","Isabelle","Lazard","Modeste","Romeo","Cendre"
		data.s "Honorine","Romain","Albin","Charles le bon","Guénolé","Casimir","Olive","Colette","Félicité","Jean de Dieu","Françoise","Vivien"
		data.s "Rosine","Justine","Rodrigue","Mathilde","Louise","Bénédiste","Patrick","Cyrille","Joseph","Printemps","Clémence","Léa","Victorien","Cath.de suede"
		data.s "Annonciation","Lara","Alberte","Gontran","Gwladys","Amédée","Benjamin","Hugues","Sandrine","Richard","Isidore","Irène","Marcellin","Baptiste"
		data.s "Julie","Gautier","Fulbert","Stanislas","Jules","Ida","Maxime","Paterne","Bernadette","Anicet","Parfait","Emma","Odette","Anselme","Alexandre","Georges"
		data.s "Fidele","Marc","Espérance","Siméon","Valérie","Catherine de sienne","Robert","fetes du travail","Boris","Phillipe","Sylvain","Judith","Prudence"
		data.s "Giséle","Victoire 45","Pacôme","Solange","Estelle","Achille","Rolande","Mathias","Denise","Honoré","Pascal","Eric","Yves","Bernardin","Constantin","Emile"
		data.s "Didier","Donatien","Sophie","Bérenger","Augustin","Germain","Géraldine","Ferninand","Périne","Justin","Blandine","Kévin","Clotilde","Igor","Norbert","Gilbert"
		data.s "Médard","Diane","Landry","Barnabé","Guy","Antoine","Valérie","Germaine","Régis","Hervé","Armand","Romuald","Sylvére","Eté","Alban","Audrey","Jean","Prosper"
		data.s "Anthelme","Fernand","Irenée","Pierre/Paul","Martial","Thierry","Martinien","Thomas","Florent","Antoine","Mariette","Raoul/Tristan","Thibault","Amandine","Ulrich","Benoit"
		data.s "Olivier","Henri/Joël","Fête Nationale","Donald","Carmen/Camelia","Charlotte","Frédéric","Arsène","Marina","Victor","Madeleine","Brigitte","Christine","Jacques"
		data.s "Anne","Nathalie","Samson","Marthe","Juliette","Ignace","Alphonse","Julien","Lydie","Jean-Marie","Abel","Sauveur","Gaetan","Dominique","Amour","Laurent","Claire"
		data.s "Clarisse","Hippolyte","Evrard","Marie","Armel","Hyacinthe","Hélène","Heudes","Bernard","Christophe","Fabrice","Rose","Barthélémy","Louis","Nathacha","Monique"
		data.s "Augustin","Sabine","Fiacre","Aristide","Gilles","Ingrid","Grégoire","Rosalie","Bertin","Bertrand","Reine","Adrien","Alain","Inès","Patient","Apollinaire","Aimé","Cyprien"
		data.s "Roland","Edith","Renaud","Nadège","Emilie","Eustache","Mathieu","Maurice","Automne","Anatole","Solenn/Aurélie","Damien","Adolphe","Lucas","Michel","Jérome"
		data.s "thérese","Léger","Gérard","Aurore/roxanne","Fleur","Bruno","Serge","Murielle","Denis","Ghislain","Firmin","Félix","Géraud","Juste","Théodore","Edwige","Baudoin/Solenn"
		data.s "Luc","René","Adeline","Céline","Elodie","Elfi/Ode","Florentin","Crépin","Dimitri","Emeline","Simon","Narcisse","Bienvenue","Quentin/Halloween","Toussaint","Défunts"
		data.s "Hubert","Charles","Sylvie","Léonard","Carine","Geoffroy","Théodore","Léon","Armistice 14-18","Christian/Tristan","Brice","Sidoine","Albert/Malo","Marguerite","Elisabeth","Aude","Tanguy"
		data.s "Edmond","Maur","Cécile","Clément","Flora","Catherine","Delphine","Maxime","Eode","Saturnin","André","Florence","Vivianne","Xavier","Barbe","Gérald","Nicolas"
		data.s "Ambroise","Im Conception","Léocardie","Romaric","Daniel","Corentin","Lucie","Odille","Ninon,","Alice","Gaël","Gatien","Urbain","Théophile","Hiver","Françoise/Xaviere"
		data.s "Armand","Adèle","Noël","Etienne","Ivan/Yannick","Innocents","David","Roger","Sylvestre" ,"-"
EndDataSection

; Epb

Dernière modification par Zorro le mer. 21/oct./2020 11:03, modifié 38 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: un Agenda...ou presque

Message par Marc56 »

Je ne code plus qu'il disait :mrgreen: ...
... juste quelques centaines de lignes pour la digestion ? :lol:
Mais on aime bien car c'est souvent des trucs originaux et abondamment commentés. Merci 8)
(c'est grâce à un de tes codes que j'ai compris comment extraire les tags MP3 sans code spécial)
notamment, la partie Calendrier ....
vu qu'un agenda , ça doit pouvoir permettre la selection d'un jour, et son changement de couleur au cas ou on ecrit un truc a ce rappeler dans ce jour
je me voyais mal barré avec le Gadget calendar ....
CalendarGadget()
:arrow: SetGadgetItemState(): Fait apparaître une date donnée en gras (Windows seulement).
:oops: Bon d'accord, c'est moins visible que de colorer toute la case

Cela dit, beau boulot, comme d'hab' Merci ça nous permet d'apprendre des trucs

:P
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: un Agenda...ou presque

Message par Zorro »

Merci ,
j'avais bien etudié le calendar, mais effectivement, trop limite
il y a moyen de le colorer aussi ,a coup d'API mais pas les jours individuellement
plutot l'ensemble, le titre, les jours ensemble , mais pour les besoin d'un agenda ça le fait pas :)

il y a eu d'autres exemple fait sur le Forum anglais
notamment celui ci , le gars utilise un Canvas :

exemple de Calendrier "Graphique"

Code : Tout sélectionner

; - this version will let you select more than one day but requires the
;    addition of a global array [DaysSelected(32)] to return the multiple days.
; - if no day is selected 0 is returned (like arrows etc)
; - left-click to select day
; - right-click to add day or de-select day
; - multiple selections are sorted into date order
; - change start day of week in WeekStarts=0 for Sunday or 1 for Monday
; - moving to new month does not show any selected day
; - negative date will not show day to be selected
; - each procedure has version number

Global Dim DaysSelected(32) ; to return multiple days selected in a calendar

EnableExplicit
Enumeration
    #calendar1
    #calendar2
    #calendar3
    #calendar4
    #calendar5
    #calendar6
    #window1
EndEnumeration
Define event,id,etype,dte

Procedure DrawCanvasCalendar(id,dte,add) ; vers 1.3
    ;options
    Protected weekstarts=1 ; =Sunday 1=Monday [must be set the same as in DoCanvasCalendarEvent()!]
    Protected showothermonths=1 ; 1=will show other days than just this month ; 0=noshow
    Protected fontloaded=20 ;  & fontloaded+1 ; font id value must be greater than all other font ids in program!
    ;color palette
    Protected backgroundcolor=$FFFFFF ; background color of calendar (white)
    Protected headingcolor=$D1B18D ; color of box under month name (blue)
    Protected buttoncolor=$EBDECF ; lighter shade of headingcolor for buttons (button center is headingcolor)
    Protected boxcolor=$dddddd ; empty day box color (gray)
    Protected selecteddaycolor=$9999ff ; selected day box color (red)
    Protected todaycolor=$99ff99 ; today's day box color (green)
    ;
    Protected showday=1 ; re-set below as 0=neg date / 1=pos date default (do not change!)
    If abs(dte)<2000
        MessageRequester("Drawing calendar...","not a valid date "+Str(dte))
        ProcedureReturn 0
    ElseIf dte<-1 ; will be this is new month (so no day shown selected)
        showday=0 : dte=Abs(dte)
    EndIf
    Protected month=Month(dte),day=Day(dte),year=Year(dte)
    Protected lmonth,lyear=year,lmonthend ; lastmonth
    Protected w,h,bw,headingheight,headingwidth,cornerrounding
    Protected boxw,boxh,boxoffset,boxtop
    Protected monthoffset,monthend,weeks
    Protected x,xw,y,incr,cnt,txt$ ; reused
    Protected Dim MonthName.s(12)  ; rem out if you've already dim array globally (4 lines)
    For x=1 To 12
        MonthName(x)=Trim(Mid("        January  February March    April    May      June     July     August   SeptemberOctober  November December ",x*9,9))
    Next
    Protected Dim DayName.s(7)
    For x=1+WeekStarts To 7+WeekStarts
        DayName(x-WeekStarts)=Mid(" SuMoTuWeThFrSaSu",x*2,2)
    Next
   
    w=GadgetWidth(id)
    h=GadgetHeight(id)
    bw=2 ; border width from outline
    ;calculate heading size
    headingheight=h*0.15  ; heading is about 15% of total height of gadget
    headingwidth=w-(bw*6) ; full width of gadget less borders
    cornerrounding=30 ; amount of corner rounding
    ;try to load correct font size?
    Select headingwidth*0.8 ; approx 80% of title area is availiable for text (a guess)
    Case 1 To 130  ;  used Arial because it look good small ; change the font and all sizes will have to be adjusted!
        LoadFont(fontloaded,"Arial",12)
        LoadFont(fontloaded+1,"Arial",10)
    Case 1 To 200
        LoadFont(fontloaded,"Arial",14)
        LoadFont(fontloaded+1,"Arial",12)
    Default
        LoadFont(fontloaded,"Arial",18)
        LoadFont(fontloaded+1,"Arial",16) 
    EndSelect
    ;calculate box size
    boxoffset=bw*3 : boxw=(w-(boxoffset+boxoffset))/7
    boxtop=h*0.3 ; approx 30% of top area is Month title + day names
    ;find days in month
    monthoffset=DayOfWeek(Date(year,month,1,0,0,0))-WeekStarts : If monthoffset<0 : monthoffset=6 : EndIf
    ;monthend=MonthDays(month) ; use if you've already dim array globally (delet next 5 lines)
    monthend=31
        While Date(year,month,monthend,0,0,0)=-1
            monthend-1
        Wend
            If monthend<28 : MessageRequester("monthend=",Str(monthend)) : EndIf ; error checking
        If monthoffset+monthend>35 : weeks=6 : Else : weeks=5 : EndIf ; how many rows of weeks
    lmonth=month-1 : If lmonth<1 : lmonth=12 : lyear-1 : EndIf
    ;lmonthend=MonthDays(lmonth) ; use if you've already dim array globally (delet next 5 lines)
    lmonthend=31
        While Date(lyear,lmonth,lmonthend,0,0,0)=-1
            lmonthend-1
        Wend
            If lmonthend<28 : MessageRequester("lmonthend=",Str(lmonthend)) : EndIf ; error checking
    ;depending on number of weeks ; find day box height
    boxh=(h-boxtop-bw-bw)/weeks
    StartDrawing(CanvasOutput(id))
        If add=0 ; new date so re-draw month
            If GetWindowColor(GetActiveWindow())=-1
                DrawingMode(#PB_2DDrawing_AlphaChannel)
                Box(0,0,w,h,RGBA(0,0,0,0)) ; transparent background
                DrawingMode(#PB_2DDrawing_AlphaBlend)
                RoundBox(bw,bw,w-bw-bw,h-bw-bw,w/cornerrounding,h/cornerrounding,RGBA(Red(backgroundcolor),Green(backgroundcolor),Blue(backgroundcolor),255))
                DrawingMode(#PB_2DDrawing_Default)
            Else
                Box(0,0,w,h,GetWindowColor(GetActiveWindow())) ; blank
                RoundBox(bw,bw,w-bw-bw,h-bw-bw,w/cornerrounding,h/cornerrounding,backgroundcolor)
            EndIf
            ;solid color box in heading
            RoundBox(bw*3 , bw*3 , headingwidth , headingheight , w/cornerrounding,h/cornerrounding,headingcolor) ; title box
            ;left arrow
            x=(bw*3)+(headingwidth*0.1) : y=(bw*3)+(headingheight/2)
            xw=headingheight*0.2 ; radius of circle
            Circle(x,y,xw,buttoncolor) ; lighter color
            incr=xw*0.6 ; draw arrow proportionally (incr=width of arrow is 1/2 height)
            x-(incr/2) ; y is unchanged
            Line(x,y,incr,-incr,headingcolor)
            Line(x+incr,y-incr,1,incr*2,headingcolor)
            Line(x+incr,y+incr,-incr,-incr,headingcolor)
            FillArea( x+1,y,headingcolor,headingcolor)
            ;right arrow
            x=(bw*3)+(headingwidth*0.9) ; y is unchanged
            Circle(x,y,xw,buttoncolor)
            x-(incr/2) : y=y
            Line(x,y-incr,1,incr+incr,headingcolor)
            Line(x,y+incr,incr,-incr,headingcolor)
            Line(x+incr,y,-incr,-incr,headingcolor)
            FillArea( x+1,y,headingcolor,headingcolor)
            ;outlined boxes
            DrawingMode(#PB_2DDrawing_Outlined)
            RoundBox(bw,bw,w-bw-bw,h-bw-bw,w/cornerrounding,h/cornerrounding,headingcolor)
            ; month name
            DrawingMode(#PB_2DDrawing_Transparent)
            DrawingFont(FontID(fontloaded))
            txt$=MonthName(month)+" '"+Right(Str(year),2) ; entire heading text (eg. Month '11)
            x=(w/2)-(TextWidth(txt$)/2) : y=(bw*3)+((headingheight-TextHeight(txt$))/2)
            DrawText(x,y,txt$,0)
            ; day text size
            DrawingFont(FontID(fontloaded+1))
            y=(bw*2)+headingheight+bw
            For x=0 To 6
                DrawText(boxoffset+(x*boxw)+4,y,DayName(x+1),0)
            Next
            ;put in day boxes
            cnt=7*weeks
            For xw=1 To cnt ; 7*weeks
                x=xw : While x>7 : x-7 : Wend
                x=boxoffset+((x-1)*boxw)
                y=boxtop+(((xw-1)/7)*boxh)
                If xw>monthoffset And xw<=monthoffset+monthend
                    If xw-monthoffset=day And showday
                        Box(x,y,boxw-1,boxh-1,selecteddaycolor)
                    Else
                        Box(x,y,boxw-1,boxh-1,boxcolor)
                    EndIf
                    DrawText(x+2,y+2,Str(xw-monthoffset),0)
                Else
                    If showothermonths
                        If xw>monthoffset+monthend
                            DrawText(x+2,y+2,Str(xw-monthoffset-monthend),$999999) ; grayed out text
                        Else
                            DrawText(x+2,y+2,Str(xw+lmonthend-monthoffset),$999999)
                        EndIf
                    EndIf
                EndIf
                If xw-monthoffset=Day(Date()) And month=Month(Date()) And year=Year(Date())
                    If xw-monthoffset=day And showday
                        Box(x,y,boxw-1,boxh-1,todaycolor)
                        Box(x+2,y+2,boxw-5,boxh-5,selecteddaycolor)
                    Else
                        Box(x,y,boxw-1,boxh-1,todaycolor)
                    EndIf
                    DrawText(x+2,y+2,Str(xw-monthoffset),0)
                EndIf
            Next
            If showday
                DaysSelected(0)=1 ; number of days selected
                DaysSelected(DaysSelected(0))=Date(year,month,day,0,0,0)
            Else ; when changing months and no day shows then don't add day to array
                DaysSelected(0)=0
            EndIf
        Else ; add=1 so just draw day box
            DrawingMode(#PB_2DDrawing_Transparent)
            DrawingFont(FontID(fontloaded+1))
            x=(monthoffset+day)
                While x>7 : x-7 : Wend
            x=boxoffset+((x-1)*boxw)
            y=boxtop+(((monthoffset+day-1)/7)*boxh)
            ; see if already in DaysSelected array
            xw=0 ; xw=found which item
            For incr=1 To DaysSelected(0)
                If DaysSelected(incr)=dte : xw=incr : EndIf ; could use a Break here
            Next
            If xw=0 ; not in list so add
                Box(x,y,boxw-1,boxh-1,selecteddaycolor)
                DaysSelected(0)+1 ; number of days selected
                DaysSelected(DaysSelected(0))=Date(year,month,day,0,0,0)
            Else ; already in list so delete
                cnt=0
                For incr=1 To DaysSelected(0) ; take day out
                    If DaysSelected(incr)<>DaysSelected(xw)
                        cnt+1 : DaysSelected(cnt)=DaysSelected(incr)
                    EndIf
                Next
                DaysSelected(0)-1
                Box(x,y,boxw-1,boxh-1,boxcolor)
            EndIf
            ;sort dates into order (Bubble sort)
            Repeat
                incr=0
                For cnt=0 To DaysSelected(0)-1
                    xw=cnt+1
                    If DaysSelected(cnt) > DaysSelected(xw)
                        Swap DaysSelected(cnt),DaysSelected(xw)
                        incr+1
                    EndIf
                Next
            Until incr=0
            DrawText(x+2,y+2,Str(day),0)
        EndIf
    StopDrawing()
    ; carry date along
    SetGadgetData(id,Date(year,month,day,0,0,0))
EndProcedure

Procedure DoCanvasCalendarEvent(id,clicktype) ; vers 1
    Protected weekstarts=1 ; must be same as in DrawCanvasCalendar()
    ;be sure definitions are the same as in DrawCanvasCalendar()
    Protected month=Month(GetGadgetData(id))
    Protected day=Day(GetGadgetData(id))
    Protected year=Year(GetGadgetData(id))
    Protected w=GadgetWidth(id),h=GadgetHeight(id),bw=2
    Protected mx = GetGadgetAttribute(id, #PB_Canvas_MouseX)
    Protected my = GetGadgetAttribute(id, #PB_Canvas_MouseY)
    Protected dte ; return date of what day was clicked
   
    ;calculate box size
    Protected boxoffset=bw*3
    Protected boxw=(w-(boxoffset+boxoffset))/7
    Protected boxtop=h*0.3 ; 30% of top area is for Month text and day names
    ;calculate how many days in month
    Protected monthoffset=DayOfWeek(Date(year,month,1,0,0,0))-weekstarts : If monthoffset<0 : monthoffset=6 : EndIf
    Protected monthend=31
        While Date(year,month,monthend,0,0,0)=-1 ; find number of days in month
            monthend-1
        Wend
        If monthend<28 : MessageRequester("",Str(monthend)) : EndIf ; error checking
    Protected weeks ;calculate weeks so can find box height
    If monthoffset+monthend>35 : weeks=6 : Else : weeks=5 : EndIf ; how many rows of weeks
    Protected boxh=(h-boxtop-bw-bw)/weeks
   
    ;find circle center
    Protected headingheight=h*0.15 ; 15%
    Protected headingwidth=w-(bw*6)
    Protected xw=headingheight*0.2  ; radius of circle
    Protected y=(bw*3)+(headingheight/2) ; either circle center
    Protected x ; either circle center
   
    If my<boxtop ; in top area
        If my>y-xw And my<y+xw ; on button row
            x=(bw*3)+(headingwidth*0.1)+1 ; left button center+1
            If mx=>x-xw And mx<=x+xw
                month-1 : day=1
                If month<1 : month=12 : year-1 : EndIf
                dte=Date(year,month,day,0,0,0)
                DrawCanvasCalendar(id,-dte,0)
            EndIf
            x=(bw*3)+(headingwidth*0.9)+1 ; right button center+1
            If mx=>x-xw And mx<=x+xw
                month+1 : day=1
                If month>12 : month=1 : year+1 : EndIf
                dte=Date(year,month,day,0,0,0)
                DrawCanvasCalendar(id,-dte,0)
            EndIf
        EndIf
        dte=-1
    Else ; calendar
        dte=-1
        x=((mx-boxoffset)/boxw)+1
        y=(my-boxtop)/boxh
        day=((y*7)+x)-monthoffset
        If clicktype=#PB_EventType_LeftButtonDown
            Debug "Left"
            If day>0 And day<=monthend
                dte=Date(year,month,day,0,0,0)
                DrawCanvasCalendar(id,dte,0) ; 0=draw month again (don't add day)
            EndIf
        ElseIf clicktype=#PB_EventType_RightButtonUp ; #PB_EventType_RightButtonDown
            Debug "Right"
            If day>0 And day<=monthend
                dte=Date(year,month,day,0,0,0)
                DrawCanvasCalendar(id,dte,1) ; 1=add day to month (don't draw month again)
            EndIf
        EndIf
    EndIf
    ProcedureReturn dte
EndProcedure

If OpenWindow(#window1, 220, 50, 750, 640, "Canvas Calendar", #PB_Window_SystemMenu )
    SetWindowColor(#Window1,$555555)
    CanvasGadget(#calendar1,10,10,170,120)
    DrawCanvasCalendar(#calendar1,-Date(),0) ; date is neg so will not appear selected (just todays date)
    CalendarGadget(#calendar2,10,140,170,120)
   
    CanvasGadget(#calendar3,10,270,200,170)
    DrawCanvasCalendar(#calendar3,-Date(),0) ; date is neg so will not appear selected (just todays date)
    CalendarGadget(#calendar4,10,450,200,170)
   
    CanvasGadget(#calendar5,240,10,300,240)
    DrawCanvasCalendar(#calendar5,Date(2011,4,3,0,0,0),0) ; if date is negative then month will be empty
    CalendarGadget(#calendar6,240,260,300,240,Date(2011,4,3,0,0,0))
   
    Repeat
        event=WaitWindowEvent()
        Select event
        Case #PB_Event_Gadget
            id=EventGadget()
            etype=EventType()
            Select id
            Case #calendar1,#calendar3,#calendar5
                Select etype
                Case #PB_EventType_LeftButtonDown
                    dte=DoCanvasCalendarEvent(id,etype)
                    If dte>-1
                        Debug "Last date left clicked:"+FormatDate("%yyyy-%mm-%dd",dte)
                    Else
                        Debug "No day clicked."
                    EndIf
                Case #PB_EventType_RightButtonUp ; #PB_EventType_RightButtonDown
                    dte=DoCanvasCalendarEvent(id,etype)
                    If dte>-1
                        Debug "Last date right clicked:"+FormatDate("%yyyy-%mm-%dd",dte)
                        Debug "Number in array="+Str(DaysSelected(0))
                        For etype=1 To DaysSelected(0)
                            Debug Str(etype)+" "+FormatDate("%yyyy-%mm-%dd",DaysSelected(etype))
                        Next
                    Else
                        Debug "No day clicked."
                    EndIf
                EndSelect
            EndSelect
        EndSelect
    Until event=#PB_Event_CloseWindow
EndIf

mais j'ai voulu faire un calendrier a ma sauce , comme ça je comprends mieux le code :lol:

de plus, son code représente un calendrier ou il faut utiliser les fleches pour changer de mois
perso j'avais besoin d'un calendrier qui montre l'ensemble de l'année ... :)

je reposterai le code de mon calendrier Seul
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: un Agenda...ou presque

Message par Kwai chang caine »

Un bon début pour le cavalier qui s'en va hors de la nuit
Jolis aussi ceux de l'inconnu anglais...

C'est cool de regarder les calendriers...ça passe le temps :mrgreen:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: un Agenda..

Message par Zorro »

Modification de mon code (le premier de ce topic )

maintenant, l'agenda est sauvée, avec tout ce qu'on a entré comme texte
Seulement les jours concernés sont sauvés ....
j'ai choisi de sauver par Année ... ce qui en fait devrai donner des fichiers Txt
ayant pour nom "Agenda_2017.txt" .... "Agenda_2018.txt"
ce format est donc éditable puisque j'utilise une ligne par variable....

je genere aussi un deuxieme fichier "Agenda.ini" pour sauver les parametres technique du prg
en l’occurrence, la position vertical de l'ascenseur .. pour retrouver la meme position au lancement du prg

ps: au lancement le prg affichera toujours l'Année en cours ..


en l'etat il est utilisable :)

bon test :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: un Agenda..

Message par Zorro »

Correction d'un Bug, qui empêchait la relecture
du texte sur plusieurs Lignes ...

notez qu'en l’état le prg peut aussi servir de journal intime , ou de Carnet de bord ... :)

j'ai presque envie d'y ajouter la possibilité de joindre une image (photo) en plus du Texte..
Dernière modification par Zorro le sam. 26/août/2017 13:48, modifié 1 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: un Agenda..

Message par falsam »

J'ai tester et c'est plutôt pas mal. Merci.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: un Agenda..

Message par Zorro »

Merci :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: un Agenda..

Message par falsam »

Ca serait pas mal de pouvoir se positionner dans le mois en cours : Ça implique que chaque mois soit dans un wrapper (Frame ou Container par exemple)

J'ai voulu voir si c'était possible avec ce code fonctionnel.

Code : Tout sélectionner

EnableExplicit

Enumeration Font
  #FontH1
  #FontGlobal
EndEnumeration

Enumeration Window
  #MainForm  
EndEnumeration

Enumeration Month 1 Step 11 
  #Month01 
  #month12 
EndEnumeration

Enumeration OtherGadget 14
  #Year
  #Container
EndEnumeration

;Plan de l'application
Declare Start()
Declare Exit()

Start()

Procedure Start()
  Protected n, Gadget
  Protected BackgroundColor = RGB(154, 205, 50)
  
  ;Fonts
  LoadFont(#FontGlobal, "", 11)
  LoadFont(#FontH1, "", 18)
  
  SetGadgetFont(#PB_Default, FontID(#FontGlobal))
  
  OpenWindow(#MainForm, 0, 0, 800, 600, "Test positionnement", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  ;Affichage Année en cours 
  TextGadget(#Year, 20, 10, 200, 24, Str(Year(Date())))
  SetGadgetFont(#Year, FontID(#FontH1))
    
  ScrollAreaGadget(#Container, 0, 50, 800, 500, 770, 2500, 20, #PB_ScrollArea_BorderLess)  
    
    ;Affichage des 12 mois 
    For n = #Month01 To #Month12
      ContainerGadget(n, 10, (n - 1) * 200, 760, 180)
        SetGadgetColor(n, #PB_Gadget_BackColor, BackgroundColor)
      
        ;L'info qui suit affiche le mois et la position Y du ContainerGadget() 
        Gadget = TextGadget(#PB_Any, 10, 10, 200, 22, "Mois : " + n + " à la position Y : " + Str(GadgetY(n)))
        SetGadgetColor(Gadget, #PB_Gadget_BackColor, BackgroundColor)
      CloseGadgetList()
    Next
  CloseGadgetList()
  
  TextGadget(#PB_Any, 700, 570, 100, 22, "falsam")
  
  ;Positionnement sur le mois en cours 
  SetGadgetAttribute(#Container, #PB_ScrollArea_Y, GadgetY(Month(Date())))   
    
  ;Test positionnement mois 3 
  ;SetGadgetAttribute(0, #PB_ScrollArea_Y, GadgetY(3))                 
  
  ;Déclencheur(s) evenementiel(s)
  BindEvent(#PB_Event_CloseWindow, @Exit())
    
  Repeat : WaitWindowEvent() : ForEver
EndProcedure

Procedure Exit()  
  End
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: un Agenda..

Message par Zorro »

oui c'est une bonne idée :)

cependant, puisque je sauve deja la position de l'ascenseur lorsqu'on quitte le prg
et donc on retrouve la meme position lorsqu'on relance le prg

j'ai ajouté un bouton [RePos] , pour forcer la reposition du calendrier au mois en cours ...

je n'ai pas eu besoin de faire des container pour ça
puisque au moment de la fabrication du calendrier , je connais les mois, et les jours
il m'a suffit de creer un variable "Position_mois" avec le code :

Code : Tout sélectionner

If M= Month(Date()) ; le mois Actuel est en cours de fabrication 						
	Position_mois= GadgetY(nn,#PB_Gadget_ContainerCoordinate)  ; on recup le y du gadget ayant le nom du mois actuel
Endif
qui recupere en fait la position Y du gadget "Titre " du mois

pour connaitre la position du mois en cours
par la suite j'ai du proceder a une sauvegarde /rechargement ,car si quelqu'un utilise le bouton [RePos]
alors qu'il regarde une autre Année , il me faut remettre l'année en cours en plus du mois :)

en principe ça marche bien :)

j'ai oublié de dire depuis la derniere version
si vous aviez deja utilisé mon code, il faut effacer tout les fichiers type "Agenda_2017.txt"
car le format a changé ,avec la nouvelle version il y a maintenant un "/++/" qui sépare les enregistrements ....
sans ça mon prg n'arrivera pas a lire l'agenda ....
Dernière modification par Zorro le sam. 26/août/2017 16:33, modifié 1 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: un Agenda..

Message par falsam »

Ok je n'avais pas vu le bouton Repos ou alors je n'avais pas pris la bonne version. Ca fonctionne. Merci.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: un Agenda..

Message par Zorro »

normal, je l'ai ajouté APRES ta suggestion :)

il faut que j'joute un autre bouton pour effacer l'editeur
car je viens de me rendre compte que si on laisse ne serai-ce qu'un seul caractere espace
ben le jour reste en jaune ... :roll:
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: un Agenda..

Message par Zorro »

ya un mystere quand meme !!

j'aimerai bien comprendre pourquoi pour le #titre (TextGadget(#titre-10, 600, 10, 130, 35, "Agenda"))
Ligne 118 , je suis obligé de mettre #titre-10 pour voir le titre s'afficher !!??
j'ai simplifié mes enumerations au maximum , et je ne comprends pas ce phénomène !!

a savoir, les boutons prennent les 366 premiers numero de gadgets....
j'ai quelques gadgets fait avec Pb_Any .... mais ça genere des nombres important en principe
il ne peut pas y avoir telescopage entre 2 gagdets .... ?? comprends pas trop ce qui se passe
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: un Agenda..

Message par falsam »

Ligne 118 , je suis obligé de mettre #titre-10 pour voir le titre s'afficher !!??
J'ai remis #PB_Any et ça fonctionne. Le titre "Agenda" apparaît bien.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: un Agenda..

Message par Zorro »

oui mais utilise la constante #titre
qui est au numero 400 dans mes enumerations , et ça ne marche plus ..
je me demande pourquoi
j'ai l'impression que PB n'aime pas les mélanges enumeration et Pb_Any
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Répondre