Ver Mensaje Individual
  #7  
Antiguo 22-03-2010
alopete alopete is offline
Miembro
 
Registrado: sep 2007
Posts: 95
Reputación: 17
alopete Va por buen camino
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;           // Texto que va a imprimir en la celda actual
  iAnchoTexto: Integer;     // Ancho del texto a imprimir en pixels
  PosArray:integer;
  TipoDia:String;
begin
  sTExto:='';
   with Febrero.Canvas do  begin
    // Lo primero es coger la fuente por defecto que le hemos asignado al componente
    // Los nombres de los dias y los numeros de semana
   if gdFixed in State then    begin
      Brush.Color := $00FF8000;// le ponemos azul de fondo
      Font.Color := clWhite;// fuente blanca
      Font.Style := [fsBold];// y negrita
        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
            //obtengo el color en el que quiero pintar la celda
            TipoDia := ArrayFebrero[POsArray].Tipo;
            DameColor(TipoDia);
            Brush.Color := DameColor(TipoDia);
          Font.Style := [fsBold];
          end
          else begin
          Brush.Color := clwindow
          Font.Style := [];// y negrita
          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
    //obtengo la posicion en la que esta el dia en el array
    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
          //pongo los datos en el array y en la tabla y lo grabo 
          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.
Responder Con Cita