ShLwApi.StrFormatByteSize und Delphi 2010 Unicode
-
08-07-2019 - |
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}
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
- Ändern theSize zu Int64 - Sie benötigen diese für Größen> 4GB sowieso.
- Vielleicht um den Anruf zu StrFormatByteSizeW ändern (die Delphi "Header" in D2009 + dies getan haben sollte)
- 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.