Hola de nuevo:
Explico un poco como he hecho: he creado 12 stringgrids, una tabla con el calendario para cada empleado (un registro por cada dia) y un array por cada mes del año. Cuando entro en la pantalla copio los datos de la tabla al array, asi que por cada mes tengo todos sus dias en el array. Tambien guardo en la tabla el color en el que se tiene que pintar el dia, o sea, la celda del stringgid.
PAra pintar el stringgrid utilizo el evento drawcell, que se lanza un monton de veces pero a mi me va bien (y no hay otra posibilidad):
Código Delphi
[-]
procedure TCalFrm.FebreroDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
sTexto: String; iAnchoTexto: Integer; PosArray:integer;
TipoDia:String;
begin
sTExto:='';
with Febrero.Canvas do begin
if gdFixed in State then begin
Brush.Color := $00FF8000; Font.Color := clWhite; Font.Style := [fsBold]; if (AROw=0) or (ACol=0) then
sTexto := DameTitulo(Arow,Acol);
end
else begin
sTexto := Febrero.Cells[ACol,Arow];
PosArray := Acol+(ARow-1)*7;
if ArrayFebrero[POsArray].Dia = 0 then
sTExto := '';
if sTExto <>'' then begin
TipoDia := ArrayFebrero[POsArray].Tipo;
DameColor(TipoDia);
Brush.Color := DameColor(TipoDia);
Font.Style := [fsBold];
end
else begin
Brush.Color := clwindow
Font.Style := []; end;
Font.Color := clBlack;
end;
FillRect( Rect );
iAnchoTexto := TextWidth( sTexto );
if sTExto <>'' then
TextOut( Rect.Left + ( ( Rect.Right - Rect.Left ) - iAnchoTexto ) div 2, Rect.Top + 2, sTexto );
end;
end;
con eso se pinta el stringgird solo.
El otro evento que he utilizado es el onclick del stringrid, en el cual le digo en que color hay que pintar la celda y lo grabo en la tabla:
Código Delphi
[-]
procedure TCalFrm.FebreroClick(Sender: TObject);
var
Col, Row: integer;
Colo1, Colo2, Colo3: byte;
PosArray:integer;
TipoDiaIni,TipoNuevo:String;
HorasT,HorasE,HorasA:double;
Motivo:String;
exito:boolean;
begin
Col := Febrero.Col;
Row := Febrero.Row;
if (Col<>0) and (Row <>0) then begin
PosArray := Col+(Row-1)*7;
TipoDiaIni := arrayFebrero[PosArray].Tipo;
Tiponuevo := DeRadioAChar(rgtipo.ItemIndex);
HorasT := arrayFebrero[PosArray].Horast;
HorasE := arrayFebrero[PosArray].Horase;
HorasA := arrayFebrero[PosArray].Horasa;
Motivo := arrayFebrero[PosArray].motivo;
try
if cdsCalendario.locate('FECHA',arrayEnero[PosArray].Fecha,[]) then begin
DameHoras(TipoNuevo,HorasT,HorasE,HorasA);
arrayFebrero[PosArray].Tipo := TipoNuevo;
cdsCalendario.Edit;
cdsCAlendarioTIPO.AsString := TipoNuevo;
cdsCalendario.Post;
cdsCalendario.ApplyUpdates(0);
end;
finally
end;
Febrero.Refresh;
end;
end;
Bueno, no se com o ha quedado, si alguien no lo entiende, que me lo diga.