Kalender auf CanvasGadget Basis
Kalender auf CanvasGadget Basis
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.
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.
Re: Kalender auf CanvasGadget Basis
Willst du es nicht mal selber versuchen?
Du willst doch programmieren lernen oder nicht?
Wo liegen die Probleme, die dich an der Umsetzung hindern?
Du willst doch programmieren lernen oder nicht?
Wo liegen die Probleme, die dich an der Umsetzung hindern?
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
Re: Kalender auf CanvasGadget Basis
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.
Re: Kalender auf CanvasGadget Basis
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.
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.10 (x64)
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- 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
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
Re: Kalender auf CanvasGadget Basis
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!
Dann kann ich das mit dem Canvas probieren.
Dann kann ich das mit dem Canvas probieren.
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- 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
- CanvasGadget
+ WebGadget
+ WebGadget
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
Re: Kalender auf CanvasGadget Basis
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
Re: Kalender auf CanvasGadget Basis
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?
Mein Ziel ist es, dass ich für jedes einzelne Datum eine andere Farbe wählen kann.
Kannst du mir nochmal helfen?