Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-06-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Formatear tamaño de archivos (B, KB, MB, GB,TB, etc)

Las rutinas sirven tanto para kilogramos, litros como KB. Se añade una rutina FormatFileSize por comodidad y aprendizaje de uso ;).

Código Delphi [-]
uses Windows, SysUtils, Classes, FileCtrl,shellapi,Forms,math; // algunos sobran ;)

type FileUnit = ( B=0, Kb, Mb, Gb, Tb, Auto);
var FileSizeUnit :array[FileUnit ] of string= ('B ', 'KB', 'MB', 'GB','TB', '');

// Lepe:
// formatea el tamaño de un archivo, el string es una de las variables
// declaradas arriba. Usar con jclFileUtils.GetSizeOfFile
function FormatFileSize(const Number:Int64;
                    const SelectedUnit:FileUnit=Auto):string;
// Lepe:
// formatea cualquier numero en base a unas unidades y el salto
// entre dichas unidades (UnitsDiff)
function FormatNumbers(const Number:Int64;
                       const BaseUnits:TStrings;
                       const UnitsDiff:Longint;
                       const SelectedUnit:Integer=0):string;

implementation
function FormatFileSize(const Number:Int64;
                       const SelectedUnit:FileUnit =Auto):string;
var units:TStringList;
    AutoUnit:FileUnit;
begin
  units:= TStringList.Create;
  try
    units.Add(FileSizeUnit[b]);
    units.Add(FileSizeUnit[Kb]);
    units.Add(FileSizeUnit[Mb]);
    units.Add(FileSizeUnit[gB]);
    units.Add(FileSizeUnit[Tb]);
    AutoUnit:= SelectedUnit;
    if AutoUnit=auto then
    while (AutoUnit > b) and (Number < Power(1024,Integer(AutoUnit)))do
      Dec(AutoUnit);
    Result:= formatnumbers(Number, units,1024,
              units.IndexOf(FileSizeUnit[AutoUnit]));
  finally
    units.Free;
  end;
end;



function FormatNumbers(const Number:Int64;
                       const BaseUnits:TStrings;
                       const UnitsDiff:Longint;
                       const SelectedUnit:Integer=0):string;
var Divisor:Extended;
    ComaPos, i, ThousandsSep:Integer;
    temp:string;
begin
   Result := IntToStr(Number);
  if Assigned(baseunits) then
  if (SelectedUnit <> 0) and (SelectedUnit <= BaseUnits.Count) then
  if (UnitsDiff <> 0) then
  begin
    Divisor := Power(UnitsDiff, Integer(SelectedUnit));
    Result := IntToStr(trunc(number / Divisor));

    temp := Floattostrf(frac(number / Divisor),ffNumber,3,2);
    Result:= Result + Copy(temp,pos(sysutils.DecimalSeparator,temp),3);

  end;
{------------------------------------------------------------------------------
 No podemos usar format para añadir los puntos de millar, ya que necesita
 un Float, que tiene menos precisión que un Int64
---------------añadimos puntos de millar y comas  ----------------------------}
  ThousandsSep:= 0;
  ComaPos:= Pos(Sysutils.DecimalSeparator,Result);
  if ComaPos = 0 then
    ComaPos := Length(Result)
  else
    Dec(ComaPos);
  for i:= ComaPos downto 2 do
  begin
    Inc(ThousandsSep);
    if (ThousandsSep mod 3 = 0)then
      Result:= Copy(Result,1,i-1)+
                    sysutils.ThousandSeparator+
                    Copy(Result,i,255);
  end;
{-----------------------------fin --------------------------------------------}

  if Assigned(baseunits) then
  if BaseUnits.Count > 0 then
  if (SelectedUnit < BaseUnits.Count) then
    Result := Result +' '+BaseUnits[selectedunit];
end;

Para llamar a la rutina:
Código Delphi [-]
var s:string;
begin
  s:= FormatFileSize(46546466546); // busca la unidad automáticamente

  s:= FormatFileSize(46546466546, MB); // resultado en la unidad indicada.
end;
Responder Con Cita
  #2  
Antiguo 08-06-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
En FormatFileSize, la línea:
Código Delphi [-]
    units.Add(FileSizeUnit);
Debe decir:
Código Delphi [-]
    units.Add(FileSizeUnit[ B]);

El sistema lo ha detectado como una "etiqueta de negrita" y se lo ha comido con patatas :D

PD: No sé editar el truco :D

Saludos
Responder Con Cita
  #3  
Antiguo 08-06-2006
Avatar de Emilio
*Emilio* Emilio is offline
Capo
 
Registrado: may 2003
Ubicación: Palma de Mallorca
Posts: 2.635
Poder: 10
Emilio Va por buen camino
lepe, ya está solucionado, sin embargo puedes editar tus propios trucos haciendo clic en la imagen de un lapiz que aparece a la derecha en el listado de trucos.
Responder Con Cita
  #4  
Antiguo 08-06-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Asias.
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


La franja horaria es GMT +2. Ahora son las 09:23:42.


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