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}
Foi útil?

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

  1. Alterar thesize para Int64 - você precisa deste para tamanhos> 4GB de qualquer maneira.
  2. Talvez mudar a chamada para StrFormatByteSizeW (os "cabeçalhos" Delphi deveria ter feito isso em D2009 +)
  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top