PDA

Ver la Versión Completa : Sobre Max Calendar...


The_Avatar
16-03-2007, 10:29:43
Me he instalado el componente 'Max Calendar'. Lo he estado trasteando un poco y no veo por ningun lado que de opcion de poner los dias que yo quiera de un color. Tiene ese componente esa opcion?
Si alguno lo ha manejado y sabe orientarme se lo agradeceria.
Si no se pudiese alguno sabria decirme algun componente gratuito en el que si se pueda cambiar el fondo o el color de un numero de dia.
Muchas gracias de antemano. ^^

Lepe
16-03-2007, 12:25:12
Usa el evento OnGetItemStyleEvent

Allí tienes la fecha que se va a pintar, la fuente y el color, como esos 2 últimos son por referencia, puedes modificarlos a voluntad.


if (AStyleType = stDay) then
begin
Acolor := clRed;
AFont.Color := clYellow;
end;

Saludos

The_Avatar
16-03-2007, 12:40:41
MUCHISIMAS GRACIAS X RESPONDER!! ^^
Oye, una pregunta, que narices es 'StDay' ?? que tipo de dato es?
Eso de que el componente no traiga ayuda es un coñazo... ^^´
GRACIAS!!^^

The_Avatar
16-03-2007, 12:45:23
Veamos, he probado tu codigo, y lo que hace es cambiar el color de TODOS los dias laborables ( lunes a viernes ).
He probado con:

if (astyletype=stday)and(Adate=20/03/2007) then begin
Acolor:=clred;
end;

pero no me resalta el dia 20...
Sabes como logra señalar dias concretos??
Gracias de nuevo!! ^^

Lepe
16-03-2007, 13:15:59
Tienes que usar un tipo TDateTime... por ejemplo:

Quiero resaltar el dia 20 de cada mes:


uses DateUtils:

var Resalta:TDateTime:
begin
Resalta := RecodeDay(ADate, 20);

if Adate = Resalta then
color := clRed
else
color := clBlack;


"ADate" es el parámetro de ese evento. Si te fijas lo que hago es comparar si la fecha que se va a pintar coincide con el día 20 de ese mes.

No trae ayuda, pero trae el código fuente, así que manteniendo control pulsado mientras haces click sobre la palabra "stDay" te llevará más o menos a esto:

TmxStyleType = (stSelected, stToday, stDay, stWeekEnd, stIndirect );

