FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Marca días inahbiles, periodo vacacional en un calendario stringGrig
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 Evento OnMouseDown
Última edición por nlsgarcia fecha: 09-07-2015 a las 18:01:58. Razón: Sintaxis Delphi |
#2
|
||||
|
||||
Lo lógico es que guardes el estado de los días en alguna estructura que luego te servirá para almacenarlos.
Cuando seleccionas un día como inhabil, debes almacenarlo en la estructura, al pintar en el StringGrid, sólo debes consultar la estructura para saber qué días pintar de cada color.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#3
|
|||
|
|||
hola Neftali
Cita:
|
#4
|
|||
|
|||
HOla, no tengo delphi a la mano, pero ésta es una idea de cómo podría ser:
Guarda la información en un arreglo de dos dimensiones:
Cuando selecciones la celda en el grid cambias el estado en el arreglo
Cuando verifiques si se tiene que resaltar consultas el arreglo
Última edición por ecfisa fecha: 09-07-2015 a las 23:35:47. Razón: Corregir error WYSIWYG |
#5
|
||||
|
||||
Cita:
Si marcas 2 días inhabiles en un mes, debes tenerlos almacenados en algún sitio, de forma que luego cuando pintes el grid (en el evento DrawCell) debes consultar esos días y pintarlos. En el pintado de cada celda del stringgrid se debe hacer una consulta a la estructura, y si la celda que se está dibujando corresponde a un día inhabil, entonces debes pintarla. ¿Cómo se guardan esos días? ¿Qué estructura estás utilizando? ¿Qué función estás utilizando en el OnDrawColumnCell -o similar-?
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#6
|
||||
|
||||
Hola El_Chava.
Como te comenta Neftali todo puede variar según programes la estructuración de los datos. Te pongo una idea de tantas en que podrías realizarlo. El ejemplo hace uso del mouse tanto para la elección única como múltiple de días y usa un PopupMenu cuyos ítems ponen el día o la selección en día feriado o laboral. Por la imágen que adjuntaste pareciera que usas 12 StringGrids, el ejemplo usa uno solo (StringGridEnero), pero es muy simple modificarlo para que funcione con los restantes.
Muestra: Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#7
|
|||
|
|||
Hola ecfisa, Neftali y tmsanchez primeramente muchas gracias por responder. Al fin logre lo que quería hacer y era que por el momento solo me marcaran los días en el stringGrid antes de guardarlos en la base de datos.Investigando por la red(y claro en el foro) encontre ejemplos y los adapte a los requerimientos que necesitaba Les dejo el código espero le sean de utilidad. Saludos.
procedimientos Código:
procedure seleccionar_dia(X, Y: Integer;StrMes:TStringGrid); var aCol, aRow :integer; p:TPoint; begin with FrmCalendarioOficial do begin StrMes.MouseToCell(X, Y, aCol, aRow); StrMes.Row := aRow; StrMes.Col := aCol; p := StrMes.ClientToScreen(Point(x,y)); PopupMenu1.popup(p.x, p.y); end; end; procedure celda_seleccionada(Sender: TObject); var aRect:TRect; begin with TStringGrid(sender) do begin aRect:= CellRect(Col,Row); if Cells[Col,Row]<>'' then begin Objects[Col, Row] := TObject(clSilver); Canvas.Brush.Color := TColor(Objects[Col, Row]); Canvas.FillRect(aRect); Canvas.Font.Color := clBlack; Canvas.TextOut(aRect.Left+2, aRect.Top+2, Cells[Col, Row]); end; end; end; Código:
procedure TFrmCalendarioOficial.FormCreate(Sender: TObject); var c, f: Integer; begin with StrEnero do begin for c := FixedCols to ColCount-1 do for f := FixedRows to RowCount-1 do begin Objects[c, f]:= TObject(clWhite); // color por defecto end; end; end; Código:
procedure TFrmCalendarioOficial.StrEneroDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); begin with TStringGrid(Sender) do begin if (ARow >= FixedRows) then begin if ((gdSelected in aState) and (Cells[Acol,Arow]<>'')) then Canvas.Brush.Color := clHighlight else Canvas.Brush.Color := TColor(Objects[ACol, ARow]); Canvas.FillRect(aRect); Canvas.Font.Color := clBlack; Canvas.TextOut(aRect.Left+2, aRect.Top+2, Cells[ACol, ARow]); end; end; end; Código:
procedure TFrmCalendarioOficial.StrEneroMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var aCol, aRow :integer; p:TPoint; begin with TStringGrid(Sender) do begin MouseToCell(X, Y, ACol, ARow); case Button of // mbLeft :seleccionar_dia( X, Y,StrEnero); mbRight: seleccionar_dia( X, Y,StrEnero); end; end; end; Código:
procedure TFrmCalendarioOficial.MenudiainhabilClick(Sender: TObject); begin if strEnero.Focused then celda_seleccionada(StrEnero); end; |
#8
|
||||
|
||||
Podrías subir tu proyecto o el formulario donde hiciste eso, estoy necesitando algo parecido, te agradecería que me colaboraras. Gracias.
Última edición por Casimiro Notevi fecha: 17-10-2017 a las 22:22:33. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Validar Calendario Días Habiles | mantraxer21 | Varios | 2 | 05-11-2014 21:27:29 |
diferencia de dias , suponiendo que los meses son de 30 dias. | ingabraham | Varios | 30 | 12-09-2010 22:37:48 |
Sumar Columna en StringGrig | carlosh2006 | Varios | 2 | 28-08-2007 03:23:53 |
Titulos en StringGrig | CamiloU | OOP | 3 | 09-02-2006 01:07:56 |
Calendario. fecha de noviembre 2005 me pone 31 dias y a diciembre 30 | sakuragi | PHP | 2 | 21-11-2005 18:39:59 |
|