Последние записи
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
- wprintf как напечатать кириллицу
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
25th
Июн
Как отображать размер файла в зависимости от размера в кб,мб,гб?
Posted by Chas under Топик-обзор
а есть процедура для того чтобы размер отображался не в байтах а в зависимости от размера в кб,мб,гб?
GunSmoker:
Я использую Shell-скую StrFormatByteSize:
var
StrFormatByteSizeW: function(ASize: UInt64; szBuf: PWideChar; uiBufSize: UINT): PWideChar; stdcall;
function StrFormatByteSizeDummy(ASize: UInt64; szBuf: PWideChar; uiBufSize: UINT): PWideChar; stdcall;
function FmtSizeToStr(const ASize: Int64): String;
const
_Kb: Int64 = 1024;
_Mb: Int64 = 1024*1024;
_Gb: Int64 = 1024*1024*1024;
_Tb: Int64 = 1099511627776; // 1024*1024*1024*1024;
begin
if ASize < _Kb then
Result := Format(rsELSzFmt, [IntToStr(ASize), rsELb])
else
if ASize < _Mb then
Result := Format(rsELSzFmt, [FloatToStrF(ASize / _Kb, ffFixed, 18, 2), rsELKb])
else
if ASize < _Gb then
Result := Format(rsELSzFmt, [FloatToStrF(ASize / _Mb, ffFixed, 18, 2), rsELMb])
else
if ASize < _Tb then
Result := Format(rsELSzFmt, [FloatToStrF(ASize / _Gb, ffFixed, 18, 2), rsELGb])
else
Result := Format(rsELSzFmt, [FloatToStrF(ASize / _Tb, ffFixed, 18, 2), rsELTb]);
end;
var
Buf: WideString;
Sz: Integer;
begin
Buf := FmtSizeToStr(ASize);
Sz := Min(Length(Buf) + 1, uiBufSize);
if Sz > 0 then
begin
Move(Buf[1], szBuf^, Sz * SizeOf(WideChar));
szBuf[uiBufSize - 1] := #0;
end;
Result := szBuf;
end;
function FmtFormatSize(const ASize: UInt64): String;
var
Lib: HMODULE;
Buf: WideString;
begin
if not Assigned(StrFormatByteSizeW) then
begin
Lib := LoadLibrary(shlwapi);
if Lib <> 0 then
begin
StrFormatByteSizeW := GetProcAddress(Lib, 'StrFormatByteSizeW'); // Do Not Localize
if not Assigned(StrFormatByteSizeW) then
StrFormatByteSizeW := StrFormatByteSizeDummy;
end
else
StrFormatByteSizeW := StrFormatByteSizeDummy;
end;
SetLength(Buf, 1024);
if StrFormatByteSizeW(ASize, PWideChar(Buf), Length(Buf)) = nil then
StrFormatByteSizeDummy(ASize, PWideChar(Buf), Length(Buf));
Result := PWideChar(Buf);
StrFormatByteSizeDummy — это заглушка только для старых систем. Если это не надо, то можно существенно проще:
function StrFormatByteSizeW(ASize: UInt64; szBuf: PWideChar; uiBufSize: UINT): PWideChar; stdcall; external 'shlwapi.dll';
function FmtFormatSize(const ASize: UInt64): String;
var
Buf: WideString;
begin
SetLength(Buf, 1024);
if StrFormatByteSizeW(ASize, PWideChar(Buf), Length(Buf)) <> nil then
Result := PWideChar(Buf)
else
Result := UIntToStr(ASize);
end;
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)