![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Копирование с индикатором процесса [XP]
akosh12345 © (2010-06-07 20:07:00)У меня возник вопрос при копировании. Копирую так
// КОПИРОВАНИЕ ТОЛЬКО ДЛЯ ФАЙЛОВ
procedure CopyFileThread.Execute;
const
BufSize = 3 * 4 * 4096; { 48Kbytes gives me the best results }
type
PBuffer = ^TBuffer;
TBuffer = array[1..BufSize] of Byte;
var
Buffer: PBuffer;
infile, outfile: file;
begin
if (InFileName <> OutFileName) then
begin
buffer := nil;
Assign(infile, InFileName);
Reset(infile, 1);
try
SizeFile := FileSize(infile);
MasCopy[ForMas - 1].Progres.Max := SizeFile;
Assign(outfile, OutFileName);
Rewrite(outfile, 1);
try
SizeDone := 0;
New(Buffer);
repeat
BlockRead(infile, Buffer^, BufSize, Size);
Inc(SizeDone, Size);
Synchronize(SetProgeress);
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');
MasCopy[ForMas - 1].Progres.Position := 0;
end; {FastFileCopy}
procedure CopyFileThread.SetProgeress;
begin
MasCopy[ForMas - 1].Progres.Position := SizeDone;
MasCopy[ForMas - 1].Procent.Caption := Inttostr(Round((size/MasCopy[ForMas - 1].Progres.Max))) + '%';
end;
// КОПИРОВАНИЕ ТОЛЬКО ДЛЯ ФАЙЛОВ ВЫШЕ
Создаю динамически массив типа записи:
FirstCopyForm = Record // шаблон формы копирования
Form : TForm;
NameCopy, Procent, V, Time : TLabel;
Progres : TProgressBar;
OkOrCansel : TButton;
End;
MasCopy : array of FirstCopyForm; // создаю массив для динамического копирования, все переменные исп для этого до //////
ForMas : Integer; // размер массива
задаю так копирование
OutFileName := ToCopy.Text;
ForMas := ForMas + 1;
SetLength(MasCopy, ForMas);
InitMasCell(MasCopy, ForMas);
FileThread := CopyFileThread.Create(false);
FileThread.FreeOnTerminate := true;
FileThread.Priority := Prior;
Процедура InitMasCell(MasCopy, ForMas);
procedure InitMasCell ( var Mas : array of FirstCopyForm; TekInit : integer);
begin
// инициализирую все компоненты для отображние формы копирования
With Mas[TekInit-1] do
Begin
Form := TForm.Create(nil);
NameCopy := TLabel.Create(Form);
Procent := TLabel.Create(Form);
V := TLabel.Create(Form);
Time := TLabel.Create(Form);
OkOrCansel := TButton.Create(Form);
Progres := TProgressBar.Create(Form);
////////////////////////////////////////////////////////////////
// обработка основных надписей
NameCopy.Parent := Form;
NameCopy.Left := 6;
NameCopy.Top := 3;
NameCopy.Height := 13;
NameCopy.Width := 79;
NameCopy.Font.Style := [fsBold];
NameCopy.Caption := 'Копирование';
Procent.Parent := Form;
Procent.Left := 190;
Procent.Top := 21;
Procent.Width := 17;
Procent.Height := 13;
Procent.Font.Style := [fsBold];
Procent.Caption := '0%';
Progres.Parent := Form;
Progres.Left := 6;
Progres.Top := 20;
Progres.Width := 179;
Progres.Height := 18;
OkOrCansel.Parent := Form;
OkOrCansel.Left := 220;
OkOrCansel.Top := 18;
OkOrCansel.Width := 60;
OkOrCansel.Height := 20;
OkOrCansel.TabStop := False;
OkOrCansel.Caption := 'Пауза';
// обработка формы копирования
Form.Parent := nil;
Form.Position := poScreenCenter;
Form.Caption := '';
Form.Width := 294;
Form.Height := 72;
Form.OnCreate :=
Form.Show;
End;
end;
Вопрос состоит в том, что не вычисляется, сколько процентов скопировалось. Почему так?
Еще один вопрос. Я создал динамически объкт. Как я могу обработать события этого объеска типа OnCreate?
begin...end (2010-06-08 10:08:00) [1]CopyFileEx, lpProgressRoutine -- оно не проще?
brother (2010-06-08 07:09:00) [2]> вопросы?))))
те видим оригинал и добавления... теперь можно и вопросы?)
brother (2010-06-08 05:49:00) [3]код копипаст с сайта:
http://base.vingrad.ru/view/996-Kopirovanie-faylov
вопросы?))))
Германн (2010-06-08 01:27:00) [4]
> akosh12345 © (07.06.10 23:55) [9]
>
> ну давайте устроим совернование между 48vs64ъ
>
Лучше бы сделал простой тестовый пример. И если он не работает, то обратился бы сюда с вопросом. А то мало ли что такое смешение коней и людей трудночитаемое, Так ещё и вызывает вопросы типа "а что делает вот эта строчка
> else
> raise EInOutError.Create('File cannot be copied onto
> itself');
>
> MasCopy[ForMas - 1].Progres.Position := 0; --вот эта самая
>
> end; {FastFileCopy}
>
вне рамок Synchronize?
akosh12345 (2010-06-07 23:55:00) [5]ну давайте устроим совернование между 48vs64 ъ
Leonid Troyanovsky (2010-06-07 23:27:00) [6]Да, и еще. Про Application.ProcessMessages читали-с?
Хотя, я не поклонник. Ка, впрочем, и всяких BlockRead.
--
Regards, LVT.
Leonid Troyanovsky (2010-06-07 23:16:00) [7]
> akosh12345 © (07.06.10 23:07) [6]
> поясни почему оно лучше? аргументы
Сначала пусть выскажется автор кода (ремарки).
Ну, а потом можно устроить соревнования 48 vs 64.
Результаты можно опубликовать здесь, IMHO.
--
Regards, LVT.
akosh12345 (2010-06-07 23:07:00) [8]поясни почему оно лучше? аргументы
Leonid Troyanovsky (2010-06-07 23:06:00) [9]
> akosh12345 © (07.06.10 23:02) [3]
> почему 64кб лучше?
Бо оно даст мне лучший результат.
--
Regards, LVT.
akosh12345 (2010-06-07 23:03:00) [10]почему 64кб лучше?
akosh12345 (2010-06-07 23:02:00) [11]почему 64кб лучше?
Leonid Troyanovsky (2010-06-07 22:12:00) [12]
> Еще один вопрос. Я создал динамически объкт. Как я могу
> обработать события этого объеска типа OnCreate?
OnCreate :=
--
Regards, LVT.
Leonid Troyanovsky (2010-06-07 22:09:00) [13]
> akosh12345 © (07.06.10 20:07)
> const
> BufSize = 3 * 4 * 4096; { 48Kbytes gives me the best results
> }
64K даст мне результат лучше.
--
Regards, LVT.