Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Determinar mes a partir de una fecha (https://www.clubdelphi.com/foros/showthread.php?t=71686)

ekstase 04-01-2011 00:46:55

Determinar mes a partir de una fecha
 
Hola amigos. Otra vez necesito su ayuda. Utilizo delphi 7 y Mysql, la consulta es la siguiente: De una fecha necesito determinar a cual mes corresponde por ejemplo:

03/01/2011 = Enero
02/04/2011 = Abril
Etc..

Pero esto me gustaria hacerlo con funciones de delphi, dado que tomo la fecha de una Datetimepicker. Desde ya Muchas Gracias.-
Y perdon si no estoy en el foro correcto es que no encontre donde más. Graicas. :)

ecfisa 04-01-2011 01:59:46

Hola ekstase.

Podrías hacer una función que lo devuelva:
Código Delphi [-]
uses DateUtils;

function NombreDelMes(ADate: TDate): string;
const
   MESES: array[1..12] of string=('Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio', 
                                 'Agosto','Septiembre','Octubre','Noviembre','Diciembre');
begin
  Result:= MESES[MonthOf(ADate)];
end;

Una llamada de ejemplo:
Código Delphi [-]
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
  ShowMessage(NombreDelMes(DateTimePicker1.Date));
end;

Un saludo.

Caral 04-01-2011 02:30:24

Hola
Bueno, si eres como yo que no entiendes bien las funciones que los maestros nos ponen de ejemplo entonces nos buscamos la manera de no usarlas y generar lo mismo sin estas.
Código Delphi [-]
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
meses: array[1..12] of string=('Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio',
                                 'Agosto','Septiembre','Octubre','Noviembre','Diciembre');

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DateTimePicker1Change(Sender: TObject);
var
  a: string;
begin
  a:= FormatDateTime('m',Datetimepicker1.Date);
  Label1.Caption:= meses[StrToInt(a)];
end;

end.
Saludos

cloayza 04-01-2011 19:18:28

Para que inventar la rueda amigos...:eek:

Ya existen los vectores que contienen los nombres de los meses, estan en la unit SysUtils.

Código Delphi [-]
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
      ShowMessage(SysUtils.ShortMonthNames[ MonthOf(DateTimePicker1.Date) ]); //Ene, Feb, Mar
      ShowMessage(SysUtils.LongMonthNames[ MonthOf(DateTimePicker1.Date) ]); //Enero, Febrero, ...
end;

Saludos cordiales

Chris 04-01-2011 19:33:51

algo un poco más simple talvez ;):
Código Delphi [-]
    ShowMessage(FormatDateTime('mmmm', mi_variable_fecha))

Nota: El único inconveniente es que este código depende de la configuración regional y de idiomas configuradas en el sistema. Si por ejemplo un usuario tiene configurado Inglés (EEUU) entonces los nombre de los meses apareceran en Inglés. Para solucionar esto es necesario pasar una variable de tipo TDatetimeSettings en el último parámetro de la función FormatDateTime.

Caral 04-01-2011 19:50:37

Hola
Bueno, no se, pero a mi no me va este ejemplo.
Me dice que no he declarado MonthOf.
Me da la impresion de que es por el Delphi 6 que uso.
Por si las dudas, si he declarado SysUtils.
Que hago mal?
Saludos

cloayza 04-01-2011 19:56:33

Puede ser lo que tu dices...

Yo tengo el D2007...La función MonthOf, esta en la unit DateUtils.

Saludos

Caral 04-01-2011 19:59:57

Hola
Entonces asumo que en delphi 7 que es el que usa ekstase tampoco funcionara, osea: Seguiremos inventando la rueda.:D
Lo que da la impresion es de que a la hora de preguntar se va a tener que tener en cuenta que delphi se usa ya que si que varian las cosas.:eek:
Saludos

Caral 04-01-2011 20:03:01

Hola
Cita:

Empezado por Caral (Mensaje 386606)
Hola
Entonces asumo que en delphi 7 que es el que usa ekstase tampoco funcionara, osea: Seguiremos inventando la rueda.:D
Lo que da la impresion es de que a la hora de preguntar se va a tener que tener en cuenta que delphi se usa ya que si que varian las cosas.:eek:
Saludos

Rectifico ya que no leí bien y ahora mecionaste la unidad adecuada:
NO DEPENDE en este caso del delphi, la unidad no es sysutils, es DateUtils, liguera diferencia.
El codigo SI funciona.
Saludos

cloayza 04-01-2011 20:05:39

Amigo Caral, al parecer no comprendiste bien...

Yo dije

Cita:

