Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1274
Благодарности: 1030

Профиль | Отправить PM | Цитировать


Цитата nik1967:
а вот самому написать функции "если нужен полный контроль над отображением информации о размерах/времени" ума не хватает. »
nik1967, открываешь любой репак, там этих реализаций... Вот мой вариант:
читать дальше »

Код: Выделить весь код
[Setup]
AppName=test
AppVerName=test
CreateAppDir=no
DefaultDirName={tmp}
Uninstallable=no
CreateUninstallRegKey=no

[Languages]
Name: en; MessagesFile: compiler:default.isl
Name: ru; MessagesFile: compiler:Languages\russian.isl

[CustomMessages]
ru.Size=байт,КБ,МБ,ГБ,ТБ,ПБ
en.Size=bytes,KB,MB,GB,TB,PB
ru.Time=сек,мин,ч
en.Time=s,m,h

[code]
function pow(x, y: Double): Double; external 'pow@ntdll.dll stdcall';

///////////////////////////////////////////////////
function BytesToSize(const dBytes: Double): String;
var
    i, j: Integer;
    dRange: Double;
begin
    with TStringList.Create do
    try
        CommaText := CustomMessage('Size');
        if Count = 0 then Exit;

        // default
        Result := Format('0 %s', [Strings[0]]);
        if dBytes = 0 then Exit;

        // convert
        for i := Count downto 0 do
        begin
            dRange := pow(1024, i);
            if dBytes < dRange then Continue;
            if Abs(dBytes/dRange - Round(dBytes/dRange)) < 0.01 then Result := Format('%.n %s', [dBytes/dRange, Strings[i]]) else Result := Format('%n %s', [dBytes/dRange, Strings[i]]);
            Break;
        end;
    except
        RaiseLastException;
    finally
        Free;
    end;
end;

///////////////////////////////////////////////////
function TicksToTime(const dwTicks: DWORD): String;
var
    i, j: Integer;
    dwRange: DWORD;
begin
    with TStringList.Create do
    try
        CommaText := CustomMessage('Time');
        if Count = 0 then Exit;

        // default
        if dwTicks < 1000 then
        begin
            Result := Format('0 %s', [Strings[0]]);
            Exit;
        end;
        
        // convert
        dwTicks := Round(double(dwTicks)/1000);
        for i := Count-1 downto 0 do
        begin
            dwRange := 1;
            for j := 1 to i do dwRange := dwRange*60;
            if dwTicks > dwRange-1 then
            begin
                Result := Format('%s%d %s ', [Result, dwTicks div dwRange, Strings[i]]);
                dwTicks := dwTicks - (dwTicks div dwRange)*dwRange;
            end;
        end;
    except
        RaiseLastException;
    finally
        Result := TrimRight(Result);
        Free;
    end;
end;

/////////////////////////////
procedure InitializeWizard();
begin
    MsgBox(BytesToSize(MaxInt), mbInformation, MB_OK);
    MsgBox(TicksToTime(MaxInt), mbInformation, MB_OK);
end;

Последний раз редактировалось El Sanchez, 18-02-2014 в 18:57. Причина: upd #1

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:43, 11-12-2013 | #1694