05. januar 2005 - 13:57
Der er
1 kommentar
Markere datoer med fed i TMonthCalendar
Jeg har nogle datoer fra en acces database i formatet
eks: 02-11-2004, 05-01-2005, 22-05-2005
Hvordan får jeg markeret disse datoer?!?
06. januar 2005 - 09:39
#1
Man skal bruge det event der GetMonthInfo, der er et eksempel i hjælpen.
Der kan man bestemme hvilke dage i måneden der skal vises med fed.
GetMonthInfo eventen kaldes hver gang brugeren bladrer til en anden måned.
Der er bare et "lille" problem:
I Eventen kan man kun se hvilken måned der skal vises, ikke hvilket år den måned ligger i!!!
Det virker som om det er beregnet til at vise de samme dage i en måned med fed uanset hvilket år der er tale om, og det er vist ikke lige det du har brug for.
Så kigger man på TMonthCalendar Date property, men denne windows control er lettere hjernedød for Date er altid forkert: Den opdateres først til den nye måned EFTER at GetMonthInfo eventen slutter.
Derfor må man prøve at gætte sig til hvilken år/måned som kalenderen vil vise.
Nedenfor er mit forsøg på at gøre det:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;
type
TForm1 = class(TForm)
MonthCalendar1: TMonthCalendar;
procedure MonthCalendar1GetMonthInfo(Sender: TObject; Month: Cardinal;
var MonthBoldInfo: Cardinal);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FedeDage: array of TDate;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
DateUtils;
procedure TForm1.MonthCalendar1GetMonthInfo(Sender: TObject;
Month: Cardinal; var MonthBoldInfo: Cardinal);
var
Fede: array of Cardinal;
i: Integer;
Start, Stop: TDate;
begin
// Problem: Denne event kaldes FØR MonthCalendar1.Date ændres,
// så vi ser en gammel dato i.s.f. en dato i den nye måned der skal vises.
Start := StartOfTheMonth(MonthCalendar1.Date);
// Problem: MonthCalendar1.Date opdateres først EFTER denne event
// Vi må derfor gætte os til den korrekte dato
if MonthOf(Start) = Month then
begin // valgt samme måned i enten samme år eller et andet år (vi gætter på samme år)
// Start er uændret
Stop := EndOfTheMonth(Start);
end
else
if MonthOf(IncMonth(Start, 1)) = Month then
begin // bruger har valgt næste måned (eller en måned i et andet år)
Start := IncMonth(Start, 1);
Stop := EndOfTheMonth(Start);
end
else
if MonthOf(IncMonth(Start, -1)) = Month then
begin // bruger har valgt forrige måned (eller en måned i et andet år)
Start := IncMonth(Start, -1);
Stop := EndOfTheMonth(Start);
end
else
begin // Der er valgt en måned i et ukendt år (vi gætter på samme år)
Start := RecodeMonth(Start, Month);
Stop := EndOfTheMonth(Start);
end;
SetLength(Fede, 0);
for i := 0 to High(FedeDage) do
if (FedeDage[i] >= Start) and (FedeDage[i] <= Stop) then
begin
SetLength(Fede, Length(Fede)+1);
Fede[High(Fede)] := DayOf(FedeDage[i]);
end;
if Length(Fede) > 0 then
MonthCalendar1.BoldDays(Fede, MonthBoldInfo);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SetLength(FedeDage, 1);
FedeDage[0] := EncodeDate(2004, 11, 2);
SetLength(FedeDage, Length(FedeDage)+1);
FedeDage[1] := EncodeDate(2005, 1, 5);
SetLength(FedeDage, Length(FedeDage)+1);
FedeDage[2] := EncodeDate(2005, 5, 22);
end;
end.