Delphi loadfromfile函数的进度条

Delphi loadfromfile函数的进度条,delphi,progress-bar,blob,Delphi,Progress Bar,Blob,我使用Delphi LoadFromFile函数插入Table1BLOBFIELD.LoadFromFile ('C:\xxx.avi')和要检索的SaveToFile命令。 这种插入/检索相当耗时(几分钟)。信息技术 如果我能展示一种progressbar(而不仅仅是一个 沙漏形光标)。 当使用SaveToFile时,我也许可以使用计时器并检查文件大小 (尽管没有线程这似乎不起作用)。但这是不可能的 LoadFromFile的解决方案。 有没有人有特定的解决方案、提示等,。。。? 提前感谢我认

我使用Delphi LoadFromFile函数插入Table1BLOBFIELD.LoadFromFile ('C:\xxx.avi')和要检索的SaveToFile命令。 这种插入/检索相当耗时(几分钟)。信息技术 如果我能展示一种progressbar(而不仅仅是一个 沙漏形光标)。 当使用SaveToFile时,我也许可以使用计时器并检查文件大小 (尽管没有线程这似乎不起作用)。但这是不可能的 LoadFromFile的解决方案。 有没有人有特定的解决方案、提示等,。。。?
提前感谢

我认为延迟不是因为读取文件,而是因为数据库中的记录。我相信您可以使用“TTimer”根据文件大小和项目进度进行估算,但对于这种情况,读取文件应该在一个线程中完成,以便应用程序的其余部分(主线程)闩锁

这里是一个简单的示例,说明如何对
TFileStream
进行子类化,以及如何向其添加
OnProgress
事件:

unit Unit1;

interface

uses
  SysUtils, Classes, Controls, Forms, XPMan, Db, ComCtrls, StdCtrls, AdoDB;

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

  TProgressFileStream = class(TFileStream)
  private
    FOnProgress: TStreamProgressEvent;
    FProcessed: Int64;
    FSize: Int64;
  public
    procedure InitProgressCounter(ASize: Int64);
    function Read(var Buffer; Count: Integer): Integer; override;
    function Write(const Buffer; Count: Integer): Integer; override;
    property OnProgress: TStreamProgressEvent read FOnProgress
      write FOnProgress;
  end;

  TForm1 = class(TForm)
    ADOQuery1: TADOQuery;
    ADOQuery1ID: TAutoIncField;
    ADOQuery1Blob: TBlobField;
    Button1: TButton;
    ProgressBar: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    procedure StreamProgress(Sender: TObject; Percentage: Single);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TProgressFileStream }

procedure TProgressFileStream.InitProgressCounter(ASize: Int64);
begin
  FProcessed := 0;
  if ASize <= 0 then
    FSize := 1
  else
    FSize := ASize;
  if Assigned(FOnProgress) then
    FOnProgress(Self, 0);
end;

function TProgressFileStream.Read(var Buffer; Count: Integer): Integer;
begin
  Result := inherited Read(Buffer, Count);
  Inc(FProcessed, Result);
  if Assigned(FOnProgress) then
    FOnProgress(Self, FProcessed / FSize);
end;

function TProgressFileStream.Write(const Buffer; Count: Integer): Integer;
begin
  Result := inherited Write(Buffer, Count);
  Inc(FProcessed, Result);
  if Assigned(FOnProgress) then
    FOnProgress(Self, FProcessed / FSize);
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TProgressFileStream;
begin
  ADOQuery1.Open;
  Stream := TProgressFileStream.Create('H:\Delphi\Blobtest.docx', fmOpenRead);
  try
    Stream.OnProgress := StreamProgress;
    Stream.InitProgressCounter(Stream.Size);
    ADOQuery1.Append;
    ADOQuery1Blob.LoadFromStream(Stream);
    ADOQuery1.Post;
  finally
    Stream.Free;
  end;
  Stream := TProgressFileStream.Create('H:\Delphi\Blobtest2.docx', fmCreate);
  try
    ADOQuery1.Last;
    Stream.OnProgress := StreamProgress;
    Stream.InitProgressCounter(ADOQuery1Blob.BlobSize);
    ADOQuery1Blob.SaveToStream(Stream);
  finally
    Stream.Free;
  end;
end;

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

end.
单元1;
接口
使用
系统、类、控件、窗体、XPMan、Db、COMCTRL、STDCRLS、AdoDB;
类型
tstreamprogressent=过程(发送方:TObject;
对象的百分比(单个);
TProgressFileStream=class(TFileStream)
私有的
FOnProgress:TStreamProgressent;
FProcessed:Int64;
FSize:Int64;
公众的
程序初始化进程计数器(ASize:Int64);
函数读取(变量缓冲区;计数:整数):整数;推翻
函数写入(常量缓冲区;计数:整数):整数;推翻
OnProgress属性:TStreamProgressEvent read FOnProgress
撰写进度报告;
结束;
TForm1=类(TForm)
ADOQuery1:TADOQuery;
ADOQuery1ID:TAutoIncField;
adokery1blob:tblobbield;
按钮1:t按钮;
ProgressBar:TProgressBar;
程序按钮1点击(发送方:ToObject);
私有的
流程流程进度(发送方:ToObject;百分比:Single);
结束;
变量
表1:TForm1;
实施
{$R*.dfm}
{TProgressFileStream}
过程TProgressFileStream.InitProgressCounter(ASize:Int64);
开始
FProcessed:=0;

如果是ASize,您可以修改为
TResourceStream.SaveToFile
编写的文件。这里也有同样的建议:谢谢,我来看看这两个suggestions@NGLN您使用的过程SaveToFile属于从TResourceStream继承的对象,但在我的例子中,我想使用属于TBloBField classYes的SaveToFile过程,我明白了。因此,这是一个评论,而不是一个答案。不过今天下午我会研究的。谢谢,这是这里提出的解决方案,我正在查看。谢谢@NGLN,这正是我想要的,我会尽快尝试代码。