SourStream:TFileStream.Create(FName,fmOpenRead);
TempStream:TMemoryStream.Create; 我只会
TBlobField(FieldByName('DocFile')).LoadFromStream(TempStream); 如何用流的方法实现存储进度显示呢????

解决方案 »

  1.   

    有办法了,Mark先,等下写段代码
      

  2.   

    哈,最后以失败而告终,只解决了一部分,LoadFromStream部分的解决了,后面的没解决
    跟踪代码到Recordset.Update(EmptyParam, EmptyParam);ADODB.pas的4473行(Delphi7)发现接下来的调用没法弄了,呵呵
    代码如下
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, DB, ADODB, ComCtrls;type
      TForm1 = class(TForm)
        ADOQuery1: TADOQuery;
        Button2: TButton;
        ProgressBar1: TProgressBar;
        ADOConnection1: TADOConnection;
        Button4: TButton;
        ADOQuery1file_name: TWideStringField;
        ADOQuery1file_content: TBlobField;
        procedure Button2Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;type
      TMyBlobField = class(TBlobField)
      public
        procedure LoadFromStream(Stream: TStream; ProgressBar: TProgressBar);
      end;  TMyStream = class(TStream)
      public
        function CopyFrom(Source: TStream; Count: Int64; ProgressBar: TProgressBar): Int64;
      end;var
      Form1: TForm1;
      M1: TMemoryStream;
      F1: TFileStream;implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
    begin
      M1 := TMemoryStream.Create;
      F1 := TFileStream.Create('G:\F4-第一时间.rm', fmOpenRead);
    end;{ TMyBlobField }procedure TMyBlobField.LoadFromStream(Stream: TStream; ProgressBar: TProgressBar);
    begin
      with TMyStream(DataSet.CreateBlobStream(Self, bmWrite)) do
      try
        CopyFrom(Stream, Stream.Size, ProgressBar);
      finally
        Free;
      end;
    end;{ TMyStream }function TMyStream.CopyFrom(Source: TStream; Count: Int64; ProgressBar: TProgressBar): Int64;
    const
      MaxBufSize = $F000;
    var
      BufSize, N: Integer;
      Buffer: PChar;
    begin
      if Count = 0 then
      begin
        Source.Position := 0;
        Count := Source.Size;
      end;
      Result := Count;
      ProgressBar.Max := Count;
      if Count > MaxBufSize then BufSize := MaxBufSize else BufSize := Count;
      GetMem(Buffer, BufSize);
      try
        while Count <> 0 do
        begin
          if Count > BufSize then N := BufSize else N := Count;
          Source.ReadBuffer(Buffer^, N);
          WriteBuffer(Buffer^, N);
          Dec(Count, N);
          ProgressBar.StepBy(N);
          ProgressBar.Update;
        end;
      finally
        ProgressBar.Position := 0;
        FreeMem(Buffer, BufSize);
      end;
    end;procedure TForm1.Button4Click(Sender: TObject);
    begin
    //select * from Table_2
      with ADOQuery1 do
      begin
        Close;
        Open;
        First;
        Edit;
        FieldByName('file_name').Value := 'G:\孙燕姿Stefanie.rmvb';
        TMyBlobField(FieldByName('file_content')).LoadFromStream(F1, Self.ProgressBar1);
        Post;
        Close;
      end;
    end;end.
      

  3.   

    还是自己解决了.不过要多谢postren(小虫)的帮助,给了我思路.应该使用TSteam.解决办法如下:
    var
     SourStream :TFileStream;
     DestStream :TStream;
     Buf: array [1..1024*100] of Char;
    .........
    .........
             SourStream:=TFileStream.Create(FName,fmOpenRead);
             DestStream:=CreateBlobStream(FieldByName('DocFile'),bmWrite);         SourStream.Position:=0;
             PBForm:= TPBForm.Create( Nil );
             PBForm.show;
             PBForm.FormStyle:=fsStayOnTop;
              try
                while SourStream.Position<SourStream.Size do//如果指针位置不到文件末尾
                begin
                  application.ProcessMessages ;
                  PBForm.PB1.Position :=Trunc(SourStream.Position/SourStream.Size*100);
                  SourStream.Read(Buf,SizeOf(Buf));//读取
                  DestStream.Write(Buf,SizeOf(Buf));//写入
                end;
                //TBlobField(FieldByName('DocFile')).LoadFromStream(TempStream);
              finally
                PBForm.Close;
                SourStream.Free;//释放
                DestStream.Free;//释放
              end;
    ............
    ............