TCalendar, aktueller und nächster Monat

Rund um die LCL und andere Komponenten
Antworten
zarquon
Beiträge: 12
Registriert: Mo 18. Jun 2012, 16:30

TCalendar, aktueller und nächster Monat

Beitrag von zarquon »

Hallo,

noch ne (dumme) Frage. Ne, eigentlich vier:
  • Wie sage ich einem TCalendar, bzw. zweien davon das es mir den jeweils aktuellen und den nächsten Monat anzeigen soll?
  • Lässt sich die Woche von Mo-So anzeigen statt von So-Sa?
  • Kann man dem Ding Kalenderwochen beibringen?
  • Gibt es eine Möglichkeit einen einzelnen Tag anzuklicken um mit dem Parameter Datum dann irgendwas anzustellen? So in Richtung Buchungsabfrage.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TCalendar, aktueller und nächster Monat

Beitrag von m.fuchs »

zarquon hat geschrieben:Lässt sich die Woche von Mo-So anzeigen statt von So-Sa?
DisplaySettings -> dsStartMonday aktivieren.
zarquon hat geschrieben:Kann man dem Ding Kalenderwochen beibringen?
DisplaySettings -> dsShowWeekNumbers aktivieren.
zarquon hat geschrieben:Gibt es eine Möglichkeit einen einzelnen Tag anzuklicken um mit dem Parameter Datum dann irgendwas anzustellen? So in Richtung Buchungsabfrage.
OnDayChange oder OnClick benutzen und die Property DateTime
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TCalendar, aktueller und nächster Monat

Beitrag von m.fuchs »

zarquon hat geschrieben:Wie sage ich einem TCalendar, bzw. zweien davon das es mir den jeweils aktuellen und den nächsten Monat anzeigen soll?

Code: Alles auswählen

procedure TForm1.Calendar1MonthChanged(Sender: TObject);
begin
  Calendar2.DateTime := EncodeDate(YearOf(IncMonth(Calendar1.DateTime, 1)),
                                   MonthOf(IncMonth(Calendar1.DateTime, 1)),
                                   DayOf(Calendar2.DateTime));
end;
 
procedure TForm1.Calendar2MonthChanged(Sender: TObject);
begin
  Calendar1.DateTime := EncodeDate(YearOf(IncMonth(Calendar2.DateTime, -1)),
                                   MonthOf(IncMonth(Calendar2.DateTime, -1)),
                                   DayOf(Calendar1.DateTime));
end;
Aufpassen, dieser Code hat keinerlei Prüfungen ob das neu encodierte Datum auch tatsächlich existiert. Wenn der 31 ausgewählt ist, wird es zum Beispiel zu Problemen kommen. Auf die Schnelle kann man das lösen indem an Stelle des DayOf(Calendar2.DateTime) einfach 1 setzt (und analog in der zweiten Methode beim DayOf(Calendar1.DateTime)). Dann bleibt aber halt nicht der ausgewählte Tag erhalten. Aber eine passende Prüfung, kann der geneigte Leser natürlich auch selber formulieren. :)
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TCalendar, aktueller und nächster Monat

Beitrag von Socke »

Die Funktion IncAMonth(), die von IncMonth() aufgerufen wird, verändert das Datum korrekt unter Beachtung der ganzen Bedingungen (Tage im Monat, Monate im Jahr)

Code: Alles auswählen

Calendar1.DateTime := IncMonth(Calendar2.DateTime);
// bzw. vice versa
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TCalendar, aktueller und nächster Monat

Beitrag von m.fuchs »

Socke hat geschrieben:Die Funktion IncAMonth(), die von IncMonth() aufgerufen wird, verändert das Datum korrekt unter Beachtung der ganzen Bedingungen (Tage im Monat, Monate im Jahr)

Code: Alles auswählen

Calendar1.DateTime := IncMonth(Calendar2.DateTime);
Ja, aber aufgepasst, das macht eventuell was anderes als man will. Ein Beispiel:
  • Calendar1: 12.04.2012, Calendar2: 23.05.2012
  • Calendar1 wird um einen Monat weitergeschaltet
  • Calendar1: 12.05.2012, Calendar2: 12.06.2012
Bei meinem Vorschlag hätte der Calendar2 nach dem Weiterschalten das Datum 23.06.2012. Wenn auf diese mitwandernde Tagesmarkierung verzichtet werden kann, ist deine Methode natürlich immer vorzuziehen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TCalendar, aktueller und nächster Monat

Beitrag von Socke »

m.fuchs hat geschrieben:Bei meinem Vorschlag hätte der Calendar2 nach dem Weiterschalten das Datum 23.06.2012. Wenn auf diese mitwandernde Tagesmarkierung verzichtet werden kann, ist deine Methode natürlich immer vorzuziehen.
Nun ja ... Das rechtfertigt trotzdem nicht, eine determinierte Methode mit den selben Parametern mehrmals aufzurufen. Mir sah deine Lösung nur zu kompliziert aus um wirklich verständlich zu sein.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten