[RESUELTO] ¿Cómo fijar fecha?
#1
Escrito 10 noviembre 2009 - 06:31
Compañeros, tienen alguna idea sobre como pueda fijar fechas con Delphi.
Me refiero a esto, dado dos días (sin mes y sin año) con una diferencia de exactamente 15 días, por ejemplo: día 15 y día 30; con estos datos más una fecha inicio dada yo pueda generar un calendario.
Un ejemplo para ilustrar mejor:
Fecha Inicio: 01/11/2009
Primer Día: 15
Segundo Día: 30
Meses: 4
Resultado
Línea Fecha
1 15/11/2009
2 30/11/2009
3 15/12/2009
4 30/12/2009
5 15/01/2010
6 30/01/2010
7 15/02/2010
8 28/02/2010
Si se dan cuenta pueden notar como cambia el día 28 de Febrero, porque como es sabido el mismo no tiene 30 sino 28 y cuando es bisiesto 29.
De antemano sé que Delphi tiene la función IncDay pero esta realiza la suma matemáticamente y para el caso que necesito no me sirve adecuadamente.
#2
Escrito 10 noviembre 2009 - 07:12
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) d1: TDateTimePicker; D2: TDateTimePicker; d3: TDateTimePicker; d4: TDateTimePicker; Button1: TButton; DFechaInicio: TDateTimePicker; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var Dates: array [0 .. 3] of TDateTimePicker; Fecha: TDate; i: Integer; begin Dates[0] := d1; Dates[1] := D2; Dates[2] := d3; Dates[3] := d4; Fecha := DFechaInicio.Date; for i := 0 to length(Dates) - 1 do begin Fecha := Fecha + 15; Dates[i].Date := Fecha; end; end; end.
#3
Escrito 10 noviembre 2009 - 07:18
Si se dan cuenta pueden notar como cambia el día 28 de Febrero, porque como es sabido el mismo no tiene 30 sino 28 y cuando es bisiesto 29.
...¿y despues del dia 28-febrero cual viene?, ¿El 15 de marzo?.
Saludos.
#4
Escrito 10 noviembre 2009 - 07:21
Si se dan cuenta pueden notar como cambia el día 28 de Febrero, porque como es sabido el mismo no tiene 30 sino 28 y cuando es bisiesto 29.
...¿y despues del dia 28-febrero cual viene?, ¿El 15 de marzo?.
Saludos.
Efectivamente en el ejemplo que puse acabo de hacer la prueba y si asigna el 15 de marzo.
Saludos
#5
Escrito 10 noviembre 2009 - 07:42
No lo he probado, pero eso de sumar 15 a mí entender es igual a IncDay(Fecha, Cantidad).
Wilson, mi clase no esta atada a un componente visual, le paso la fecha mediante una propiedad y después de ahí realizo el calculo (lo que estoy tratando de hacer).
Por favor, sigan dando más ideas!!!!
#6
Escrito 10 noviembre 2009 - 07:58
#7
Escrito 10 noviembre 2009 - 08:07
Una pregunta: siempre una de las fechas va a ser 1, otra 15 y la otra 30 con execepción de febrero?
No necesariamente, pero esas son las que mayormente se utilizarían. Pueden poner día 8 y día 23 para que sean fijos.
#8
Escrito 10 noviembre 2009 - 08:15
Pueden poner día 8 y día 23 para que sean fijos.
Hay algo que no termino de entender.
Supongamos que son los días 8 y 23, situemonos en ferbrero, quedaría mas o menos así:
Febrero 8
Febrero 23
¿Según tu necesidad, cuales serían (correctamente) las 4 siguientes fechas?
#9
Escrito 10 noviembre 2009 - 08:25
Pueden poner día 8 y día 23 para que sean fijos.
Hay algo que no termino de entender.
Supongamos que son los días 8 y 23, situemonos en ferbrero, quedaría mas o menos así:
Febrero 8
Febrero 23
¿Según tu necesidad, cuales serían (correctamente) las 4 siguientes fechas?
Esas fechas de Febrero y luego las demás serían:
Marzo 8
Marzo 23
Abril 8
Abril 23
Si te das cuenta es siempre los mismos días, solo que cambian los meses y el año si es necesario; claro teniendo en cuenta de la pareja 15 y 30 para el mes de Febrero.
#10
Escrito 10 noviembre 2009 - 10:11
procedure TForm1.Button1Click(Sender: TObject); var Date: TDateTime; i: integer; DMin: WORD; DMax: WORD; Day: WORD; begin Memo1.Clear; Date:= DateTimePicker1.Date; DMin:= StrToInt(Edit1.Text); DMax:= StrToInt(Edit2.Text); for i:=0 to 10 do begin repeat Date:= IncDay(Date); Day:= DayOf(Date); until (Day = DMin) or (Day = DMax) or ((Day = DaysInMonth(Date)) and (Day < DMax)); Memo1.Lines.Add(DateToStr(Date)); end; end;
Saludos.
#11
Escrito 10 noviembre 2009 - 05:03
Gracias escafandra, por esa función es justo lo que necesitaba.
También gracias a todos los interesados en ayudarme!