Avatar billede ziron Nybegynder
16. april 2001 - 22:40 Der er 14 kommentarer og
1 løsning

copyfile og ProgressBar????

når jeg laver en copy file kan jeg så få en ProgressBar til at følge med?????

hjælp meget hurtigt, PLEAS....

/ZIRON
Avatar billede nico26 Nybegynder
16. april 2001 - 23:25 #1
Jeg har lavet en lidt alternativ løsning.


procedure TForm1.Button1Click(Sender: TObject);
const
  BLOCKSIZE = 1024;
var
  Source,
  Dest: TFileStream;
  Buffer: array[0..BLOCKSIZE - 1] of Byte;
  BytesRead, TotalRead: Longint;
begin
  Source := TFileStream.Create(\'SourceFilnavn\', fmOpenRead);
  Dest  := TFileStream.Create(\'DestFilnavn\', fmCreate);

  TotalRead := 0;

  try
    repeat
      BytesRead := Source.Read(Buffer, BLOCKSIZE);
      Dest.Write(Buffer, BytesRead);
      Inc(TotalRead, BytesRead);

      ProgressBar1.Position := Source.Size div TotalRead * ProgressBar1.Max;
    until BytesRead < BLOCKSIZE;
  finally
    Source.Free;
    Dest.Free;
  end;
end;
Avatar billede ziron Nybegynder
16. april 2001 - 23:32 #2
nico22 >> det virker ikke helt, progresbaren kører helt igennem lige i starten, den følger ikke hvor mange byte der er kopiret????

/ZIRON
Avatar billede nico26 Nybegynder
16. april 2001 - 23:35 #3
ja du skal bytte om på Source.Size og TotalRead
Avatar billede nico26 Nybegynder
16. april 2001 - 23:37 #4
Det virker alligevel ikke ordentligt da progressbaren ikke bliver opdateret undervej. Du bliver nok nødt til at lægge det i en tråd.
Avatar billede ziron Nybegynder
16. april 2001 - 23:39 #5
okay, jeg tænkte også på om man ikke kan lave det med copyfile for med en TFileStream bliver ens ram jo spist sådan???

hvad mener du med en tråd og hvordan????
Avatar billede nico26 Nybegynder
16. april 2001 - 23:57 #6
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;

type
  TFileCopy = class(TThread)
  private
    FSourceName,
    FDestName: string;
    FPosition: Double;
    procedure UpdateProgress;
  protected
    procedure Execute; override;
  public
    constructor Create(const Source, Dest: string);
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    ProgressBar1: TProgressBar;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TFileCopy }

constructor TFileCopy.Create(const Source, Dest: string);
begin
  FSourceName := Source;
  FDestName := Dest;
  inherited Create(False);
end;

procedure TFileCopy.Execute;
const
  BLOCKSIZE = 1024;
var
  Source,
  Dest: TFileStream;
  Buffer: array[0..BLOCKSIZE - 1] of Byte;
  BytesRead, TotalRead: Longint;
begin
  FreeOnTerminate := True;

  Source := TFileStream.Create(FSourceName, fmOpenRead);
  Dest  := TFileStream.Create(FDestName, fmCreate);

  TotalRead := 0;

  try
    repeat
      BytesRead := Source.Read(Buffer, BLOCKSIZE);
      Dest.Write(Buffer, BytesRead);
      Inc(TotalRead, BytesRead);

      FPosition := TotalRead / Source.Size;
      Synchronize(UpdateProgress);
    until BytesRead < BLOCKSIZE;
  finally
    Source.Free;
    Dest.Free;
  end;
end;

procedure TFileCopy.UpdateProgress;
begin
  Form1.ProgressBar1.Position := Round(FPosition * Form1.ProgressBar1.Max);
end;

{ TForm1 }

procedure TForm1.Button2Click(Sender: TObject);
begin
  TFileCopy.Create(\'Source\', \'Dest\');
end;

end.
Avatar billede nico26 Nybegynder
17. april 2001 - 00:00 #7
nu virker det i hvert fald. Jeg ved ikke hvor effektiv dette her er i forhold til CopyFile. Men for at du skal kunne lave en progress, er du jo nødt til at få en eller anden status undervejs, om hvor mange bytes der er kopieret, og det giver CopyFile ikke. :(
Avatar billede ziron Nybegynder
17. april 2001 - 00:06 #8
okay nico22 det må jeg sige.. Jeg takker mange gange...

/ZIRON
Avatar billede martinlind Nybegynder
17. april 2001 - 09:12 #9
Det var da voldsom at lave en tråd, du skal bare lave en Refresh på din ProgressBar eller en Application.ProssesMessages så opdatere den fint, problemmet er at disk assec tager alt windows tiden så der ikke er tid til skræmopdat.
Avatar billede ziron Nybegynder
17. april 2001 - 09:26 #10
okay men nu er jeg ikke helt så meget inden i delphi, men det virker så er jeg glad, men hvis det kan laves letter og på en bredre måde ville det da være dejligt at vide hvordan...
Avatar billede martinlind Nybegynder
17. april 2001 - 09:34 #11
begin
  Source := TFileStream.Create(\'SourceFilnavn\', fmOpenRead);
  Dest  := TFileStream.Create(\'DestFilnavn\', fmCreate);

  TotalRead := 0;

  try
    repeat
      BytesRead := Source.Read(Buffer, BLOCKSIZE);
      Dest.Write(Buffer, BytesRead);
      Inc(TotalRead, BytesRead);

      ProgressBar1.Position := Source.Size div TotalRead * ProgressBar1.Max;
  Application.ProssesMessages; // Denne nye line er nok !!!!!!
    until BytesRead < BLOCKSIZE;
  finally
    Source.Free;
    Dest.Free;
  end;


/Martin
Avatar billede ziron Nybegynder
17. april 2001 - 09:38 #12
okay prøver det når jeg kommer hjem og så kunne det jo godt være der kom 1 point som tak for hjælpen...

/ZIRON
Avatar billede nico26 Nybegynder
17. april 2001 - 13:37 #13
martinlind>>jeg prøvede med Application.ProcessMessages - men det virkede ikke
Avatar billede nico26 Nybegynder
17. april 2001 - 13:38 #14
for øvrigt er det vel okay at lave en tråd. Hvis det er en meget stor fil du kopiere, og det ikke er trådet blokerer programmet jo indtil filen er kopieret
Avatar billede martinlind Nybegynder
17. april 2001 - 13:44 #15
Det må være en fejl i progressbar\'en, for den burde sende en repaint når du ændre position, og prossesmessages tømmer messageskøen så det burde virker, måske skal du prøve at ProgressBar1.Refresh inden ProssesMessages, men du har da ret i at hvis det er en stor fil \"hænger\" programmet, bortset fra at du netup ved at bruge prosessMessages giver windows \"lov\" til at behandle sine messages.

/Martin
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester