德尔福 – Abbrevia ProgressBar
我正在使用开源Abbrevia组件将一些文件存档到一个Zip中,而这正在发生我正在使用TAbMeter Gauge来显示进度.
我宁愿使用TProgressBar来代替这个目的(保持与Windows的标准接口). 我怎样才能使用TProgressBar代替TAbMeter?我知道我可以自己编写进度代码,但看到Abbrevia组件已经在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中进度条的位置值来响应收到此类事件. 表示此progress事件的方法也处理进度表版本: 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中.将按钮事件分配给按钮是一个相同的过程. 注意:我从未使用过Abbrevia,所以我可能从你正在使用的那个中选择了一个不同的组件.但是,与仪表交互的所有组件也通过回调提供进度,因此无论您使用哪个组件,这种基本方法都将起作用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |