Einzelnen Beitrag anzeigen

HolgerCW

Registriert seit: 28. Nov 2006
Ort: Marl
1.207 Beiträge
 
Delphi XE7 Enterprise
 
#13

Re: StringGrid -> Zelle farblich

  Alt 25. Okt 2007, 10:33
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] = '1then Canvas.Brush.Color := clRed;
      If Arten[I] = '2then Canvas.Brush.Color := clBlue;
      If Arten[I] = '3then 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
  Mit Zitat antworten Zitat