2

誰かがこれを修正するのを手伝ってくれますか:

{$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}
4

2 に答える 2

1

最初にバフの長さを設定する必要があります。(長さバフ= 0)

それで

  1. TheSizeをInt64に変更します-とにかく4GBを超えるサイズの場合はこれが必要です。
  2. たぶん、StrFormatByteSizeWへの呼び出しを変更します(Delphiの「ヘッダー」はD2009 +でこれを行う必要があります)
  3. 名前にもかかわらず、FillCharは、サイズが文字ではなくバイト単位であることを想定しています。ただし、これは結果に影響しません。
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;

Unicodeへの移行をまだ開始していないため、現時点ではD2009 / 10でこれをテストすることはできません(次のプロジェクト!)。D2006ではWideStringを使用して動作します。

于 2009-11-30T01:33:43.100 に答える
1

少なくとも Delphi 2009 では (持っていないのでバージョン 2010 ではテストできません)、このStrFormatByteSize()関数は Ansi バージョン ( ) のエイリアスであり、他のほとんどの Windows のようStrFormatByteSizeA()にワイド char バージョン ( ) のエイリアスではありません。 StrFormatByteSizeW()API 関数。したがって、ワイド char バージョンを直接使用する必要があります。以前の Delphi バージョンでも、4 GB を超えるファイル(システム)サイズを処理できるようにするためです。

中間バッファーは必要ありませんStrFormatByteSizeW()。変換された結果へのポインターを次のように返すという事実を利用でき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}
于 2009-11-30T05:16:25.390 に答える