我在使用comp类型的组件(VCLZip)中有一个事件,但是为了将结果显示为字符串,我认为我需要将comp值转换为int64,但是我找不到方法。有没有办法将comp值转换为int64?还是有一种不同的方式将comp值显示为带逗号的字符串...也许是Format?
function FormatKBSize( Bytes: Cardinal ): string;
{ Converts a numeric value into a string that represents the number expressed as a size value in kilobytes. }
var
arrSize: array [ 0 .. 255 ] of char;
begin
{ explorer style }
Result := '';
{ same formating used in the Size column of Explorer in detailed mode }
Result := ShLwApi.StrFormatKBSizeW( Bytes, arrSize, Length( arrSize ) - 1 );
end;
procedure TFormMain.VCLZip1StartZipInfo( Sender: TObject; NumFiles: Integer; TotalBytes: Comp;
var EndCentralRecord: TEndCentral; var StopNow: Boolean );
var
Tb: int64;
begin
InfoWin.Lines.Add( '' );
InfoWin.Lines.Add( 'Number of files to be zipped: ' + IntToStr( NumFiles ) + '...' );
Tb := TotalBytes; // <= this will not compile
Tb := Int64(TotalBytes); // <= this will not compile
InfoWin.Lines.Add( 'Total bytes to process: ' + FormatKBSize( Tb ) + '...' );
end;
编辑-这似乎可行,但是有更好的方法吗?
InfoWin.Lines.Add( Format( '%n', [ TotalBytes ] ) );
最佳答案
Comp类型是整数类型,但被分类为实数。因此,编译器可能不允许您直接将其强制转换为Int64或进行分配。您必须将其转换。尝试使用Trunc()将其转换为Integer类型。
您还可以尝试使用绝对指令使Int64变量与Comp变量共享相同的地址:
procedure TFormMain.VCLZip1StartZipInfo( Sender: TObject; NumFiles: Integer; TotalBytes: Comp;
var EndCentralRecord: TEndCentral; var StopNow: Boolean );
var
Tb: Int64 absolute TotalBytes;
尽管我通常不喜欢它,因为它很容易在代码中发现强制转换/转换,但它应该可以工作,如果代码足够长,则可能很难看到绝对声明。
第三种解决方案是声明一条记录:
CompRec = record
I64: Int64;
end;
然后演员的作品:
Tb := CompRec(TotalBytes).I64;
关于delphi - 是否可以将Comp类型转换为Int64或将Comp值显示为带逗号的字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8057178/