【问题标题】:Show progress on Ui [closed]在 Ui 上显示进度 [关闭]
【发布时间】:2016-03-25 21:40:06
【问题描述】:

我有一个简单的应用程序。一种形式和一种数据模块。 我在 DataModule 中有一些进程,想在 UI 中显示进度(使用进度条)。

最好的方法是什么?

【问题讨论】:

  • 这取决于数据模块中到底发生了什么?
  • @JerryDodge,我有几个循环用于更新数据。
  • 客观地定义“最佳”,根据什么标准?同时-1。在其他条件相同的情况下,imo 的最佳方法不是在 gui (VCL) 线程中执行数据模块进程,而是在 ymmv 中执行。

标签: delphi


【解决方案1】:

最好的方法是在你的数据模块上定义一个事件,然后在你的表单中为事件实现一个处理程序并将它分配给数据模块事件。 然后,在您的流程中,您调用事件,从而调用事件处理程序。

类似这样的:

type
  TMyProgressEvent = procedure (Position, TotalSteps: Integer; Msg: string) of object

TMyDM = class
private
  FOnProgress: TMyProgressEvent;
....
....
public
  procedure UpdateCustomerOrders;
  property OnProgress: TMyProgressEvent read FOnProgress write FOnProgress;
end

TMyForm = class
....
....
  // you can change the position or progress bar here
  // or if you want to log 
  procedure MyFormProress(Position, TotalSteps: Integer; Msg: string);
end

您的 TMyDM.UpdateCustomerOrders 可能如下所示:

 procedure TMyDM.UpdateCustomerOrders()
 begin
   for I = 1 to 10 do 
   begin
     ... 
     ... you are processing something 
     ...
     //call event like this
     FOnProgress(I, 12, 'looping');
   end;
   .... another process here
   FOnProgress(11, 12, 'another process');

   .... one more process here
   FOnProgress(12, 12, 'process finished');
 end;

【讨论】:

  • 这似乎没有回答问题。它假定数据模块上的某些东西会生成事件,但如何做到这一点正是 OP 似乎在问的。
  • @MartynA,在这种方法中,DM(数据模块)调用事件。 Event由form中的方法赋值。
  • 是的,我当然明白。但是什么决定了数据模块何时调用事件呢?
  • 是的,这好多了,+1。请记住这些 q 和 as 不仅仅是为了发布 q 的特定人员的利益。 SO 的主要价值在于,未来不同水平的编程和语言技能的读者也可以从中受益。
  • 我编辑了您的答案以遵循更多标准约定。事实上,您的属性遵循了一些我以前从未见过的约定,我不确定它是否会编译。它似乎将属性与过程混合在一起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多