Форум: "Начинающим";
Текущий архив: 2010.08.29;
Скачать: [xml.tar.bz2];
ВнизКопирование с индикатором процесса Найти похожие ветки
← →
akosh12345 © (2010-06-07 20:07) [0]У меня возник вопрос при копировании. Копирую так
// КОПИРОВАНИЕ ТОЛЬКО ДЛЯ ФАЙЛОВ
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?
← →
Leonid Troyanovsky © (2010-06-07 22:09) [1]
> akosh12345 © (07.06.10 20:07)
> const
> BufSize = 3 * 4 * 4096; { 48Kbytes gives me the best results
> }
64K даст мне результат лучше.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2010-06-07 22:12) [2]
> Еще один вопрос. Я создал динамически объкт. Как я могу
> обработать события этого объеска типа OnCreate?
OnCreate :=
--
Regards, LVT.
← →
akosh12345 © (2010-06-07 23:02) [3]почему 64кб лучше?
← →
akosh12345 © (2010-06-07 23:03) [4]почему 64кб лучше?
← →
Leonid Troyanovsky © (2010-06-07 23:06) [5]
> akosh12345 © (07.06.10 23:02) [3]
> почему 64кб лучше?
Бо оно даст мне лучший результат.
--
Regards, LVT.
← →
akosh12345 © (2010-06-07 23:07) [6]поясни почему оно лучше? аргументы
← →
Leonid Troyanovsky © (2010-06-07 23:16) [7]
> akosh12345 © (07.06.10 23:07) [6]
> поясни почему оно лучше? аргументы
Сначала пусть выскажется автор кода (ремарки).
Ну, а потом можно устроить соревнования 48 vs 64.
Результаты можно опубликовать здесь, IMHO.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2010-06-07 23:27) [8]Да, и еще. Про Application.ProcessMessages читали-с?
Хотя, я не поклонник. Ка, впрочем, и всяких BlockRead.
--
Regards, LVT.
← →
akosh12345 © (2010-06-07 23:55) [9]ну давайте устроим совернование между 48vs64ъ
← →
Германн © (2010-06-08 01:27) [10]
> 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?
← →
brother © (2010-06-08 05:49) [11]код копипаст с сайта:
http://base.vingrad.ru/view/996-Kopirovanie-faylov
вопросы?))))
← →
brother © (2010-06-08 07:09) [12]> вопросы?))))
те видим оригинал и добавления... теперь можно и вопросы?)
← →
begin...end © (2010-06-08 10:08) [13]CopyFileEx, lpProgressRoutine -- оно не проще?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.08.29;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.002 c