Kalender auf CanvasGadget Basis

Du brauchst Grafiken, gute Programme oder Leute die dir helfen? Frag hier.
¯\_(ツ)_/¯
Beiträge: 141
Registriert: 18.08.2017 09:35

Kalender auf CanvasGadget Basis

Beitrag von ¯\_(ツ)_/¯ »

Hallöchen :)

Ich will nen Kalender erstellen aber ich habe festgestellt dass das CalendarGadget nicht so flexibel ist wie ich dachte. Ich kann nicht mal sagen dass ein bestimmtes Datum eine Farbe haben soll. Auch Google sagt es sei nicht so möglich.

Deshalb frage ich euch ob jemand Lust hat mir einen einfachen Kalender auf CanvasGadget Basis erstellen könnte? Ich habe leider keine Ahnung davon. Die Kalender Ansicht soll ganz primitiv sein und dass ich die Möglichkeit habe die Schriftfarbe und Hintergrundfarbe eines bestimmten Datums zu ändern. Mehr soll der Canvas-Kalender nicht können. Es wäre echt cool wenn jemand für mich bauen könnte. :)
Bild
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Kalender auf CanvasGadget Basis

Beitrag von Sicro »

Willst du es nicht mal selber versuchen?
Du willst doch programmieren lernen oder nicht?
Wo liegen die Probleme, die dich an der Umsetzung hindern?
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
¯\_(ツ)_/¯
Beiträge: 141
Registriert: 18.08.2017 09:35

Re: Kalender auf CanvasGadget Basis

Beitrag von ¯\_(ツ)_/¯ »

Ich bin schlecht in Mathe und weis nicht wie ich die Tage aller Monate in die richtige Ansicht bringen kann. Es soll nicht immer mit 1 anfangen sondern wie in einer normalen Kalender Ansicht z.B. mit 28 vom letzten Monat anfangen. :roll:
Bild
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Kalender auf CanvasGadget Basis

Beitrag von Andesdaf »

Ein Monat kann sich über maximal sechs verschiedene Wochen (Mo-So) erstrecken,
das heißt, du musst ein maximales Raster von 6 x 7 vorhalten. Den Wochentag
des ersten jedes Monats kannst du mit DayOfWeek() bestimmen.

Danach füllst du dein Raster mit der Anzahl der Tage des aktuellen Monats auf
(Funktionen zur Schaltjahrbestimmung etc. gibts im Forum zu finden). Wenn du
den aktuellen Monat fertig hast, füllst du die Lücken in der ersten und letzten
Woche mit den letzten bzw. ersten Tagen des Vor-/Folgemonats auf.
Win11 x64 | PB 6.00 (x64)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Kalender auf CanvasGadget Basis

Beitrag von NicTheQuick »

Mir war grad danach und deswegen hab ich dir den Matheteil abgenommen. Jetzt darfst du das Canvas bauen. :-)

Code: Alles auswählen

EnableExplicit

; Hiermit stellt man den ersten Tag der Woche ein. Ich mag Montag, deswegen eine 1
#firstDayOfTheWeek = 1

