gpt4 book ai didi

delphi - 缩写进度条

转载 作者:行者123 更新时间:2023-12-03 15:10:35 27 4
gpt4 key购买 nike

我正在使用开源 Abbrvia 组件将一些文件存档到单个 Zip 中,同时我正在使用 TAbMeter 仪表来显示进度。

不过,我更愿意使用 TProgressBar 来实现此目的(与 Windows 保持标准界面)。

如何使用 TProgressBar 代替 TAbMeter?我知道我可以自己编写进度代码,但由于 Abbrvia 组件已经在 TAbMeter 中完成了这项工作,我认为重写它没有任何意义。

如果我什至可以访问 TAbMeter 的 Position 属性,我就可以通过与 TAbMeter 同步来模拟 TProgressBar 的进度。

这是一个片段,FileNames 是一个包含要存档的文件名的 TStringList..

procedure ArchiveFiles(SaveAs: string; ProgressBar: TAbMeter);
var
AZipper: TAbZipper;
i: Integer;
begin
AZipper := TAbZipper.Create(nil);
try
AZipper.AutoSave := False;
AZipper.BaseDirectory := ExtractFilePath(SaveAs);
AZipper.ArchiveSaveProgressMeter := ProgressBar;
AZipper.FileName := SaveAs;
AZipper.StoreOptions := AZipper.StoreOptions + [soStripDrive, soRemoveDots]
- [soStripPath];
AZipper.TempDirectory := GetTempDirectory;

try
Screen.Cursor := crHourGlass;
ProgressBar.Visible := True;

for i := 0 to FileList.Count - 1 do
begin
AZipper.AddFiles(FileList.Strings[i], 0);
end;

finally
AZipper.Save;
AZipper.CloseArchive;

ProgressBar.Visible := False;
Screen.Cursor := crDefault;
end;

finally
AZipper.Free;
end;
end;

最佳答案

您可能正在代码中的某处设置ArchiveSaveProgressMeter。您只需停止执行此操作并设置 OnArchiveSaveProgress 事件即可。然后您需要提供带有此签名的事件:

procedure(Sender: TObject; Progress: Byte; var Abort: Boolean) of object;

您可以通过更新 UI 中进度条的 Position 值来响应收到此类事件。

显示此进度事件的方法还处理进度表版本:

procedure TAbCustomZipper.DoArchiveSaveProgress(
Sender: TObject; Progress: Byte; var Abort : Boolean);
begin
Abort := False;
if Assigned(FArchiveSaveProgressMeter) then
FArchiveSaveProgressMeter.DoProgress(Progress);
if Assigned(FOnArchiveSaveProgress) then
FOnArchiveSaveProgress(Self, Progress, Abort);
end;

因此,组件的设计者只是提供了两种接收进度的替代途径:仪表或回调。

<小时/>

为了处理回调的进度,您需要编写如下方法:

procedure TMyMainForm.OnArchiveSaveProgress(
Sender: TObject; Progress: Byte; var Abort: Boolean);
begin
FProgressBar.Position := Progress;
end;

然后,您可以将此事件处理程序分配给 OnArchiveSaveProgress(很可能是在 IDE 中)。这与将 OnClick 事件分配给按钮的过程相同。

<小时/>

注意:我从未使用过 Abbrvia,因此我可能选择了与您正在使用的组件不同的组件。但是,与仪表交互的所有组件也通过回调提供进度,因此无论您使用哪个组件,这种基本方法都将起作用。

关于delphi - 缩写进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8342492/

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