![]() |
Daten bei TMonthCalendar markieren
Hallo.
Ich möchte bei einem TMonthCalendar bestimmte Daten markieren. Ich habe folgenden Codeteil gefunden:
Delphi-Quellcode:
Die Probleme sind jetzt:
procedure TMainForm.mntCalendarGetMonthInfo(Sender: TObject; Month: Cardinal;
var MonthBoldInfo: Cardinal); begin if Month = 10 then mntCalendar.BoldDays([1,2,5],MonthBoldInfo); if Month = 11 then mntCalendar.BoldDays([3,21,28],MonthBoldInfo); end; 1. Ich möchte auch das Jahr überprüfen. Der 11.10.2007 soll also anders markiert werden als der 11.10.2006. YearOf(mntCalendar.Date) ist keine gute Lösung, da 3 Monate zugleich angezeigt werden und so würde bei der Anzeige des Januar 2007 der Dezember 2006 als Dezember 2007 gesehen werden, oder? 2. Ich möchte die Datumsangaben möglichst mit 2 verschiedenen Merkmalen versehen. Wie kann ich eine Zahl rot schreiben lassen oder unterlegen? 3. Wie kann ich ein dynamisches Array [1, 5, 12] während der Laufzeit erstellen? Ich möchte Daten auslesen und dementsprechend eine unbekannte Anzahl von Tagen markieren. Hat jemand Ratschläge für mich? Gruß blackdrake |
Re: Daten bei TMonthCalendar markieren
Keine eine Ahnung?
|
Re: Daten bei TMonthCalendar markieren
Hi,
zu 1)
Delphi-Quellcode:
zu 2) kein Vorschlag
if (Sender is TMonthCalendar) then
begin DecodeDate((Sender as TMonthCalendar).Date, Y, M, D); case Y of 2005 : case M of 1 : (Sender as TMonthCalendar).BoldDays(DynArrRec[0].Months[0].Days, MonthBoldInfo); 2 : (Sender as TMonthCalendar).BoldDays(DynArrRec[0].Months[1].Days, MonthBoldInfo); end; end; end; zu 3)
Delphi-Quellcode:
Hätte man mit Hilfe der Hilfe(BoldDays) und ein bischen Suchen in der DP (dynamisches Array) auch selber rauskriegen können.
type
MonthsArr = record Month: Integer; Days : Array of LongWord; end; DynCalArr = record Year : Word; Months : Array of MonthsArr; end; var DynArrRec : Array of DynCalArr; procedure TForm1.FillDynaArrayRec; begin SetLength(DynArrRec, 1); // 1 Jahr DynArrRec[0].Year := 2005; // 2005 SetLength(DynArrRec[0].Months, 2); // 2 Monate DynArrRec[0].Months[0].Month := 1; // Januar SetLength(DynArrRec[0].Months[0].Days, 4); // 4 Tage DynArrRec[0].Months[0].Days[0] := 1; DynArrRec[0].Months[0].Days[1] := 8; DynArrRec[0].Months[0].Days[2] := 17; DynArrRec[0].Months[0].Days[3] := 25; DynArrRec[0].Months[1].Month := 2; // Februar SetLength(DynArrRec[0].Months[1].Days, 1); // 1 Tag DynArrRec[0].Months[1].Days[0] := 15; end; Also, bessere Dich. Gruß |
Re: Daten bei TMonthCalendar markieren
Ich denke mal, TMonthCalendar bringt einfach nicht genügend Features mit.
Schau dich mal hier um: ![]() |
Re: Daten bei TMonthCalendar markieren
Hallo.
Wäre irgendwie blöd, wenn ich eine Fremd-VCL nur wegen verschiedenfarbiger Markierungen verwenden müsste. Aber ich guck mir mal alle Freeware's an. @Alter Mann (zu 1). Das dachte ich mir auch schon mit dem Date auslesen. Aber der Kalender zeigt ja (je nach Fenstergröße mehrere Monate nebeneinander an. Was ist, wenn ich Januar 2007 wähle und der Dezember mit angezeigt wird? Dann denkt das Programm, es würde sich um den Dezember des Jahres YearOf(x. Januar 2007) = 2007 handeln, also Dezember 2007 und die Markierungen falsch setzen. Und da das Fenster theoretisch unendlich groß werden kann, hab ich irgendwie ein Problem. Dynamische Arrays guck ich mir nach der Lösung dieses Grundproblemes an. Gruß blackdrake |
Re: Daten bei TMonthCalendar markieren
Hallo blackdrake,
sicher zeigt er je nachdem wie Groß er aufgezogen ist, mehrere Monate/Jahre an, aber immer in Zeilen und Spalten und die Matrix wird nie größer als 3x4, also 12 Monate in max. 2 Jahren. Und was viel wichtiger ist, GetMonthInfo wird zuerst immer mit dem Monat oben links aufgerufen. Damit hat man das Jahr an dem die Zählung beginnt und braucht nur noch die Monate, also 1, 2, 3 usw., mitzuzählen und die Werte zuweisen. Alles Klar? Gruß |
Re: Daten bei TMonthCalendar markieren
Hallo.
Ich komme immer noch nicht so richtig zurecht. Gehen wir mal von folgendem Beispiel aus: Das Fenster sei so groß, dass 4 Monate angezeigt werden: November 2006, Dezember 2006, Januar 2007, Februar 2007. Es wird nun beim Wechseln der Ansicht folgende Befehlsfolge ausgeführt:
Code:
Ich weiß ebenfalls das Jahr zu dem Eintrag, den ich markiert habe. Aber woher weiß ich nun, welches Jahr zu welcher Zahl gehört? Woher weiß die Funktion mntCalendarGetMonthInfo(mntCalendar, 11, ...), dass sie die erste aufgerufene ist und dass kein Monat vor Ihr dran kam? Ich möchte die Erkennung des Jahres möglichst ohne problematische Codestellen realisieren. Rein theoretisch (aber wg. Auflösung nicht praktisch) könnte ich das Fenster ja auch so groß ziehen, dass 14 Monate untereinander gezeigt werden und dann müsste ich zwischen 3 Jahren unterscheiden. Das ist so kompliziert! :( Gibts da eine einfache Lösung? Denke ich zu verdreht?
mntCalendarGetMonthInfo(mntCalendar, 11, ...);
mntCalendarGetMonthInfo(mntCalendar, 12, ...); mntCalendarGetMonthInfo(mntCalendar, 1, ...); mntCalendarGetMonthInfo(mntCalendar, 2, ...); Gruß blackdrake |
Re: Daten bei TMonthCalendar markieren
Gibts dafür jetzt keine Lösung, weil nichts kommt? Die (Freeware) VCLs von Torry.net waren alle Müll, zum Großteil nicht mal im Windows-Design.
|
Re: Daten bei TMonthCalendar markieren
Hi blackdrake,
14 Monate? Den Screen möchte ich sehen! Gruß |
Re: Daten bei TMonthCalendar markieren
Es geht um die Theorie. Wenn ich was mache, dann soll es unter allen Bedingungen funktionieren und dynamisch sein.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz