消息关闭
    暂无新消息!

关于Dll进度条问题

问题作者 : 大新2017-07-17发布
程序在读取某个大文件时,因为时间比较长,要做一个进度条来显示读取进度,读取程序写在Dll里,请问题如何把当前的进度值实时的传给主程序。主程序根据值数据显示进度。
谢谢大家,只有这么多分了。

13个回答

︿ 2
真不好意思,不太懂回调,不知能不能给点代码。
比如 Dll里做一个循环
procedure test(x,y:uint64);
begin
 while x<y do
   begin
        inc(x);
    end;
end;


怎么在主程序中显示进度条,
谢谢大家了
︿ 2
Type
TNotifyProgress=procedure (Current; Total); stdcall;
var
FNotifyProgress:TNotifyProgress;

procedure test(x,y:uint64;prb1:TProgressBar);stdcall;
begin
 prb1.max:=y;
 while x<y do
   begin
        inc(x);
        prb1.Position:=prb1.Position+1;

    FNotifyProgress(prb1.Position,Total);
    end;
    prb1.Position:=0;
end;

procedure SetNotifyProgress(proc: TNotifyProgress);stdcall; //把这个函数导出
begin
  FNotifyProgress:= proc;
end;



︿ 0
procedure test(x,y:uint64;prb1:TProgressBar);stdcall;
begin
 prb1.max:=y;
 while x<y do
   begin
        inc(x);
        prb1.Position:=prb1.Position+1;
    end;
    prb1.Position:=0;
end;

在主程序中放一个TProgressBar,调用此函数时传进去就可以了。
︿ 0
就如楼上的,使用回调函数,简洁、安全、直观。
  TGovBase=Class(TInterfacedObject,IGovBase)
  private
  protected
    adc:TADOConnection;
    rst,rstTmp:TADOQuery;
    FCBF:TCBF;
    AppPath:string;
    function  GetConnection:TADOConnection;
    procedure SetConnection(Value:TADOConnection);
    function getCBF : TCBF;
    procedure setCBF(Value:TCBF);virtual;
    procedure FreeAndNilRst(r:TADOQuery);
  public
    constructor Create(_Connection:TADOConnection);Virtual;
    destructor  Destroy;Virtual;
    //指定数据链接,在其它过程调用前,需先指定链接
    property  Connection:TADOConnection read GetConnection write SetConnection;
    //指定进度显示的回调函数
    property  PrsBackCall:TCBF read getCBF write setCBF;
    ////共公函数
    function FmtDate(FDate:String):string; //格式化日期将 199901 转换为 1999-01-01
    function FmtDatePrint(FDate:String):string; //格式化日期,将199901、1999-01-01转换成为1999.01,主要是输出表中使用
    function GetAge(sDate:String):string; 
  end;

这是将通过接口调用DLL中对象的定义,也是使用的回调函数传递数据回主程序。
︿ 0
主程序在调用dll中的函数时候把句柄传入,然后使用自定义消息进行通知主程序,当然也可以倒过来,主程序不停的(比如Timer)访问dll,获取进度,然后更新界面。