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
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
Powtórz
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;)
no sprobuje ale vczy mi wyjdzie to gloiwy nie dam jutro lece kupic ksiazeczke ;p
jak by co to jescze tu popytam
- Pobierz bajt z pliku wejściowego
- Zwiększ procent progressbara
- Zapisz bajt do pliku wyjściowego
Bajt?? Lepiej z 4KB - będzie szybciej.
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...
czyli msuze wrzucic komponenty:
button
progressbar
i open dialog?
przestudiuje to dzis do poduszki
p.s. bardzo dobra ksiazka Adam
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.