Ya existen los vectores que contienen los nombres de los meses, estan en la unit SysUtils
En ningun momento hago referencia a la funcion MonthOf, que como te indico esta en otra unidad.

Saludos

Caral 04-01-2011 20:08:49

Hola
Si amigo, pero si no dices que se necesita colocar la unidad DateUtils el codigo que pusiste no funciona.
Hay que declarar en el USES la unidad DateUtils, de lo contrario da el error que mencione.
Me estoy refiriendo al codigo que pusiste nada mas.
Saludos

cloayza 04-01-2011 20:15:05

Ta bien...te concedo el comentario...

Código Delphi [-]
Uses ...SysUtils, DateUtils;
...
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
      ShowMessage(SysUtils.ShortMonthNames[ MonthOf(DateTimePicker1.Date) ]); //Ene, Feb, Mar
      ShowMessage(SysUtils.LongMonthNames[ MonthOf(DateTimePicker1.Date) ]); //Enero, Febrero, ...
end;

Esta bien así Caralsito...:D

Caral 04-01-2011 20:17:04

Hola
Si amigo, por eso es que siempre digo que vosotros los maestros colocais las cosas como si nosotros los novatos supieramos de esto.:)
Ahora si, hasta yo lo entiendo.:D
Gracias por la aclaracion.
Saludos

ecfisa 04-01-2011 20:21:52

Hola.

En Delphi 7 la opción de cloayza funciona bién, pero me sucede algo raro con ShowMessage:
Código Delphi [-]
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
  ShowMessage(SysUtils.LongMonthNames[MonthOf(DateTimePicker1.Date) ]); 
end;
Desplegado el DateTimePicker, al hacer click sobre la flecha para avanzar el més, muestra el cuadro de dialogo con el nombre del mes y luego de aceptar entra en ciclo infinito...

No sucede lo mismo si:
Código Delphi [-]
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
  Caption:= SysUtils.LongMonthNames[MonthOf(DateTimePicker1.Date) ]
end;
O si se edita el mes por teclado.

Supongo que al aceptar el cuadro de diálogo vuelve al DateTimePicker, disparando nuevamente el evento OnChange. Voy a investigarlo...

Saludos.

cloayza 04-01-2011 20:30:02

Ahora he probado el codigo y por lo menos en D2007, no parecer comportarce en mala forma.

Tendrias que investigar y nos cuentas.

Saludos

Caral 04-01-2011 20:44:51

Hola
A mi me paso lo mismo, pero no lo comente.
Me parece que es lo que dice ecfisa, el control regresa al datetimepicker y se hace el ciclo, por lo menos en el caso del mensaje.
Lo curioso es que no le pase a cloayza, para mi que el delphi 2007 viene con trampa:D:D
Saludos

ekstase 04-01-2011 22:46:07

Solucionado.
 
Hola amigos, desde ya les agradezco por la valiosa ayuda que me dieron, eh probado la solución de Cloayza y en mi caso funciona perfecto, pero me he quedado con la solución de Chris por el simple hecho de que no tuve que agregar ninguna biblioteca. Gracias nuevamente me sacaron de un gran apuro. :)

ecfisa 05-01-2011 18:21:25

Cita:

Empezado por cloayza (Mensaje 386616)
Ahora he probado el codigo y por lo menos en D2007, no parecer comportarce en mala forma.

Tendrias que investigar y nos cuentas.

Saludos

En las pruebas con Trace into nunca sale del evento OnChange. También probé con MessageBox y MessageDlg con el mismo resultado.

La sola llamada a un diálogo modal lo provoca:
Código Delphi [-]
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
  MessageBox(Handle,'','',MB_OK); // con este da un lindo efecto cascada ...
end;

Busqué en la web y está reportado como un bug en [ embarcadero ].

Un saludo.

cloayza 05-01-2011 18:34:34

Debo reafirmar lo que dije, no logro reproducir el error que tu comentas.

Las plataformas donde esta reportado el error es
Cita:

Platform: 95, 98, 2000, NT, XP
Mi entorno es Windows 7, Delphi 2007.

Talvez por ahi va la cosa...
Saludos.

ecfisa 05-01-2011 18:47:26

Hola.

No lo dudé en ningún momento cloayza, estoy seguro que lo has probado bién. Era sólo para comentar lo que había encontrado sobre el caso.

Yo tengo Windows Vista y Delphi 7, me parece que más que el S.O. es la versión de Delphi...

Habría que ver otras conbinaciones para determinar con seguridad quién es el causante. Pero al menos ya sabemos que existe
en Delphi 6(Caral), Delphi 7 y hasta la versión Vista del S.O.

Un saludo.


La franja horaria es GMT +2. Ahora son las 11:17:41.

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