Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-09-2013
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
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
  #2  
Antiguo 27-09-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
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
  #3  
Antiguo 27-09-2013
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Poder: 23
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
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
  #4  
Antiguo 27-09-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
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
  #5  
Antiguo 27-09-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
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
  #6  
Antiguo 29-09-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
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



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 17:24:15.


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