Intuyo que:
- StSelected es la fecha seleccionada en el calendario
- StToday si se trata de la fecha actual de windows.
- StDay (de lunes a viernes)
- stWeekEnd (si es un fin de semana, según el código fuente, usa sábado y domingo.
- stIndirect.... no lo he mirado a fondo, creo que es para los días de otro mes... me explico: Si el día 1 de abril empieza en miercoles, entonces puede pintar los días 30 y 31 de Marzo en el Primer Lunes y Martes del mes abril. (hay que retocar otras propiedades para que eso funcione.

Ten en cuenta que solo puedes pintar los colores del mes que se está mostrando, no de otros meses.

Si quieres pintar un conjunto de fechas, podrías usar algo así:

var Resalta: array of Tdate;
begin
SetLength(Resalta, 10) ; // creamos un array de 11 posiciones, empieza en cero.
Resalta[0] : = EncodeDate(2007,3, 20);
etc.
end;

//ahora en ese evento de pintado:
color := clText
if AStyleType = stDay then
for i:= low(Resalta) to high(Resalta) do
if ADate = Resalta[i] then
begin
color := clRed
break;
end;


El hecho de preguntar por if AStyleType = stDay, es porque solo quiero que entre en ese bucle en los días laborables, así impedimos que entre preguntando en fines de semana... es decir, nos estamos ahorrando 8 bucles del for en cada mes (todos los fines de semana de ese mes). Como es un evento que se aplica por cada día a pintar del mes, tenemos que hacerlo eficiente.

En fin, técnicas hay muchas, solo tienes que guardar las fechas que quieres resaltar y después comparar.

Saludos.

The_Avatar
16-03-2007, 13:42:25
CACHIS!! ^^´
Ahora me he fijado que en este componente al pasar de mes los dias se vuelven locos... Es esto normal? Me lo hace con un componente recien puesto y sin modificar en absoluto...

Lepe
16-03-2007, 14:00:36
¿Has llevado a los días al psicólogo? :D :D ¿qué es eso de "locos"? jajaja.


Que conste que lo más fácil es:

if DayOf(ADate) = 20 then
// el día 20 de cada mes


Pero supongo necesitarás resaltar fechas teniendo en cuenta el mes, además del día, si explicas mas detenidamente lo que necesitas, quizás pueda ayudarte.

Saludos

The_Avatar
16-03-2007, 14:11:41
Gracias a ti ya he logrado hacer lo que queria ( resaltar uno o varios dias del mes ). Ahora el problema es que NO SE X Q al darle al boton de pasar mes los dias se vuelven locos...es decir: se descolocan de sitio, se saltan dias...
Esto ocurre con un componente recien puesto en el form y q no tiene NINGUNA MODIFICACION x mi parte.
Sabes a q es debido??
Gracias.

The_Avatar
16-03-2007, 14:21:10
Me fui a la pagina del autor y baje la ultima version ( 2.1 ) y la instale reemplazando a la que tenia ( 2.0 ) y ahora todo parece funcionar correctamente.
Leccion aprendida: no bajar las cosas de Torry a pelo :D
Muchas gracias de verdad x ayudarme en serio... :)
Un saludo!!

Lepe
16-03-2007, 14:23:32
Puedes subir un par de capturas de pantalla a imageShack?? porque no lo entiendo, es más, estoy haciendo pruebas con él en BDS2006 y se comporta perfectamente.

Los días tienen que saltar por fuerza. Si un mes termina en Jueves, el siguiente mes tiene que empezar en Viernes... (no logro comprender lo que dices).

Saludos

Lepe
16-03-2007, 14:24:33
Hombre, me alegro.

Ya me estaba volviendo loco yo :D :D.

thelibmx
29-03-2007, 01:41:20
Hombre que es una maravilla el max calendar, por fin de tantos y tantos dolores de cabeza y gracias a su ayuda ya pude pintar los fondos de las fechas a mi gusto, pero bien ahora entro en una nueva prueba, mi max calendar no cambia de semanas, se queda estatica la semana, cada que cambio de mes, se quedan las mismas semanas, alguien podria decirme cual es el problema, y como hacer para que me arroje en que semana esta ese dia ejem:

evento click

edit1.text:= datetostr(mxcalendar1.Date); con esto cada que doy un click me pone en el edit la fecha que señale pero y si quiero la semana tmbien
me la ponga en un edit

abra un
edit1.text:= datetostr(mxcalendar1.week); ¿? intente eso y me mando a volar(marco un error)

Lepe
29-03-2007, 12:07:46
En la ayuda de delphi pon DateUtils, te saldrán todas las rutinas que tiene ese .pas, estoy totalmente seguro que allí encontrarás una rutina que te diga el número de semana al que pertenece una fecha. Además de un sinfin de procedimientos que te ayudaran con fechas.

Siento no ser específico, es que no sé el nombre de la rutina; por otro lado, es muy conveniente que mires las rutinas que existen, seguro que con el tiempo necesitas alguna.

Saludos.

thelibmx
04-04-2007, 00:35:55
Hola como estan, bien veran ya tengo mi maxcalendar funcionando ahora solo falta una cosa, cuando dejo seleccionado un dia, 30 o 31 de un mes y me regreso a otro que no tiene 30 0 31 me manda un error, como puedo hacer para que ya no me aparesca ese error, yo he pensado que cada qe regrese un mes siempre me seleccione el dia primero de cada mes, como si le hubiera dado click ahi, y pienso q se solucionaria ese problema pero creo que seria muy chafa esa solucion y pues no se como hacerlo. alguien podria ayudarme un poco o decirme alguna otra forma?

ah por cierto el error q manda es por que mando a pintar las fechas desde una tabla, es decir el fondo de las fechas, entonces cuando hago ese procedimiento me manda un mensaje de error de invalid argument to date encode to pienso q es por eso, por que unos meses tienen mas dias que otros.. pero como podria solucionarlo

Lepe
04-04-2007, 11:45:02
Cuando cambies de mes, usa DaysInMonth (creo que se llama así) para saber si ese mes tiene 30 o 31 y no mandar a pintar la fecha de 31.

Saludos

thelibmx
12-04-2007, 01:35:55
mmm buen creo que eso que dices era una forma y yo creo que era la mejor, pero pues como soy principiante y no queria meterme en muchos problemas de codigo asi que lo solucione de una manera muy chafa y fue q cuando apareciera esa exepcion cacharla e ignorarla jaja y asi ya no me salia el mensaje de error y pues el calendario funcionaba bien... gracias,,,,espero cuando tenga un poco de mas tiempo, implementar la manera correcta para que quede bien un saludo

thelibmx
12-04-2007, 01:51:18
bueno aqui estoy de nuevo, espero que me ayuden con esto, ya llevo atorado un rato y creo que mi cerebro se apago de sobrecalentamiento, ya no me llegan las ideas....
Pues veran

en tmonhcalendar si activan o ponen visibles que se muestren las semanas es decir semana 1 a la 52 cada que cambio de mes pues me aparecen a un lado el numero de semana y se va cambiando conforme voy dando click hacia adelante o atras y eso esta muy bien. ahora mi problema es que
tengo el Maxcalendar y tiene la misma opcion de mostrar las semanas
y quiero hacer lo mismo pero sucede que cuando lo activo y lo ejecuto se quedan las semanas estaticas, en todos los meses me muestra la semana 13 a la 18, y pues la cuestion de los dias si estan bien esos si cambian bien, las semaas no, que es lo que no he programado o que opcion no he habilitado se que se trata de solo alguna tonteria ,pro alguien podria decirme o darme una sugerencia? quedaria muy agradecido...
gracias...

Lepe
12-04-2007, 12:19:38
Es cierto. Deberías enviar un correo al creador del componente para que arregle ese bug.

Saludos

eldiegofg
04-08-2007, 05:55:28
Hola, estuve leyendo este hilo y me fue de gran ayuda debido a que estaba queriendo usar el mismo componente. Pero me encontre con un problema, yo quiero resaltar todos los dias que en una base de datos se encuentran bajo el campo FECHA. El problema es que no me marca ninguno de los dias. Aqui el codigo.


var dia:tdatetime; strdia,strd,strm,stra:string; d,m,a:byte;
begin
table1.Open;
table1.First;
while table1.Eof=false do
begin
dia:=table1.FieldByName('fecha').AsDateTime;
strdia:=datetostr(dia);
strd:=midstr(strdia,1,2);
strm:=midstr(strdia,4,2);
stra:=midstr(strdia,7,4);
d:=strtoint(strd);
m:=strtoint(strm);
a:=strtoint(stra);
if ADate = encodeDate(a, m, d) then
Acolor := clRed;
table1.Next;
end;
end;



Tambien probe de esta forma:

begin
table1.Open;
table1.First;
setlength(ar,4);
i:=0;
while table1.Eof=false do
begin
dia:=table1.FieldByName('fecha').AsDateTime;
strdia:=datetostr(dia);
strd:=midstr(strdia,1,2);
strm:=midstr(strdia,4,2);
stra:=midstr(strdia,7,4);
d:=strtoint(strd);
m:=strtoint(strm);
a:=strtoint(stra);
ar[i]:=encodedate(a,m,d);
i:=i+1;
table1.Next;
end;
for i:=0 to 2 do
begin
if ADate = ar[i] then
acolor:=clred;
end;
end;



Lo raro es que haciendo una simple comparacion del estilo siguiente, sí funciona y marca el dia


if ADate = encodeDate(2007, 08, 20) then
begin
Acolor := clAqua;
end;


Espero no molestarlos con mi consulta y sepan disculpar mi ignorancia pero soy muy nuevo en esto. Agradezco de antemano su tiempo, saludos.:)

