Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-08-2010
kirkhelek kirkhelek is offline
Miembro
 
Registrado: mar 2010
Posts: 13
Poder: 0
kirkhelek Va por buen camino
Problema con Progressbar y Application.ProcessMessages

Hola buenas, llevo un par de horas liado y dándole vueltas a la cabeza con un problema que me he encontrado a la hora de programar una aplicación para la cual uso un mismo progressbar para visualización del proceso de carga de varios procesos que pillan datos de archivos para insertarlos en la BD.

El caso es que si uso el Application.ProgressMessages para 'actualizar' la aplicación, (para hacer el trabajo del Repaint) me da error en "p_cargar_datos1", algo así como que se ha generado un error en la direccion de memoria 0043F6EC y en la 0000014C. Y bueno, aunque lo he solucionado sustituyendo Application.ProgressMessages por Form.Repaint, sigo sin entender por qué me da ése error al usar la otra función/método, así que por eso dejo este post aqui, a ver si alguien entendido me puede decir algo jejeje. Un saludo!.

Código:
// proceso de carga de datos 1
procedure p_cargar_datos1(sRuta:string);
var
  fFichero: TextFile;
  sCadena:string;  
 
begin
  progreso.Position:=0;
  progreso.Min:=0;
  progreso.Max:=f_CuantosRegistros(sRuta,const_longitud);
  try
    AssignFile(fFichero,sRuta);
    Reset(fFichero);
  except
      close;
      exit;
  end;
    // Recorremos el fichero
    label1.Caption:='Cargando datos...';
    while not eof(fFichero) do
    begin
      Readln(fFichero, sCadena);
      progreso.StepIt;
      //F_CARGA_RECETAS.Repaint;
      application.ProcessMessages;
     // cargamos los datos en la BD
     // . . .

    end;
  closeFile(fFichero);
  //deleteFile(pchar(sRuta));
  self.close;
  end;
end;

// proceso de carga de datos 2
procedure p_cargar_datos2(sRuta:string);
var
  fFichero: TextFile;
  sCadena:string;  
 
begin
  progreso.Position:=0;
  progreso.Min:=0;
  progreso.Max:=f_CuantosRegistros(sRuta,const_longitud);
  try
    AssignFile(fFichero,sRuta);
    Reset(fFichero);
  except
      close;
      exit;
  end;
    // Recorremos el fichero
    label1.Caption:='Cargando datos...';
    while not eof(fFichero) do
    begin
      Readln(fFichero, sCadena);
      progreso.StepIt;
      //F_CARGA_RECETAS.Repaint;
      application.ProcessMessages;
     // cargamos los datos en la BD
     // . . .

    end;
  closeFile(fFichero);
  //deleteFile(pchar(sRuta));
  self.close;
  end;
end;
Responder Con Cita
  #2  
Antiguo 11-08-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola kirkhelek.

Hay varias cosas para rever...

.- No entiendo para que declarás los procedimientos: p_cargar_datos1 y p_cargar_datos2.
A primera vista me parecían similares, a la segunda ví que son idénticos. Uno de los dos
es necesariamente redundante.

.- En la línea:
Código Delphi [-]
   self.Close;
¿ Quien es Self ? De la forma en que están declarados los procedimientos, no parecen tener un objeto asociado.


.- No sé que realiza f_CuantosRegistros, pero te aseguro hace disonancia con la línea en que declarás:
Código Delphi [-]
var
 fFichero: TextFile;
por que un archivo de texto no está estructurado en registros.


.- Por último, no necesitás utilizar la instrucción Application.ProcessMessages.

Así que sacando las líneas de comentarios, el ejemplo quedaría así:
Código Delphi [-]
procedure TForm1.CargarDatos(sRuta:string);
var
  fFichero: TextFile;
  sCadena: string;
begin
  with TStringList.Create do
  try
    LoadFromFile(sRuta);
    progreso.Max:= Count;
  finally
    Free;
  end;
  progreso.Position:=0;
  progreso.Min:=0;
  progreso.Step:= 10;  // Para: progreso.StepIt
  try
    AssignFile(fFichero,sRuta);
    Reset(fFichero);
  except
    Close;
    Exit;
  end;
  label1.Caption:='Cargando datos...';
  while not eof(fFichero) do
  begin
    Readln(fFichero, sCadena);
    progreso.StepIt;
  end;
  closeFile(fFichero);
  Self.close; // Self esta asociado a Form1, se cierra
end;

Ejemplo de llamada:
Código Delphi [-]
  CargarDatos('C:\PRUEBA.TXT');

Nota: TStringList lo uso para obtener el número de líneas de forma sencilla (hay mejores métodos), pero para el ejemplo sirve.

Espero haberte ayudado.

Saludos.

Última edición por ecfisa fecha: 11-08-2010 a las 16:42:14.
Responder Con Cita
  #3  
Antiguo 11-08-2010
kirkhelek kirkhelek is offline
Miembro
 
Registrado: mar 2010
Posts: 13
Poder: 0
kirkhelek Va por buen camino
Buenas, ante todo gracias por responer, puede que el código no sea del todo claro, es normal, ya que no es el original así que no le hagas mucho caso a los métodos como Self.Close y demás.

Respecto a lo de los dos procedures que uso: pCargar_datos1 y pCargar_datos2, para que quede claro funcionan igual, sólo que cada uno es para una tabla diferente, p.e: tabla clientes y tabla facturas. Y como úso cada proceso para la carga de los datos desde fichero para cada tabla...

De todas formas, y perdon si no me he explicado muy bien jejejeje, ya sé que lo que quiero ( que se vea el progreso de la barra de progreso xD ) se puede hacer sin el Application.ProcessMessages, sustituyendolo por el Repaint del Form. Lo que pasa es que veo en muchos sitios que usan Application.ProcessMessages para "refrescar" la barra de progreso, y de hecho funciona. PERO al reutilizarla, es decir, al usarla con el pCarga_datos1 y despues con el pCarga_datos2, pues peta con el error que puse en el primer mensaje, y bueno REPITO que el problema lo tengo solucionado usando el método Repaint, sólo que me picaba la curiosidad el saber por qué con Application.ProcessMessages peta y con el Repaint va a las mil maravillas jejejeje

De todas formas, gracias por haber contestado!

Un saludo.
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
Problema con Application.ProcessMessages jandro Varios 5 21-01-2010 16:36:14
Application.ProcessMessages; Stevenmn API de Windows 3 24-02-2008 20:02:34
Tthread Vs. Application -> ProcessMessages(); Peterman Varios 8 31-05-2007 04:05:03
Application.ProcessMessages y Application.HandleMessages molinero1 Varios 13 09-05-2007 15:53:29
Problema con Application.ProcessMessages Coco API de Windows 0 25-02-2005 16:28:44


La franja horaria es GMT +2. Ahora son las 00:45:06.


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