Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Desarrollo en Delphi para Android
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-07-2014
Avatar de cl2raul
cl2raul cl2raul is offline
Miembro
 
Registrado: sep 2008
Ubicación: La Habana, Cuba
Posts: 88
Poder: 16
cl2raul Va por buen camino
Optimización de código

hola tengo hecho este programa para android, pero quiero q lo corran y me digan pq cuando aumento el periodo se demora muchísimo en dar los números, y lo mas importante, ayúdenme a optimizar este codigo...

Código Delphi [-]
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Edit, FMX.DateTimeCtrls, FMX.Layouts, FMX.ListBox, System.StrUtils, System.DateUtils;

type
  TForm1 = class(TForm)
    CalendarEdit1: TCalendarEdit;
    Button1: TButton;
    CalendarEdit2: TCalendarEdit;
    Label1: TLabel;
    Label2: TLabel;
    ListBox2: TListBox;
    Label3: TLabel;
    Label4: TLabel;
    ComboBox1: TComboBox;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    periodoD, periodoN: integer;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormCreate(Sender: TObject);
begin
  CalendarEdit1.Date:=Now;
  case ComboBox1.ItemIndex of
    0:begin
        periodoD:=DaysInMonth(CalendarEdit1.Date);
        periodoN:=DaysInMonth(CalendarEdit2.Date);
      end;
    1:begin
        periodoD:=(DaysInYear(CalendarEdit1.Date) div 2);
        periodoN:=(DaysInYear(CalendarEdit2.Date) div 2);
      end;
    2:begin
        periodoD:=(DaysInYear(CalendarEdit1.Date) div 2);
        periodoN:=(DaysInYear(CalendarEdit2.Date) div 2);
      end;
    3:begin
        periodoD:=DaysInYear(CalendarEdit1.Date);
        periodoN:=DaysInYear(CalendarEdit2.Date);
      end;
  end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  case ComboBox1.ItemIndex of
    0:begin
        periodoD:=DaysInMonth(CalendarEdit1.Date);
        periodoN:=DaysInMonth(CalendarEdit2.Date);
      end;
    1:begin
        periodoD:=(DaysInYear(CalendarEdit1.Date) div 2);
        periodoN:=(DaysInYear(CalendarEdit2.Date) div 2);
      end;
    2:begin
        periodoD:=(DaysInYear(CalendarEdit1.Date) div 2);
        periodoN:=(DaysInYear(CalendarEdit2.Date) div 2);
      end;
    3:begin
        periodoD:=DaysInYear(CalendarEdit1.Date);
        periodoN:=DaysInYear(CalendarEdit2.Date);
      end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  fechadiurna, fechanocturna:Integer;
  weekD, weekN:Variant;
  semanaD, semanaN:string;
begin
  ListBox1.Clear;       ListBox2.Clear;
  ListBox1.Items.Add(DateToStr(CalendarEdit1.Date));
  for fechadiurna:=0 to periodoD do
    begin
      weekD:=DayOfTheWeek(
        IncDay(StrToDate(LeftStr(ListBox1.Items[fechadiurna],8)), 4)
      );
      case weekD of
      1:semanaD:='LUN';
      2:semanaD:='MAR';
      3:semanaD:='MIE';
      4:semanaD:='JUE';
      5:semanaD:='VIE';
      6:semanaD:='SAB';
      7:semanaD:='DOM';
      end;
      ListBox1.Items.Add(
        DateToStr(IncDay(StrToDate(LeftStr(ListBox1.Items[fechadiurna],8)), 4))
        +'-'+
        semanaD
      );
    end;

  ListBox2.Items.Add(DateToStr(CalendarEdit2.Date));
  for fechanocturna:=0 to periodoN do
    begin
      weekN:=DayOfTheWeek(
        IncDay(StrToDate(LeftStr(ListBox2.Items[fechanocturna],8)), 4)
      );
      case weekN of
      1:semanaN:='LUN';
      2:semanaN:='MAR';
      3:semanaN:='MIE';
      4:semanaN:='JUE';
      5:semanaN:='VIE';
      6:semanaN:='SAB';
      7:semanaN:='DOM';
      end;
      ListBox2.Items.Add(
        DateToStr(IncDay(StrToDate(LeftStr(ListBox2.Items[fechanocturna],8)), 4))
        +'-'+
        semanaN
      );
    end;
