Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1275750948
HRustBB
2010-06-05 19:15
2010.08.29
Как рисовать на TPanel


10-1166182665
CRA5H
2006-12-15 14:37
2010.08.29
Как вызвать JavaScript функцию из Delphi?


2-1275905953
stas
2010-06-07 14:19
2010.08.29
Гарантированно убить Thread


2-1275836698
Askalot
2010-06-06 19:04
2010.08.29
Images


2-1275885990
И. Павел
2010-06-07 08:46
2010.08.29
WM_COMMAND выполняется, но результат <> 0





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский