Delphi LoadFromFile 함수를 사용하여 Table1BLOBFIELD.LoadFromFile ('C : \ xxx.avi')과 검색 할 SaveToFile 명령을 삽입합니다. 이 삽입/검색은 오히려 시간 낭비입니다 (몇 분). 그것 경우에만 모래 시계 모양의 커서 대신 progressbar (종류) 표시 할 수 있으면 좋을 것이다. SaveToFile을 사용할 때 타이머를 사용하고 파일 크기가 인 지 확인할 수 있습니다 (스레드가 없으면 작동하지 않지만). 그러나 이것은 LoadFromFile에 대한 솔루션입니다. 누군가 특정 해결책, 힌트를 가지고 있습니까? ...? 미리 감사드립니다.loadfromfile 함수의 진행 표시 줄
답변
어떻게 여기 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.
있지만,이 나타내는 실제 진행이있다 데이터베이스 통신을 포함한 전반적인 프로세스.
고마워요. @NGLN, 정확히 내가 찾고 있던 것이 었습니다. 최대한 빨리 코딩하십시오. – riad
나는 지연이 파일을 읽는 것이 아니라 데이터베이스의 레코드를 생각한다고 생각합니다. 나는 당신이 파일 크기와 "TTimer"를 사용하여 프로젝트 진척 상황에 따라 견적을 내릴 수 있다고 생각하지만,이 읽기를 위해 파일은 나머지 응용 프로그램 (메인 스레드) 래치가되도록
고마워, 여기에 제안 된 해결책은 http://delphigroups.info/2/c3/138402.html이고 나는 그것을 조사하고있다. – riad
- 1. 진행 표시 줄 문제
- 2. Android의 진행 표시 줄
- 3. 진행 표시 줄 너비
- 4. 진행 표시 줄
- 5. WinForms의 진행 표시 줄
- 6. 진행 표시 줄 무기한
- 7. # backgroundworker가있는 진행 표시 줄
- 8. Tkinter를 진행 표시 줄
- 9. 이미지가있는 진행 표시 줄
- 10. 버튼의 진행 표시 줄
- 11. 자동 진행 표시 줄
- 12. 애니메이션이 진행 표시 줄
- 13. 다중 진행 표시 줄
- 14. 유연한 진행 표시 줄
- 15. 진행 표시 줄
- 16. 진행 표시 줄 도움말
- 17. 스레드가있는 진행 표시 줄
- 18. android.R.layout.simple_list_item_checked의 진행 표시 줄
- 19. 연속 진행 표시 줄
- 20. 이미지가있는 진행 표시 줄
- 21. 프로세스가있는 진행 표시 줄
- 22. Java로드/진행 표시 줄
- 23. 진행 표시 줄 전경색
- 24. NSURLConnection이있는 진행 표시 줄
- 25. JSP의 진행 표시 줄
- 26. setImageWithURLRequest가있는 진행 표시 줄
- 27. 데이터베이스 진행 상황을 보여주는 진행 표시 줄
- 28. JavaScript로 애니메이션 진행 HTML5 진행 표시 줄
- 29. 진행 표시 줄 진행 속도 줄이기
- 30. 애플릿이로드되는 동안 진행 표시 줄
당신은'TResourceStream.SaveToFile'을 위해 작성된 [이 답변] (http://stackoverflow.com/a/6082206/757830)을 수정할 수 있습니다. – NGLN
같은 종류의 제안은 여기에 있습니다. http://www.delphigroups.info/2/c3/138402.html –
감사합니다. 두 가지 제안을 살펴 보겠습니다. – riad