end;

end.
Responder Con Cita
  #2  
Antiguo 17-07-2014
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 13
engranaje Va por buen camino
Mirandolo solo por encima y si entendí bien lo que buscas hacer se me ocurre una propuesta para que la valores:

Primero crear un array año que conste de 12 arrays string(uno por cada mes) el primero de longitud 31, el siguiente de longitud 29 (por aquello de los bisiestos), el siguente de longitud 31 de nuevo y asi hasta diciembre. estos arrays los creas con el valor '1 'para la primera posición y los incrementas sucesivamente hasta que el último tenga el valor del último día de mes que corresponda.

Segundo crear otro array de 7 con los días de la semana, con los valores que quieras mostrar en el interior.
Calculas solo una vez el día de la semana para la fecha inicial, y utiliza una variable númerica para almacenar el indice del array para ese día.

Al comenzar el proceso sabes desde que día se comienza y cuantos días debes de tratar. Creas una variable para el año , otra para el mes y otra para el día. Utilizando la del mes y la del día sabes en que posición de array comenzar.

Montas unos bucles incrementando el día hasta que se acabe el mes, y despues volviendo al 1 el día e incrementando el mes, hasta que se acabe el año momento en el que incrmentas el año y vuelves al mes 1 y día 1.
De igual modo incrementas también el día de la semana volviendo al valor inicial cuando trates el último.

Utilizando las variables creadas para el año, y el mes, el día y el día de la semana como indices componemos la string que deseamos con los valores de esos arrays en los indices que correspondan.

Confio no haberme liado mucho y que se entienda lo que propongo.

La complejidad de este método radicaria en que cuando estamos en el día 28 del mes 2, debemos de tener en cuenta el valor de la variable de año para averiguar si es bisiesto e incrementar el día o cambiar de mes.

Espero haber sido de utilidad, y en caso contrario no haberte hecho perder mucho tiempo.
Responder Con Cita
  #3  
Antiguo 17-07-2014
chaosego chaosego is offline
Miembro
 
Registrado: ene 2007
Posts: 31
Poder: 0
chaosego Va por buen camino
para calcular si el año es bisiesto, puedes usar la función IsLeapYear [ function IsLeapYear( Year: Word ): Boolean; ].

Todas las funciones de manejo de fechas estan muy bien explicadas en este enlace de Delphi al Límite.
Responder Con Cita
  #4  
Antiguo 18-07-2014
Avatar de cl2raul
cl2raul cl2raul is offline
Miembro
 
Registrado: sep 2008
Ubicación: La Habana, Cuba
Posts: 88
Poder: 16
cl2raul Va por buen camino
gracias de antemano a engranaje y chaosego debo aclarar q hay un error en el case cuando sea 1 no es 2 es 4

quiero explicar para q es esta aplicacion...

mi esposa tiene unos turnos de trabajo un poco complicado y para poder planificar las cosas de la casa y personales necesitamos muchas veces saber si ese día trabaja o no, me explico, ejemplo ella trabaja 18-07-2014 de día(diurno 7am-7pm), al siguiente día 19-07-2014, de noche(nocturno 7pm-7am), descansa 20-07-2014 y 21-07-2014, luego comienza nuevamente el siclo diurno-nocturno 22-07-2014 y 23-07-2014 respectivamente... ya expuse el problema...

ver foto adjunta

1-escoger la fecha diurno(puede ser del próximo turno o de un turno anterior).
2-escoger la fecha nocturno(puede ser del próximo turno o de un turno anterior, generalmente se escoge la fecha siguiente a la elegida en diurno).
3-indicamos el periodo en el que queremos q nos muestre las fechas(1mes, 3mese, 6mese, 1año... no necesito que sea exacto los la cantidad de días de los periodos, por lo que decidí trabajar con aproximados por eso pido los días del año y los divido con div en todos los casos menos en 0 que pido los días del mes).
4-presionar el botón mostrar fecha para visualizar en los ListBox las fechas que solicites.

el problema por el cual publique esto, es q se demora mucho para mostrar resultados por eso solicite como optimizarlo... otra cosa esta aplicacion la tengo hecha para PC y los resultados son rapidísimos y el código no varia mucho...

de todas formas probare lo que me aconsejaron y les diré...
Imágenes Adjuntas
Tipo de Archivo: jpg ESPACalendar---Delphi-XE5---Unit1.jpg (16,1 KB, 15 visitas)
Responder Con Cita
  #5  
Antiguo 22-07-2014
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 13
engranaje Va por buen camino
Si no lo he entendido mal tu mujer trabajaría de día cada 3 dias, de noche también cada 3 días y siempre al siguiente de haber trabajado de día, despues descansa 2 y vuelta a empezar... Lo cual por seguir con el tema de los array y no variar mucho de las solución que he propuesto anteriormente significaria un aray de 4 valores del tipo (Diurno,Nocturno,Descanso,Descanso) que se podría recorrer con un indice k que volvería a 0 al llegar al final y se incrementaría con cada día.
Seria algo similar a lo propuesto anteriormente, En el mismo bucle que mueves los indices del día y del día de la semana tocaría mover tambien el indice del array con los tipos de jornada.

Supongo que desarrollando el asunto desde este punto de vista pocos recursos necesitas para obtener los datos ya que solo se trataría de incrementar unos indices con un +1 para posicionarse despues en las distintas array que corresponden y obtener los valores allí almacenados.

Por otra parte, viendo el problema y teniendo en cuenta que los tdatetime no dejan de ser doubles donde la parte entera son los días. Se me ocurre que seleccionado una fecha en la que sabes el tipo de jornada y cualquier otra de un calendario, bastaria con restar a la parte entera de la fecha mayor la parte entera de la fecha menor, para saber cuantos días separan a una fecha de la otra. Quiero entender que si el resto de dividir el número de días entre 4 es 0 el tipo de joranada es la misma. Los otros restos posibles son 25,50 y 75 cada uno se corresponderá con un tipo de jornada dependiendo del tipo de jornada de la fecha que conocemos.
Este método te serviría si lo que quisieras es saber que tipo de jornada tendra tu mujer el día x solo haría falta poner la fecha de hoy, seleccionar que jornada ha tenido, buscar el día x y hacer la operación pertinente, si el resto sale 0 es el mismo tipo de joranda que hoy, si sale 75 es el mismo tipo de jornada que ayer, si slae 25 es el mismo tipo de jornada que mañana....

De nuevo espero no haberme liado y haberte liado a tí ojala se haya entendido lo que he querido decir, y te sea de ayuda.
Responder Con Cita
  #6  
Antiguo 22-07-2014
Avatar de cl2raul
cl2raul cl2raul is offline
Miembro
 
Registrado: sep 2008
Ubicación: La Habana, Cuba
Posts: 88
Poder: 16
cl2raul Va por buen camino
gracias, tienes razón, rectificando creo q metí la pata, si lo hago como estaba no era lo q quería, pq las cantidades q obtenía me listaban fechas fueras del rango seleccionado en el periodo, ya que mi mujer no trabaja diario por lo q se me paso eso, por eso cuando pedía la cantidad de días en el mes me da 31 o 30 o 28 o 29 pero el mes segmentados a cuatro 2dias laborales y dos de descanso no muestra el periodo del mes, sino 31 o 30 o 28 o 29 listas de fechas, en cuanto termine lo publico...
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Optimizacion De Rendimiento juanlito SQL 25 23-12-2011 01:03:48
Optimización! Optimización! PiornoCKA&G Varios 1 31-12-2006 21:45:30
Optimización de los índices AMINOA2R Firebird e Interbase 13 04-08-2005 18:18:50
optimizacion del SQL seb@ SQL 1 22-09-2004 20:55:24
Optimizacion manuelpr Conexión con bases de datos 3 30-07-2004 18:26:24


La franja horaria es GMT +2. Ahora son las 07:06:04.


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