Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Crear un calendario (https://www.clubdelphi.com/foros/showthread.php?t=66774)

alopete 11-03-2010 14:59:09

Crear un calendario
 
Buenas:
Necesito un calendario un customizable con colores y algunos eventos. He mirado un rato largo en internet y clubdelphi y lo mejor que he encontrado es el tmxcalendar, pero tiene el inconveniente de que no puedo colorear un dia en concreto al hacer click (me decolora los otros dias). Me ha dado bastantes problemas y finalmente lo he descartado (tal vez por ignorancia).

A final me he decidido a hacer un calendario pero no se muy bien como hacerlo. Necesito que al hacer click, el dia clicado se ponga en un color determindao y al hacer click derecho aparezca un popup en el que se diga el color que se quiera y ponga el dia de ese color. He empezado haciendo un panel con 7+8 =56 labels `para mostrar el numero de la semana y tb el nombre del dia: lunes, martes,...) pero me doy cuenta de que no es la mejor manera. A alguien se le ocurre algo mejor?


Muchas gracias
Alopete

Neftali [Germán.Estévez] 11-03-2010 16:35:09

¿Has probado YearPlan? Lo usé hace tiempo, aunque tampoco hice grandes cosas.
Es free y trae código fuente, así que tal vez puedas modificarlo si te hace falta.

Puedes encontrarlo en Torry, aquí y también lo he subido al FTP del ClubDlephi.

alopete 11-03-2010 16:41:59

Muchas gracias por responder.

Ahora mismo lo bajo y me pongo a ello. Cuando lo pruebe, comentare que tal ha ido para que les sirva a los demas.


Alopete

alopete 16-03-2010 09:15:03

Hola de nuevo:
Neftali, ya mire el planYear pero me parecio un poco mas complicado que la otra opcion que he barajado: al final he hecho un calendario anual con 12 stringgrids. Cada Stringgrid lleva un array asociado con el dia y el color del que quiero pintar el calendario. En los eventos OnDrawCell de cada Stringgrid pinto el dia del color que corresponda y en el evento on click, le pongo el color que el usuario quiere.
Me ha costado un poco pero ya esta (+ o -)

Gracias pro vuestra ayuda.

Neftali [Germán.Estévez] 18-03-2010 15:56:35

Si puedes, estaría bien que subieras el ejemplo al FTP del club. Así le podría servir a otros usuarios que busquen sobre el mismo tema.

Un saludo.

alopete 22-03-2010 09:38:22

Hola de nuevo:

Cuando tenga un rato (esta tarde supongo), explicare como lo he conseguido. Despues de pegarme un rato es conceptualmente facil pero me ha costado un poco acertar.

Un saludo

alopete 22-03-2010 14:50:12

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.

tuni 01-04-2017 11:25:23

Hola
me gustaria estudiar tu ejemplo.Lo has colgado en el FTP para poder probarlo,estudiarlo y aprender de él.
Gracias

alopete 03-04-2017 09:06:50

Calendarios
 
Hola
No me es posible subir el formulario porque forma parte de un proyecto e iba a dar muchos errores pero la solución que encontré es básicamente el código que puse en su día.
Siento no poder ayudar más.

Alopete

tuni 03-04-2017 10:48:12

No pasa nada.
Era para visualizarlo mejor y poder adaptarlo a mis necesidades.
Gracias


La franja horaria es GMT +2. Ahora son las 16:23:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi