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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-09-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: Jun 2011
Posts: 322
Poder: 6
danielmj Va por buen camino
ProgressBar y archivo mayor o igual 2Gb

Hola,

...y la nueva pega ha surgido, vereis tengo una variable que puede ser => a 2Gb, por otra parte tengo un TProgressBar al que le pongo la propiedad Max, en tiempo de ejecución y viene dada por la división entera del tamaño del archivo previamente obtenido entre el valor de la variable que puede ser menor, igual o mayor a 2Gb. Si realizo la prueba con un valor para Max de 2Gb o mas, la aplicación me devuelve un mensaje de error diciendo que el TProgressBar, está fuera de rango. Según he mirado en internet, esta barra de progreso tiene problemas con archivos de mas de 2Gb

¿que opción me queda para usarla con archivos grandes? Decir que con archivos de 1Gb o menos, va perfecta tanto en compilacion como en ejecucion, por lo que considero (no se si bien o mal) que es "defecto" del componente.


Espero podais ayudarme. Saludos.

P.D.: Antes de poner este hilo, he buscado en el foro he visto varias cosas sobre el TProgressBar pero no mi caso, de todos modos si ya se ha debatido, pido disculpas.
Responder Con Cita
  #2  
Antiguo 26-09-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: Dec 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.613
Poder: 27
ecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todos
Hola danielmj .

La propiedad Max del componente TControlBar soporta un rango de 0 a 2147483647. Si supera ese valor, pienso que tendrìas que dividir el tamaño del archivo a fines de representar el progreso en el TProgressBar.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 26-09-2013 a las 22:06:37.
Responder Con Cita
  #3  
Antiguo 26-09-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: Jun 2011
Posts: 322
Poder: 6
danielmj Va por buen camino
Hola ecfisa, la cuestion es que paso los 2 Gb (por ejemplo) de bytes a Kbytes dividiendo entre 1024, pero sigue sin funcionar.

Saludos.
Responder Con Cita
  #4  
Antiguo 26-09-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: Dec 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.613
Poder: 27
ecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todos
Hola danielmj.

Para entender mejor la situación, de que modo no funciona ¿ Da un error, no avanza de posiciòn, se traba en algún punto ?

Sería muy orientativo ver la parte del código donde supones que se produce el error (o no ejecuta la operación que deseada).

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 26-09-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 26.871
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Qué quiere decir que no funciona?, ¿qué mensaje sale?, ¿qué problema exactamente tienes?, ¿cómo la usas?, ¿dónde está el código?...

EDITO: acabo de ver la respuesta de ecfisa, muy lógica, obviamente.
Responder Con Cita
  #6  
Antiguo 26-09-2013
cloayza cloayza is offline
Miembro
 
Registrado: May 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 694
Poder: 14
cloayza Va camino a la fama
Transforma el valor de progreso a porcentaje y se acabo el tema...

Por ejem:

Código Delphi [-]
ProgressBar.Max:=100; //en %

For Progreso_Leido:=1 To Largo_Archivo do
     progressBar.Position:= Trunc((Progreso_Leido/Largo_Archivo)*100);

O algo así....

Saludos cordiales
Responder Con Cita
  #7  
Antiguo 27-09-2013
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: Apr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.676
Poder: 12
Chris Va por buen camino
Creo que el problema es la ecuación.

Debería ser:
((Largo_Archivo - Progreso_Leido) div 100)

Saludos!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #8  
Antiguo 27-09-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: Feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 14
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
danielmj,

Cita:
Empezado por danielmj
...ProgressBar y archivo mayor o igual 2Gb...TProgressBar, está fuera de rango...¿que opción me queda para usarla con archivos grandes?...
Revisa este código:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
   OpenDialog : TOpenDialog;
   F1, F2 : TFileStream;
   Buffer : String;
   MsgProcess : String;
   CountRead : Integer;
   CountWrite : Integer;

begin

   OpenDialog := TOpenDialog.Create(self);
   OpenDialog.InitialDir := 'C:\';
   OpenDialog.Options := [ofFileMustExist];
   OpenDialog.Filter := 'All Files|*.*';
   OpenDialog.FilterIndex := 1;

   ProgressBar1.Min := 0;
   ProgressBar1.Max := 100;
   ProgressBar1.Position := 0;

   if OpenDialog.Execute then
   begin

      try

         F1 := TFileStream.Create(OpenDialog.FileName, fmOpenRead);
         F2 := TFileStream.Create('BK-' + ExtractFileName(OpenDialog.FileName), fmCreate);

         SetLength(Buffer, 1024);

         while F1.Position < F1.Size do
         begin

            CountRead := F1.Read(Buffer[1], 1024);
            CountWrite := F2.Write(Buffer[1], CountRead);

            ProgressBar1.Position := Trunc((F1.Position/F1.Size)*100);

            Application.ProcessMessages;

         end;

         MsgProcess := 'Respaldo del Archivo ' + OpenDialog.FileName + ' Finalizado Satisfactoriamente';

         MessageDlg(MsgProcess, mtInformation, [mbOK], 0);

      except

         MessageDlg('Error de I/O', mtError, [mbOK], 0);

      end;

      F1.Free;
      F2.Free;

      OpenDialog.Free;

   end;

end;
El código anterior permite leer y copiar archivos de un tamaño en bytes de 2^63 - 1 = 9.223.372.036.854.775.807 (Int64), en porciones de 1024 bytes y mostrar el progreso del mismo por medio de un componente TProgressbar normalizado en un rango de 1 a 100.

La clave esta en la ecuación: ProgressBar1.Position := Trunc((F1.Position/F1.Size)*100);

Nota: El código fue probado con archivos menores a 2 GB y mayores a 2GB funcionando en todos los casos correctamente.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 27-09-2013 a las 03:41:16.
Responder Con Cita
  #9  
Antiguo 27-09-2013
cloayza cloayza is offline
Miembro
 
Registrado: May 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 694
Poder: 14
cloayza Va camino a la fama
Cita:
Empezado por Chris Ver Mensaje
Creo que el problema es la ecuación.

Debería ser:
((Largo_Archivo - Progreso_Leido) div 100)

Saludos!
Solo por curiosidad que obtiene con esta formula....

Si es transformar a porcentaje creo que está mal...

Caso 1:
Trunc(512/1024*100)=>50 %

Caso 2:
(1024-512) div 100 =>5 ?

Saludos cordiales
Responder Con Cita
  #10  
Antiguo 27-09-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: Jun 2011
Posts: 322
Poder: 6
danielmj Va por buen camino
Hola, gracias por los consejos, os pongo el código...

Código Delphi [-]

...
LongFich:= (2147483648 div 1024);        //Se convierten 2GB en Bytes a Kbytes
      FileQ := TFileStream.Create(Archivo_F, fmOpenRead or fmShareDenyWrite);
    try
      for i := 1 to Trunc((FileQ.Size) / LongFich) + 1 do
      begin
        principal.prBar.Max:= (FileQ.Size div LongFich);
        principal.prBar.Position:= i;
        principal.prBar.Refresh;
...

Lo que trato de conseguir es que el progreso de la barra avance segun se divida el tamaño del archivo entre la cantidad elegida, en este caso son 2Gb, pero podrian ser 4,6 u 8,2 etc... Es en los casos donde ese tamaño es = o > a 2Gb donde falla. Siempre que sea = o < a 1Gb todo funciona perfectamente includo el progreso de la barra. Y estoy como loco haciendo variaciones en la division. He probado a dividir los 2 Gb entre 1024 para pasarlo a Kbytes, sino me devuelve el mensaje "barra de progreso fuera de rango", he probado a dividir entre 1024 el tamaño del archivo y luego el resultado dividirlo entre los 2Gb div 1024 y el resultado de esto asignarlo a la propiedad Max de la barra, pero no consigo "sacar" archivos de 2Gb a partir del archivo original de 13 Gb (es un ejemplo), solo de 2Mb. O eso, o el mensaje de "... fuera de rango".

Sé que el error debe estar entre el limite de progressbar.max y la/s divisiones, pero no consigo verlo por muchas vueltas que le doy.

Saludos y gracias a todos.
Responder Con Cita
  #11  
Antiguo 27-09-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: Feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 14
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
danielmj,

Cita:
Empezado por danielmj
...Lo que trato de conseguir es que el progreso de la barra avance segun se divida el tamaño del archivo entre la cantidad elegida...
Revisa este código:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
   OpenDialog : TOpenDialog;
   F1 : TFileStream;
   Buffer : String;
   CountRead : Integer;
   FileLen : Integer;

begin

   OpenDialog := TOpenDialog.Create(self);
   OpenDialog.InitialDir := 'C:\';
   OpenDialog.Options := [ofFileMustExist];
   OpenDialog.Filter := 'All Files|*.*';
   OpenDialog.FilterIndex := 1;

   ProgressBar1.Min := 1;
   ProgressBar1.Max := 100;
   ProgressBar1.Position := 0;

   if OpenDialog.Execute then
   begin

      try

         F1 := TFileStream.Create(OpenDialog.FileName, fmOpenRead or fmShareDenyWrite);

         FileLen:= MaxInt div 1024; // MaxInt = 2147483647 

         SetLength(Buffer, FileLen);

         while F1.Position < F1.Size do
         begin

            CountRead := F1.Read(Buffer[1], FileLen);

            ProgressBar1.Position := Trunc((F1.Position/F1.Size)*100);

            Application.ProcessMessages;

         end;

      finally

         F1.Free;

         OpenDialog.Free;

      end;

   end;

end;
El código anterior lee un archivo de cualquier tamaño en porciones (MaxInt div 1024) y muestra su progreso en un componente TProgressBar normalizado en el rango de 1 a 100.

Nota: La idea es mostrar el proceso de un archivo en función porcentual y no en divisiones de su tamaño original, lo cual se adapta a cualquier tamaño de archivo hasta un máximo de 2^63 - 1.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 27-09-2013 a las 18:08:23.
Responder Con Cita
  #12  
Antiguo 29-09-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: Jun 2011
Posts: 322
Poder: 6
danielmj Va por buen camino
Hola buenos dias,

Gracias nlsGarcia, siento no haber respondido antes, pero estaba fuera de España por trabajo y no he tenido tiempo de mirar nada, a parte que todo el codigo lo tenia aqui en casa.
Ahora me pondre con el y veré que tal, ya te comento.

Gracias y 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
Numero Mayor igual , Menor igual... Problema ZiriusB OOP 12 27-06-2011 17:31:24
StringGrid con columnas igual al de un archivo Excel J@ckie Conexión con bases de datos 3 01-03-2011 15:07:20
En red, las BD Access ¿en con SQLs, ¿viaja el archivo completo igual que paradox...? Wonni Tablas planas 4 17-05-2007 18:21:01
FireBird.- Domino que sea entero mayor o igual a cero sakuragi Firebird e Interbase 1 08-09-2006 11:10:09
La impresión no se ve igual Newbie Impresión 2 06-11-2003 02:49:55


La franja horaria es GMT +2. Ahora son las 12:40:15.


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