Frage

Kann mir jemand helfen, das Problem zu beheben:

{$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}
War es hilfreich?

Lösung

Zumindest in Delphi 2009 (kann in Version 2010 nicht getestet werden, da ich es nicht habe) das StrFormatByteSize() Funktion ist ein Alias ​​für die Ansi-Version (StrFormatByteSizeA()), nicht auf die Wide-Char-Version (StrFormatByteSizeW()), wie es für die meisten anderen Windows-API-Funktionen der Fall ist.Daher sollten Sie direkt die Wide-Char-Version verwenden – auch für frühere Delphi-Versionen, um mit Datei(system)größen größer als 4 GB arbeiten zu können.

Es ist kein Zwischenpuffer erforderlich und Sie können diesen nutzen StrFormatByteSizeW() gibt einen Zeiger auf das konvertierte Ergebnis als zurück 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}

Andere Tipps

Sie müssen zuerst die Länge des Buff einzustellen. (Länge Buff = 0)

Dann

  1. Ändern theSize zu Int64 - Sie benötigen diese für Größen> 4GB sowieso.
  2. Vielleicht um den Anruf zu StrFormatByteSizeW ändern (die Delphi "Header" in D2009 + dies getan haben sollte)
  3. Trotz des Namens erwartet FillChar die Größe in Bytes, nicht Zeichen. Dies wird jedoch nicht das Ergebnis beeinflussen.
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;

Das kann ich nicht testen, in D2009 / 10 bei Moment, wie sie die Umstellung auf Unicode noch (nächstes Projekt!) Es funktioniert in D2006 mit Wide nicht gestartet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top