ShLwApi.StrFormatByteSize e Delphi 2010 Unicode
-
08-07-2019 - |
Pergunta
Alguém pode me ajudar a corrigir isto:
{$IFDEF UNICODE}
function FormatStringByteSize( TheSize: Cardinal ): string;
{ Return a cardinal as a string formated similar to the statusbar of Explorer }
var
Buff: string;
Count: Integer;
begin
Count := Length(Buff);
FillChar(Buff, Count, 0);
ShLwApi.StrFormatByteSize( TheSize, PWideChar(Buff), Length( Buff ) * SizeOf( WideChar ) );
Result := Buff;
end;
{$ENDIF}
Solução
Pelo menos em Delphi 2009 (não pode teste na versão de 2010 como eu não tê-lo) a função StrFormatByteSize()
é um alias para a versão ANSI (StrFormatByteSizeA()
), não para a versão caractere de largura (StrFormatByteSizeW()
), pois é para a maioria das outras funções da API do Windows. Portanto, você deve usar a versão de char ampla diretamente - também para as versões anteriores do Delphi, para ser capaz de trabalhar com arquivos (sistema) com tamanho superior a 4 GB
Não há necessidade de um buffer intermediário, e você pode fazer uso do fato de que StrFormatByteSizeW()
retorna um ponteiro para o resultado convertido como um PWideChar
:
{$IFDEF UNICODE}
function FormatStringByteSize(ASize: int64): string;
{ Return a cardinal as a string formatted similar to the status bar of Explorer }
const
BufLen = 20;
begin
SetLength(Result, BufLen);
Result := StrFormatByteSizeW(ASize, PChar(Result), BufLen);
end;
{$ENDIF}
Outras dicas
Você precisa definir o período de lustre em primeiro lugar. (Comprimento lustre = 0)
Em seguida
- Alterar thesize para Int64 - você precisa deste para tamanhos> 4GB de qualquer maneira.
- Talvez mudar a chamada para StrFormatByteSizeW (os "cabeçalhos" Delphi deveria ter feito isso em D2009 +)
- Apesar do nome, FILLCHAR espera que o tamanho para ser em bytes, não caracteres. No entanto isso não afetará o resultado.
function FormatStringByteSize( TheSize: int64 ): string;
// Return an Int64 as a string formatted similar to the status bar of Explorer
var
Buff: string;
begin
SetLength(Buff, 20);
ShLwApi.StrFormatByteSizeW( TheSize, PWideChar(Buff), Length(Buff));
Result := PChar(Buff);
end;
Eu não posso testar isso em D2009 / 10 no momento como ainda não começou a mudança para Unicode ainda (próximo projeto!) Ele funciona em D2006 com WideString.