Zmiana wartości ProgressBara pokazaującego postęp kopiowanego pliku.

0

jak ustawic progress bar ktory zmienia sie wraz z iloscia sckopiowanego pliku?

wiem ze to jest w FAQ ale tam jest sam skrypt prosze zeby ktos napisal cos w stylu tutoriala

0

Powtórz

  1. Ustaw max progressbaru na wielkość pliku wejściowego.
  2. Otwórz plik wejściowy
  3. Otwórz plik wyjściowy
  4. Pobierz bajt z pliku wejściowego
  5. Zwiększ procent progressbara
  6. Zapisz bajt do pliku wyjściowego
    Dopuki będzie koniec pliku

aha potrzebna ci funkcja do sprawdzenia wielkości pliku:

function wielkoscpliku(filename:string):int64;
var f:file of byte;
begin
assignfile(f,filename);
reset(f);
result:=filesize(f);
closefile(f);
end;

łatwa krótka i praktyczna;)

0

no sprobuje ale vczy mi wyjdzie to gloiwy nie dam jutro lece kupic ksiazeczke ;p

jak by co to jescze tu popytam

0
  1. Pobierz bajt z pliku wejściowego
  2. Zwiększ procent progressbara
  3. Zapisz bajt do pliku wyjściowego

Bajt?? Lepiej z 4KB - będzie szybciej.

0

Coz... bedziesz musial skorzystac z funkcji BlockRead.

procedure TMainForm.btnCopyClick(Sender: TObject);
var
SrcFile, DstFile : File; { plik źródłowy i plik przeznaczenia }
FSize : Integer; { rozmiar kopiowanego pliku }
Bytes : Integer; { ilość odczytanych danych }
Buffer : array[0..255] of byte; { bufor przechowujący dane }
TotalSize : Integer; { ilość skopiowanych już bajtów }
begin
if OpenDialog.Execute then
begin
{ wyświetl na etykiecie ścieżkę kopiowanego pliku }
lblFile.Caption := 'Plik ' + OpenDialog.FileName;
AssignFile(SrcFile, OpenDialog.FileName);
try
Reset(SrcFile, 1); { otwórz plik }
FSize := FileSize(SrcFile); { odczytaj rozmiar pliku }
pbCopy.Max := (FSize div 1000); { max. pozycja na pasku postępu }

  AssignFile(DstFile, 'C:' + ExtractFileName(OpenDialog.FileName) + '~');
  try
  { utwórz plik }
    Rewrite(DstFile, 1);

    repeat
      Application.ProcessMessages;

      { odczytaj dane }
      BlockRead(SrcFile, Buffer, SizeOf(Buffer), Bytes);
      if Bytes > 0 then  { jeżeli liczba odczytanych bajtów jest większa od 0 }
      begin
      { przypisz odczytane dane do pliku }
        BlockWrite(DstFile, Buffer, Bytes);
        TotalSize := TotalSize + Bytes;
      end;
      { pozycja na pasku postępu }
      pbCopy.Position := (TotalSize div 1000);
      
    until Bytes = 0;

  finally
    CloseFile(DstFile);
  end;

finally
  CloseFile(SrcFile);
end;

end;
end;

Ostatni parametr owej procedury (BlockRead) zawiera liczba bajtow ktore zostaly odczytane. I teraz za kazda iteracja petli odczytujesz kolejny fragment pliku. W tym momencie liczba odczytanych juz bajtow, zwieksza sie. Mozna juz zmieniac wlasciwosc Position komponentu TProgressBar.

Przed wykonywaniem petli przypisujesz wlasciwosci Max, rozmiar pliku, czyli:

ProgressBar.Max := FileSize(F);

Mozna jednak podzielic te wartosc przez 1000, bo moze zabraknac skali przy wiekszych plikach :)

Mam nadzieje, ze zrozumiales - jak nie - wal tutaj...

0

czyli msuze wrzucic komponenty:

button
progressbar
i open dialog?

przestudiuje to dzis do poduszki

p.s. bardzo dobra ksiazka Adam

1 użytkowników online, w tym zalogowanych: 0, gości: 1