Ir al contenido


Foto

Marca días inahbiles, periodo vacacional en un calendario stringGrig


  • Por favor identifícate para responder
7 respuestas en este tema

#1 El_Chava

El_Chava

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 09 julio 2015 - 09:08

Hola amigos esperando que se encuentren bien aquí de nuevo con una situación que espero me puedan ayudar a solucionar y es la siguiente. Estoy desarrollando un calendario de labores en el cual se deben especificar los días inhábiles, así como los 2 periodos vacacionales que se tienes en el año. Para eso lo que hice fue usar stringGrid para cada mes ya el procedimiento de llenar los meses con sus respectivos días y dependiendo del día en que comienzan en la semana ya esta programado el detalle es el siguiente. tengo un popmenu que al dar click sobre algún día del calendario del stringGrid le saldrá la opciones de día inhábil, primer periodo vacacional y segundo periodo vacacional. El detalle aquí es como puedo hacer que al dar click por ejemplo el día inhábil del popmenu me cambie de color esa celda por ejemplo color gris (como se ve en el archivo adjunto). ya que posteriormente de guardara en una base de datos. Espero me puedan ayudar de antemano muchas gracias.
p.d. Estoy usando lazarus y los componentes de calendario no cuenta con multselect por eso opte por usar StringGrid.

Estos son los códigos que he encontrado en el foro y he usado 
Evento onDrawCell


php
  1. procedure TFrmCalendarioOficial.StrEneroDrawCell(Sender: TObject; aCol,
  2. aRow: Integer; aRect: TRect; aState: TGridDrawState);
  3. begin
  4. with TStringGrid(Sender) do
  5. begin
  6. if not (gdFixed in aState) then
  7. begin
  8. if ((gdSelected in aState) and (Cells[Acol,Arow]<>'')) then
  9. Canvas.Brush.Color := clHighlight
  10. else
  11. Canvas.Brush.Color := clWindow;
  12. Canvas.FillRect(aRect);
  13. end;
  14. Canvas.TextRect(aRect, ACol, ARow, Cells[ACol, ARow]);
  15. end;

Evento OnMouseDown