Procedure showCalendarMonth(date.q)
	Protected y.i = Year(date), m.i = Month(date)
	
	; Nimm den ersten Tag des Monats
	Protected firstDay.q = Date(y, m, 1, 0, 0, 0)
	; Berechne wie viele Tage man zurück gehen muss um auf dem ersten Tag der Woche zu landen
	Protected diff.i = -DayOfWeek(firstDay) + #firstDayOfTheWeek
	If diff > 0 : diff - 7 : EndIf
	; Berechne daraus das erste Datum auf dem Kalenderblatt
	Protected firstDayOfCalendarMonth.q = AddDate(firstDay, #PB_Date_Day, diff)

	; Nimm den letzten Tag im Monat
	Protected lastDay.q = AddDate(AddDate(Date(y, m, 1, 0, 0, 0), #PB_Date_Month, 1), #PB_Date_Day, -1)	
	; Berechne wie viele Tage man vor gehen muss um auf dem letzten Tag der Woche zu landen
	diff = (#firstDayOfTheWeek + 6 - DayOfWeek(lastDay)) % 7
	; Berechne daraus das letzte Datum auf dem Kalenderblatt
	Protected lastDayOfCalendarMonth.q = AddDate(lastDay, #PB_Date_Day, diff)

	; Mache aus der Monatszahl ein Wort	
	Protected ms.s = StringField("Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember", m, ",")
	; Nur eine Liste von Wochentagen
	Protected dList.s = "So,Mo,Di,Mi,Do,Fr,Sa"
	
	; Zeige Monat und Jahr an
	Debug ms + " - " + y
	; Zeige Liste der Wochentage als erste Zeile an
	Protected i.i, line.s = ""
	For i = 0 To 6
		line + StringField(dList, (#firstDayOfTheWeek + i) % 7 + 1, ",") + ~"\t"
	Next
	Debug line
	
	; Laufe über alle Tage des Kalenderblatts und schreibe sie raus.
	Protected day.q = firstDayOfCalendarMonth
	While day <= lastDayOfCalendarMonth
		If DayOfWeek(day) = #firstDayOfTheWeek
			If day <> firstDayOfCalendarMonth
				Debug line
			EndIf
			line = ""
		Else
			line + ~"\t"
		EndIf

		If day < firstDay Or day > lastDay
			line + "(" + Day(day) + ")"
		Else
			line + Day(day)
		EndIf
			
		day = AddDate(day, #PB_Date_Day, 1)
	Wend
	Debug line
EndProcedure

Define i.i
For i = 1 To 12
	showCalendarMonth(Date(2018, i, 4, 0, 0, 0))
	Debug ""
Next
Bild
¯\_(ツ)_/¯
Beiträge: 141
Registriert: 18.08.2017 09:35

Re: Kalender auf CanvasGadget Basis

Beitrag von ¯\_(ツ)_/¯ »

Danke Nick ich liebe dich. Du bist der beste dass du für mich das programmiert hast. Da waren schon einige Schritte notwendig um das zu ermöglichen. Und Danke für die Zwischenkommentare damit ich das besser verstehen kann. Sehr hilfreich! :allright: :)

Dann kann ich das mit dem Canvas probieren.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Kalender auf CanvasGadget Basis

Beitrag von NicTheQuick »

Du alter Schleimer, du. Viel Spaß damit :allright:
Bild
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Kalender auf CanvasGadget Basis

Beitrag von Kiffi »

- CanvasGadget
+ WebGadget

;-)

Bild

Code: Alles auswählen

EnableExplicit

; Hiermit stellt man den ersten Tag der Woche ein. Ich mag Montag, deswegen eine 1
#firstDayOfTheWeek = 1

Procedure.s GetCalendarCss()
  
  Protected ReturnValue.s
  
  ReturnValue = "<style>" + #CRLF$
  ReturnValue + "html { height: 100%; }" + #CRLF$
  ReturnValue + "body { min-height: 100%; overflow: hidden; font-family: Arial }" + #CRLF$
  ReturnValue + "table { width: 100%; height: 100%; table-layout: fixed; }" + #CRLF$
  ReturnValue + "table, th, td { border: 1px solid black; }" + #CRLF$
  ReturnValue + "td { text-align: center; }" + #CRLF$
  ReturnValue + ".inactive { color: silver; }" + #CRLF$
  ReturnValue + ".today { background-color: lightgreen; font-weight: bold}" + #CRLF$
  ReturnValue + "</style>" + #CRLF$
  
  ProcedureReturn ReturnValue
  
EndProcedure

Procedure.s showCalendarMonth(Date.q)
  
  Protected ReturnValue.s
  
  ReturnValue + "<html>" + #CRLF$
  ReturnValue + "<head>" + #CRLF$
  ReturnValue + GetCalendarCss()
  ReturnValue + "</head>" + #CRLF$
  ReturnValue + "<body>" + #CRLF$
  ReturnValue + "<table>" + #CRLF$
  
  Protected y.i = Year(date), m.i = Month(date)
  
  ; Nimm den ersten Tag des Monats
  Protected firstDay.q = Date(y, m, 1, 0, 0, 0)
  ; Berechne wie viele Tage man zurück gehen muss um auf dem ersten Tag der Woche zu landen
  Protected diff.i = -DayOfWeek(firstDay) + #firstDayOfTheWeek
  If diff > 0 : diff - 7 : EndIf
  ; Berechne daraus das erste Datum auf dem Kalenderblatt
  Protected firstDayOfCalendarMonth.q = AddDate(firstDay, #PB_Date_Day, diff)
  
  ; Nimm den letzten Tag im Monat
  Protected lastDay.q = AddDate(AddDate(Date(y, m, 1, 0, 0, 0), #PB_Date_Month, 1), #PB_Date_Day, -1)   
  ; Berechne wie viele Tage man vor gehen muss um auf dem letzten Tag der Woche zu landen
  diff = (#firstDayOfTheWeek + 6 - DayOfWeek(lastDay)) % 7
  ; Berechne daraus das letzte Datum auf dem Kalenderblatt
  Protected lastDayOfCalendarMonth.q = AddDate(lastDay, #PB_Date_Day, diff)
  
  ; Mache aus der Monatszahl ein Wort   
  Protected ms.s = StringField("Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember", m, ",")
  ; Nur eine Liste von Wochentagen
  Protected dList.s = "So,Mo,Di,Mi,Do,Fr,Sa"
  
  ; Zeige Monat und Jahr an
  ReturnValue + "<tr><th colspan='7'>" + ms + " - " + y + "</th></tr>" + #CRLF$
  ; Zeige Liste der Wochentage als erste Zeile an
  Protected i.i, line.s = ""
  For i = 0 To 6
    line + "<th>" + StringField(dList, (#firstDayOfTheWeek + i) % 7 + 1, ",") + "</th>"
  Next
  ReturnValue + "<tr>" + line + "</tr>" + #CRLF$
  
  ; Laufe über alle Tage des Kalenderblatts und schreibe sie raus.
  Protected day.q = firstDayOfCalendarMonth
  While day <= lastDayOfCalendarMonth
    If DayOfWeek(day) = #firstDayOfTheWeek
      If day <> firstDayOfCalendarMonth
        ReturnValue + "<tr>" + line + "</tr>" + #CRLF$
      EndIf
      line = ""
    Else
      line + ""
    EndIf
    
    If day < firstDay Or day > lastDay
      line + "<td class='inactive'>(" + Day(day) + ")</td>"
    Else
      
      If Day(day) = Day(Date()) And Month(day) = Month(Date()) And Year(day) = Year(Date())
        line + "<td class='today'>" + Day(day) + "</td>"
      Else
        line + "<td>" + Day(day) + "</td>"
      EndIf
      
    EndIf
    
    day = AddDate(day, #PB_Date_Day, 1)
    
  Wend
  
  ReturnValue + "<tr>" + line + "</tr>" + #CRLF$
  ReturnValue + "</table>" + #CRLF$
  ReturnValue + "</body>" + #CRLF$
  ReturnValue + "</html>"
  
  ProcedureReturn ReturnValue
  
EndProcedure

Enumeration
  #Window
  #WebGadget
EndEnumeration

OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 300, 300, "Calendar")
WebGadget(#WebGadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window), "")
SetGadgetItemText(#WebGadget, #PB_Web_HtmlCode, showCalendarMonth(Date(2018, 6, 1, 0, 0, 0)))

Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
Hygge
¯\_(ツ)_/¯
Beiträge: 141
Registriert: 18.08.2017 09:35

Re: Kalender auf CanvasGadget Basis

Beitrag von ¯\_(ツ)_/¯ »

Danke Kiffi aber jetzt habe ich schon mit Canvas angefangen und sieht erstmal so aus :

Code: Alles auswählen

EnableExplicit

; Hiermit stellt man den ersten Tag der Woche ein. Ich mag Montag, deswegen eine 1
#firstDayOfTheWeek = 1

LoadFont(0, "Courier New", 10)
LoadFont(1, "Courier New", 10, #PB_Font_Bold)

Procedure showCalendarMonth()
  Protected j
  Protected date.q
  Protected DrawTextX
  Protected DrawTextY = -10
  
  If StartDrawing(CanvasOutput(0))
    For j = Month(Date()) To 12
      date = Date(2018, j, 4, 0, 0, 0)
      
      Protected y.i = Year(date), m.i = Month(date)
      
      ; Nimm den ersten Tag des Monats
      Protected firstDay.q = Date(y, m, 1, 0, 0, 0)
      ; Berechne wie viele Tage man zurück gehen muss um auf dem ersten Tag der Woche zu landen
      Protected diff.i = -DayOfWeek(firstDay) + #firstDayOfTheWeek
      If diff > 0 : diff - 7 : EndIf
      ; Berechne daraus das erste Datum auf dem Kalenderblatt
      Protected firstDayOfCalendarMonth.q = AddDate(firstDay, #PB_Date_Day, diff)
      
      ; Nimm den letzten Tag im Monat
      Protected lastDay.q = AddDate(AddDate(Date(y, m, 1, 0, 0, 0), #PB_Date_Month, 1), #PB_Date_Day, -1)   
      ; Berechne wie viele Tage man vor gehen muss um auf dem letzten Tag der Woche zu landen
      diff = (#firstDayOfTheWeek + 6 - DayOfWeek(lastDay)) % 7
      ; Berechne daraus das letzte Datum auf dem Kalenderblatt
      Protected lastDayOfCalendarMonth.q = AddDate(lastDay, #PB_Date_Day, diff)
      
      ; Mache aus der Monatszahl ein Wort   
      Protected ms.s = StringField("Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember", m, ",")
      ; Nur eine Liste von Wochentagen
      Protected dList.s = "So,Mo,Di,Mi,Do,Fr,Sa"
      
      ; Zeige Monat und Jahr an
      DrawTextY + 20
      DrawingFont(FontID(1))
      DrawText(10, DrawTextY, ms + " - " + y, RGB(0, 0, 0), RGB(255, 255, 255))
      
      ; Zeige Liste der Wochentage als erste Zeile an
      Protected i.i, line.s = ""
      For i = 0 To 6
        line + StringField(dList, (#firstDayOfTheWeek + i) % 7 + 1, ",") + " "
      Next i
      DrawTextY + 20
      DrawText(10, DrawTextY, line, RGB(0, 0, 0), RGB(255, 255, 255))
      
      DrawingFont(FontID(0))
      
      ; Laufe über alle Tage des Kalenderblatts und schreibe sie raus.
      Protected day.q = firstDayOfCalendarMonth
      While day <= lastDayOfCalendarMonth
        If DayOfWeek(day) = #firstDayOfTheWeek
          If day <> firstDayOfCalendarMonth
            DrawTextY + 20
            DrawText(10, DrawTextY, line, RGB(0, 0, 0), RGB(255, 255, 255))
          EndIf
          line = ""
        Else
          line + " "
        EndIf
        
        If day < firstDay Or day > lastDay
          line + RSet(Str(Day(day)), 2, " ")
        Else
          line + RSet(Str(Day(day)), 2, " ")
        EndIf
        
        day = AddDate(day, #PB_Date_Day, 1)
      Wend
      DrawTextY + 20
      DrawingFont(FontID(0))
      DrawText(10, DrawTextY, line, RGB(0, 0, 0), RGB(255, 255, 255))
      DrawTextY + 20
    Next j
    StopDrawing()
  EndIf
EndProcedure

Define i

If OpenWindow(0, 0, 0, 200, 830, "Kalender", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  CanvasGadget(0, 0, 0, 200, 830, #PB_Canvas_Border)
  
  showCalendarMonth()
  
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow : EndIf
Bild
¯\_(ツ)_/¯
Beiträge: 141
Registriert: 18.08.2017 09:35

Re: Kalender auf CanvasGadget Basis

Beitrag von ¯\_(ツ)_/¯ »

Lieber NicTheQuick, kannst du mir nochmal helfen? Dein Code als Vorlage ist super aber leider krieg ich es nicht hin dass ich für jede Datum-Zahl ein DrawText machen kann. Ich habe mit meiner Variable DrawTextX versucht aber irgendwie siehts nicht so aus wie ich es haben will.

Mein Ziel ist es, dass ich für jedes einzelne Datum eine andere Farbe wählen kann.

Kannst du mir nochmal helfen?
Bild
Antworten