Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
{ 1. }
{
You need a TProgressBar on your form for this tip.
Fьr diesen Tip wird eine TProgressBar benцtigt.
}
procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string
);
var
FromF, ToF: file
of
byte;
Buffer: array
[0..4096] of
char;
NumRead: integer;
FileLength: longint;
begin
AssignFile(FromF, Source);
reset(FromF);
AssignFile(ToF, Destination);
rewrite(ToF);
FileLength := FileSize(FromF);
with
Progressbar1 do
begin
Min := 0;
Max := FileLength;
while
FileLength > 0 do
begin
BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
FileLength := FileLength - NumRead;
BlockWrite(ToF, Buffer[0], NumRead);
Position := Position + NumRead;
end
;
CloseFile(FromF);
CloseFile(ToF);
end
;
end
;
procedure
TForm1.Button1Click(Sender: TObject);
begin
CopyFileWithProgressBar1('c:WindowsWelcome.exe', 'c: empWelcome.exe');
end
;
{ 2. }
{***************************************}
// To show the estimated time to copy a file:
procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string
);
var
FromF, ToF: file
of
byte;
Buffer: array
[0..4096] of
char;
NumRead: integer;
FileLength: longint;
t1, t2: DWORD;
maxi: integer;
begin
AssignFile(FromF, Source);
reset(FromF);
AssignFile(ToF, Destination);
rewrite(ToF);
FileLength := FileSize(FromF);
with
Progressbar1 do
begin
Min := 0;
Max := FileLength;
t1 := TimeGetTime;
maxi := Max div
4096;
while
FileLength > 0 do
begin
BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
FileLength := FileLength - NumRead;
BlockWrite(ToF, Buffer[0], NumRead);
t2 := TimeGetTime;
Min := Min + 1;
// Show the time in Label1
label1.Caption := FormatFloat('0.00', ((t2 - t1) / min * maxi - t2 + t1) / 100);
Application.ProcessMessages;
Position := Position + NumRead;
end;
CloseFile(FromF);
CloseFile(ToF);
end
;
end
;
{ 3. }
{***************************************}
// To show the estimated time to copy a file, using a callback function:
type
TCallBack = procedure
(Position, Size: Longint);
{ export; }
procedure FastFileCopy(const
InFileName, OutFileName: string
;
CallBack: TCallBack);
implementation
procedure
FastFileCopyCallBack(Position, Size: Longint);
begin
Form1.ProgressBar1.Max := Size;
Form1.ProgressBar1.Position := Position;
end
;
procedure
FastFileCopy(const
InFileName, OutFileName: string
;
CallBack: TCallBack);
const
BufSize = 3 * 4 * 4096;
{ 48Kbytes gives me the best results }
type
PBuffer = ^TBuffer;
TBuffer = array
[1..BufSize] of
Byte;
var
Size: DWORD;
Buffer: PBuffer;
infile, outfile: file
;
SizeDone, SizeFile: LongInt;
begin
if
(InFileName <> OutFileName) then
begin
buffer := nil
;
Assign(infile, InFileName);
Reset(infile, 1);
try
SizeFile := FileSize(infile);
Assign(outfile, OutFileName);
Rewrite(outfile, 1);
try
SizeDone := 0;
New(Buffer);
repeat
BlockRead(infile, Buffer^, BufSize, Size);
Inc(SizeDone, Size);
CallBack(SizeDone, SizeFile);
BlockWrite(outfile, Buffer^, Size)
until
Size < BufSize;
FileSetDate(TFileRec(outfile).Handle,
FileGetDate(TFileRec(infile).Handle));
finally
if
Buffer <> nil
then
Dispose(Buffer);
CloseFile(outfile)
end
;
finally
CloseFile(infile);
end
;
end
else
raise
EInOutError.Create('File cannot be copied onto itself')
end
;
{FastFileCopy}
procedure TForm1.Button1Click(Sender: TObject);
begin
FastFileCopy('c:daten.txt', 'c: estdaten2.txt', @FastFileCopyCallBack);
end
;
{ 4. }
{***************************************}
function CopyFileWithProgressBar2(TotalFileSize,
TotalBytesTransferred,
StreamSize,
StreamBytesTransferred: LARGE_INTEGER;
dwStreamNumber,
dwCallbackReason: DWORD;
hSourceFile,
hDestinationFile: THandle;
lpData: Pointer): DWORD; stdcall
;
begin
// just set size at the beginning
if dwCallbackReason = CALLBACK_STREAM_SWITCH then
TProgressBar(lpData).Max := TotalFileSize.QuadPart;
TProgressBar(lpData).Position := TotalBytesTransferred.QuadPart;
Application.ProcessMessages;
Result := PROGRESS_CONTINUE;
end
;
function
TForm1.CopyWithProgress(sSource, sDest: string
): Boolean;
begin
// set this FCancelled to true, if you want to cancel the copy operation
FCancelled := False;
Result := CopyFileEx(PChar(sSource), PChar(sDest), @CopyFileWithProgressBar2,
ProgressBar1, @FCancelled, 0);
end
;
end
;