eldiegofg
06-08-2007, 16:18:45
Por favor, Lepe que parece conocer bien este componente o alguien que me pueda dar una manito...

thelibmx
06-08-2007, 18:01:29
bien yo hice lo mismo que tu pintaba los dias desde una tabla en una base de datos, no recuerdo mucho pero tal ves esto te ayude un poco, haber si me puedo explicar y si estoy bien, cada que tu cambias el calendario se manda a llamar el evento OnGetItemStyleEvent por cada dia del calendario creo..., y ahi fijas el color de cada dia, entonces si quieres que se pinten los dias en una tabla, debes de comparar cada dia y si esta en la tabla que se pinte si no pues no...

un ejemplo de codigo seria este, en el evento ongetitemstyleevent



query1.add('select * from nombre_tabla where fecha='''+dia que quieras seleccionar+'''');
query1.execsql;

if(query1.RowsAffected=1) then
begin
AFont.Style:= AFont.Style + [fsBold]; // poner en negrita la letra de ese día
AColor:=clRed; // color de esa fecha en rojo
end;
query1.Close;
end;


es un codigo un poco viejito, tal ves le faltan algunas cosas... no creo que muchas, pero con eso se que te puede ayudar a lo que quieres hacer solo es cosa de que lo adaptes un poco...

eldiegofg
07-08-2007, 15:56:13
Hola, gracias por tu tiempo. El tema es que cuando quiero pintar un dia con una condicion me lo hace bien, pero cuando quiero pintar varios con un ciclo ahi no me pinta ninguno... A vos te funciono? Todo el codigo que escribi en la pag anterior esta dentro del evento OnGetItemStyle, y el ciclo se encuentra ahi dentro de ese evento, deberia estar fuera del evento el ciclo? Muchas gracias de antemano y saludos.

thelibmx
07-08-2007, 18:45:52
Tu codigo esta bien, el secreto esta en que debes recordar que por cada dia que se pinta se manda a llamar el evento OnGetItemStyle, es decir, si el dia de tu calendario es 1, se manda llamar el OnGetItemStyle,si tienes ahi algo definido para el dia 1 lo hace si no pues no. y asi sucesivamente..
es decir es 1 a 1, y tu lo que haces es muchos a 1, es por eso q no te pinta nada y solo te pinta cuando es una condicion, si tu objetivo es pintar los dias que se encuentran en una tabla el codigo de ejemplo que te puse sirve

eldiegofg
08-08-2007, 18:16:46
Listo, ya lo pude solucionar! Muchas gracias por tu ayuda. Saludos