php
  1. //con este procedimientos de selecciona y se pinta la celda al dar click derecho del ratón para que el usuario detecte que día va a marcar como inhábil o periodo vacacional
  2. procedure seleccionar_dia(X, Y: Integer;StrMes:TStringGrid);
  3. var aCol, aRow :integer;
  4. p:TPoint;
  5. begin
  6. with FrmCalendarioOficial do
  7. begin
  8. StrMes.MouseToCell(X, Y, aCol, aRow);
  9. StrMes.Row := aRow;
  10. StrMes.Col := aCol;
  11. p := StrMes.ClientToScreen(Point(x,y));
  12. PopupMenu1.popup(p.x, p.y);
  13. end;
  14. end;
  15.  
  16. procedure TFrmCalendarioOficial.StrEneroMouseDown(Sender: TObject;
  17. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  18. var aCol, aRow :integer;
  19. p:TPoint;
  20. begin
  21. if button = mbright then
  22. seleccionar_dia( X, Y,StrEnero);

28k4l8k.jpg

  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 julio 2015 - 09:26

Hola El_Chava

 

¿Te refieres a hacer algo como ésto?

 

Si es así, te puedo ayudar por la noche que regrese a casa, ahí tengo el código que usé para marcar las celdas del StringGrid.

 

Saludos

Archivos adjuntos


  • 0

#3 El_Chava

El_Chava

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 09 julio 2015 - 11:54

Hola egostar gracias por tu respuesta. Estoy avanzando ya logre que al dar click con el botón izquierdo del mouse seleccionando el día y luego si le da click derecho en el popupmenu selecciona día inábil se ponga del color que hace referencia a los dias inahbiles. el problema es que si en el mismo mes hay otro día inhabil y deseo registrarlo pues me borra la marca del día que ya había marcado como inhabil. aquí una imagen del avance

 

5tyv7b.jpg


  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 julio 2015 - 12:31

Hola egostar gracias por tu respuesta. Estoy avanzando ya logre que al dar click con el botón izquierdo del mouse seleccionando el día y luego si le da click derecho en el popupmenu selecciona día inábil se ponga del color que hace referencia a los dias inahbiles. el problema es que si en el mismo mes hay otro día inhabil y deseo registrarlo pues me borra la marca del día que ya había marcado como inhabil. aquí una imagen del avance

 

5tyv7b.jpg

 

 

Hola

 

Como determinas que un día es inhabil, quiero decir, utilizas una tabla o como sabes que un día es inhabil.

 

Saludos


  • 0

#5 El_Chava

El_Chava

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 09 julio 2015 - 12:35

Hola egostar al principio de cada año en mi trabajo ellos me pasan un calendario laboral. Ellos ya me definen que días serán inhábiles y cuales serán los 2 periodos vacacionales. En base a ese calendario yo tengo que registrar esos días en el calendario que tendra el sistema para luego guardarlo en una base de datos. Espero me haya explicado saludos


  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 julio 2015 - 12:44

Hola egostar al principio de cada año en mi trabajo ellos me pasan un calendario laboral. Ellos ya me definen que días serán inhábiles y cuales serán los 2 periodos vacacionales. En base a ese calendario yo tengo que registrar esos días en el calendario que tendra el sistema para luego guardarlo en una base de datos. Espero me haya explicado saludos

 

¿Y porque no agregas otro registro con el nuevo día, lees de nuevo la tabla y "pintas" de nuevo las celdas ?

 

Saludos


  • 0

#7 El_Chava

El_Chava

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 09 julio 2015 - 01:18

Hola eso lo estaba considerando. Lo que quiero hacer es que el usuario ya que seleccione todos los días inhabiles del año asi como el periodo vacacional ya se guarde en la base de datos. Pero así como lo comentas creo que sera bueno llevar un registro en una tabla de memoria y luego vaciarlo en la base de datos. bueno eso es una idea que tengo por el momento de como resolver el problema.


  • 1

#8 El_Chava

El_Chava

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 10 julio 2015 - 10:40

Al fin logre lo que queria hacer en el stringGrid de marcar varias celdas sin que se desmarcaran las que ya lo estaban. Investigando por la red encontre ejemplos y los adapte a los requerimientos que necesitaba. Les dejo el código espero le sean de utilidad. Saludos.

 

procedimientos  


php
  1. procedure seleccionar_dia(X, Y: Integer;StrMes:TStringGrid);
  2. var aCol, aRow :integer;
  3. p:TPoint;
  4. begin
  5. with FrmCalendarioOficial do
  6. begin
  7. StrMes.MouseToCell(X, Y, aCol, aRow);
  8. StrMes.Row := aRow;
  9. StrMes.Col := aCol;
  10. p := StrMes.ClientToScreen(Point(x,y));
  11. PopupMenu1.popup(p.x, p.y);
  12. end;
  13. end;
  14.  
  15. procedure celda_seleccionada(Sender: TObject);
  16. var
  17. aRect:TRect;
  18. begin
  19. with TStringGrid(sender) do
  20. begin
  21. aRect:= CellRect(Col,Row);
  22. if Cells[Col,Row]<>'' then
  23. begin
  24. Objects[Col, Row] := TObject(clSilver);
  25. Canvas.Brush.Color := TColor(Objects[Col, Row]);
  26. Canvas.FillRect(aRect);
  27. Canvas.Font.Color := clBlack;
  28. Canvas.TextOut(aRect.Left+2, aRect.Top+2, Cells[Col, Row]);
  29. end;
  30. end;

En el evento OnCreate del formulario


php
  1. procedure TFrmCalendarioOficial.FormCreate(Sender: TObject);
  2. var
  3. c, f: Integer;
  4. begin
  5. with StrEnero do
  6. begin
  7. for c := FixedCols to ColCount-1 do
  8. for f := FixedRows to RowCount-1 do
  9. begin
  10. Objects[c, f]:= TObject(clWhite); // color por defecto
  11. end;
  12. end;

En el evento OnDrawCell del StringGrid


php
  1. procedure TFrmCalendarioOficial.StrEneroDrawCell(Sender: TObject; aCol,
  2. aRow: Integer; aRect: TRect; aState: TGridDrawState);
  3. begin
  4. with TStringGrid(Sender) do
  5. begin
  6. if (ARow >= FixedRows) then
  7. begin
  8. if ((gdSelected in aState) and (Cells[Acol,Arow]<>'')) then
  9. Canvas.Brush.Color := clHighlight
  10. else
  11. Canvas.Brush.Color := TColor(Objects[ACol, ARow]);
  12. Canvas.FillRect(aRect);
  13. Canvas.Font.Color := clBlack;
  14. Canvas.TextOut(aRect.Left+2, aRect.Top+2, Cells[ACol, ARow]);
  15. end;
  16. end;

En el evento MouseDown del StringGrid


php
  1. procedure TFrmCalendarioOficial.StrEneroMouseDown(Sender: TObject;
  2. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  3. var aCol, aRow :integer;
  4. p:TPoint;
  5. begin
  6. with TStringGrid(Sender) do
  7. begin
  8. MouseToCell(X, Y, ACol, ARow);
  9. case Button of
  10. // mbLeft :seleccionar_dia( X, Y,StrEnero);
  11. mbRight: seleccionar_dia( X, Y,StrEnero);
  12. end;
  13. end;

en el popupmenu al seleccionar Día inhábil


php
  1. procedure TFrmCalendarioOficial.MenudiainhabilClick(Sender: TObject);
  2. begin
  3. if strEnero.Focused then
  4. celda_seleccionada(StrEnero);

Resultado

9ase8o.jpg

 


  • 1




IP.Board spam blocked by CleanTalk.