2013-02-05 3 views
2

Delphi LoadFromFile 함수를 사용하여 Table1BLOBFIELD.LoadFromFile ('C : \ xxx.avi')과 검색 할 SaveToFile 명령을 삽입합니다. 이 삽입/검색은 오히려 시간 낭비입니다 (몇 분). 그것 경우에만 모래 시계 모양의 커서 대신 progressbar (종류) 표시 할 수 있으면 좋을 것이다. SaveToFile을 사용할 때 타이머를 사용하고 파일 크기가 인 지 확인할 수 있습니다 (스레드가 없으면 작동하지 않지만). 그러나 이것은 LoadFromFile에 대한 솔루션입니다. 누군가 특정 해결책, 힌트를 가지고 있습니까? ...? 미리 감사드립니다.loadfromfile 함수의 진행 표시 줄

+1

당신은'TResourceStream.SaveToFile'을 위해 작성된 [이 답변] (http://stackoverflow.com/a/6082206/757830)을 수정할 수 있습니다. – NGLN

+0

같은 종류의 제안은 여기에 있습니다. http://www.delphigroups.info/2/c3/138402.html –

+0

감사합니다. 두 가지 제안을 살펴 보겠습니다. – riad

답변

7

어떻게 여기 TFileStream 및 하위 클래스하는 방법의 간단한 예는에 OnProgress 이벤트를 추가하기 위해이 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. 

있지만,이 나타내는 실제 진행이있다 데이터베이스 통신을 포함한 전반적인 프로세스.

+0

고마워요. @NGLN, 정확히 내가 찾고 있던 것이 었습니다. 최대한 빨리 코딩하십시오. – riad

1

나는 지연이 파일을 읽는 것이 아니라 데이터베이스의 레코드를 생각한다고 생각합니다. 나는 당신이 파일 크기와 "TTimer"를 사용하여 프로젝트 진척 상황에 따라 견적을 내릴 수 있다고 생각하지만,이 읽기를 위해 파일은 나머지 응용 프로그램 (메인 스레드) 래치가되도록

+0

고마워, 여기에 제안 된 해결책은 http://delphigroups.info/2/c3/138402.html이고 나는 그것을 조사하고있다. – riad