Habe das nun so gelöst:
1. Es werden alle Wochenenden gekennzeichnet.
2. Alle ungültigen Datums ausgegraut. Z.b.: 30.02.2007
3. Alle Urlaubs/Seminar/Sonstige - Tage mit unterschiedlichen Farben
So lese ich meine Arrays aus und bringe die Farben in mein StringGrid (STG_UP_Planer):
Delphi-Quellcode:
procedure UP_Monat_zeichnen(Sender: TObject; ACol,ARow: Integer; Rect: TRect; State: TGridDrawState);
var
Datum: String;
MyDate: TDateTime;
I: Integer;
begin
with STG_UP_Planer do
begin
if (ACol > 0) AND (ARow > 0) then
begin
Datum := inttostr(ACol) + '.' + inttostr(ARow) + '.2007';
if trystrtodate(Datum,MyDate) = TRUE then
begin
//Wochenenden eintragen
if (DayOfWeek(strtodate(Datum)) = 7) OR (DayOfWeek(strtodate(Datum)) = 1) then
begin
Canvas.Brush.Color := clMoneygreen;
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
end;
//Urlaubstage eintragen
for I := 0 to length(Tage) -1 do
begin
if (ACol = strtoint(Tage[I])) AND (ARow = strtoint(Monate[I])) then
begin
If Arten[I] = '1' then Canvas.Brush.Color := clRed;
If Arten[I] = '2' then Canvas.Brush.Color := clBlue;
If Arten[I] = '3' then Canvas.Brush.Color := clGreen;
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left+200, Rect.Top+2, Cells[ACol, ARow]);
end;
end;
end
else
begin
//Ungültige Datums eintragen
Canvas.Brush.Color := clSilver;
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
end;
end;
end;
end;
Vorher lese ich alle VON und BIS Datums aus mit der Art des Urlaubs, die dann mit der oberen Procedure eingetragen werden.
Delphi-Quellcode:
procedure Urlaubstage_eintagen();
var
T: Integer;
M: Integer;
I: Integer;
Laenge: Integer;
Monat1: Integer;
Monat2: Integer;
Tag1: Integer;
Tag2: Integer;
Art: String;
begin
I := 0;
T := 0;
M := 0;
Laenge := 0;
Tage := nil;
Monate := nil;
Arten := nil;
//Länge der Arrays bestimmen
DM_Query_UP.QueryPlaner.First;
while DM_Query_UP.QueryPlaner.Eof <> true do
begin
Monat1 := Monthof(strtodate(DM_Query_UP.QueryPlaner['VON']));
Monat2 := Monthof(strtodate(DM_Query_UP.QueryPlaner['BIS']));
Tag1 := Dayof(strtodate(DM_Query_UP.QueryPlaner['VON']));
Tag2 := Dayof(strtodate(DM_Query_UP.QueryPlaner['BIS']));
for T := Tag1 to Tag2 do
begin
for M := Monat1 to Monat2 do
begin
Laenge := Laenge + 1;
end;
end;
DM_Query_UP.QueryPlaner.Next;
end;
SetLength(Tage,Laenge);
SetLength(Monate,Laenge);
SetLength(Arten,Laenge);
I := 0;
T := 0;
M := 0;
//Urlaubstage auslesen
DM_Query_UP.QueryPlaner.First;
while DM_Query_UP.QueryPlaner.Eof <> true do
begin
Monat1 := Monthof(strtodate(DM_Query_UP.QueryPlaner['VON']));
Monat2 := Monthof(strtodate(DM_Query_UP.QueryPlaner['BIS']));
Tag1 := Dayof(strtodate(DM_Query_UP.QueryPlaner['VON']));
Tag2 := Dayof(strtodate(DM_Query_UP.QueryPlaner['BIS']));
Art := DM_Query_UP.QueryPlaner['ART'];
for T := Tag1 to Tag2 do
begin
for M := Monat1 to Monat2 do
begin
Tage[I] := inttostr(T);
Monate[I] := inttostr(M);
Arten[I] := Art;
I := I + 1;
end;
end;
DM_Query_UP.QueryPlaner.Next;
end;
end;
Weiss nicht ob das eine optimale Lösung ist, aber es funktioniert ohne merkliche Ladezeiten. (< 1 Sekunde)
Gruss
Holger