gpt4 book ai didi

delphi - TResourceStream 的进度条 (Delphi)

转载 作者:行者123 更新时间:2023-12-03 15:42:32 26 4
gpt4 key购买 nike

如何使用 SaveToFile 的进度条方法 ?实际上我想将资源保存到文件中,并在保存时将进度条从 0% 更新到 100%,我该怎么做?

最佳答案

您可以像下面的代码一样创建自己的 TResourceStream 后代。但对于大量资源(可能就是这种情况,否则您就不必看到进度)最好将其“包装”在单独的线程中。如果您需要帮助,请大声喊叫。

type
TForm1 = class(TForm)
Button: TButton;
ProgressBar: TProgressBar;
procedure ButtonClick(Sender: TObject);
private
procedure StreamProgress(Sender: TObject; Percentage: Single);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

type
TStreamProgressEvent = procedure(Sender: TObject;
Percentage: Single) of object;

TProgressResourceStream = class(TResourceStream)
private
FOnProgress: TStreamProgressEvent;
public
procedure SaveToFile(const FileName: TFileName);
property OnProgress: TStreamProgressEvent read FOnProgress
write FOnProgress;
end;

{ TProgressResourceStream }

procedure TProgressResourceStream.SaveToFile(const FileName: TFileName);
var
Count: Int64;
Stream: TStream;
BlockSize: Int64;
P: PAnsiChar;
WriteCount: Int64;
begin
if Assigned(FOnProgress) then
begin
Count := Size;
if Count <> 0 then
begin
Stream := TFileStream.Create(FileName, fmCreate);
try
if Count < 500 then
BlockSize := 5
else
BlockSize := Count div 50;
P := Memory;
WriteCount := 0;
while WriteCount < Count do
begin
if WriteCount < Count - BlockSize then
Inc(WriteCount, Stream.Write(P^, BlockSize))
else
Inc(WriteCount, Stream.Write(P^, Count - WriteCount));
Inc(P, BlockSize);
FOnProgress(Self, WriteCount / Count);
end;
finally
Stream.Free;
end;
end;
end
else
inherited SaveToFile(FileName);
end;

{ TForm1 }

procedure TForm1.ButtonClick(Sender: TObject);
var
Stream: TProgressResourceStream;
begin
ProgressBar.Min := 0;
Stream := TProgressResourceStream.Create(HInstance, 'TFORM1', RT_RCDATA);
try
Stream.OnProgress := StreamProgress;
Stream.SaveToFile('TForm1.dat');
finally
Stream.Free;
end;
end;

procedure TForm1.StreamProgress(Sender: TObject; Percentage: Single);
begin
with ProgressBar do
Position := Round(Percentage * Max);
end;

关于delphi - TResourceStream 的进度条 (Delphi),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6081841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com