我在使用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/

10-13 05:16