Autor |
Beitrag |
LonghornUser
      
Beiträge: 796
|
Verfasst: Fr 10.02.06 21:23
Hallo,
ich möchte, wie der Titel schon sagt, eine Reihe von Dateien mit Fortschrittsbalken kopieren.
Ich habe 20 Dateien, die in verschiedene Verzeichnisse kopiert werden sollen. Jetzt möchte ich, dass ein Fortschrittsbalken den Gesamtprozess anzeigt. Wie ich das für eine Datei mache, weiß ich bereits (habe einen Tipp bei (glaube) Swissdelphicenter gefunden). Aber wie mache ich es, dass Eine Progressbar den Fortschritt ALLER Dateien anzeigt ? Geht das ? Ich meine, wie in einer normalen Installation.
Danke schonmal.
Ciao LonghornUser
|
|
Danniolo
      
Beiträge: 693
|
Verfasst: Fr 10.02.06 21:29
Indem du einfach den Progress aller zusammenziehst und dann in dem Fortschrittsbalken anzeigts.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 11.02.06 00:43
@Danniolo: Solch eine Antwort bringt keinem was. Er wollte es per Shell wissen (soweit ich das bei ihm entnehme) und nicht, wie man's in Delphi löst.
@LHUser: In den ShellOperation-Strukturen werden die Dateinamen der zu bearbeitenden Dateien nullterminiert spezifiziert. Diese API-Funktion ist grundsätzlich dazu gedacht, um mit Listen von Dateien zu arbeiten, weshalb man die Liste mit einem zusätzlichen zweiten #0 abschließen muss.
Dazu kannst Du als Grundlage den Source von DSDT nutzen und musst dabei für ASource und ADest einfach deine jeweils paarweisen Zuordnungen von Quell- und Zieldateinamen angeben:
Delphi-Quelltext 1:
| CopyFileEx('A.txt'#0'B.txt'#0'C.txt', 'A.txt.bak'#0'B.txt.bak'#0'C.txt.bak', true); |
Innerhalb des Beispielsources muss lediglich das Flag FOF_SILENT entfernt werden.
HTH.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Mo 13.02.06 16:05
Alles klar. Jetzt gehts  Danke !
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Fr 03.03.06 23:04
Mhm, habe jetzt doch gemerkt. Also die Dateiliste hab ich, aber die Progressbar. Wo wird die denn eingebunden ??
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Fr 03.03.06 23:12
Oder könnte man die Prozedur
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| Procedure TForm1.CopyFileWithProgressBar(Source, Destination : string); var FromF, ToF : file of byte; Buffer : array[0..4096] of char; NumRead : integer; FileLength : longint; begin AssignFile(FromF,Source); reset(FromF); AssignFile(ToF,Destination); rewrite(ToF); FileLength:=FileSize(FromF); With Progressbar1 do begin Min := 0; Max := FileLength; while FileLength > 0 do begin BlockRead(FromF,Buffer[0],SizeOf(Buffer),NumRead); FileLength := FileLength - NumRead; BlockWrite(ToF,Buffer[0],NumRead); Position := Position + NumRead; end; CloseFile(FromF); CloseFile(ToF); end; end; |
eventuell so umschreiben, dass für die "Quelldateien" eine Listbox.Items als parameter übergeben wird und als "ZielDatei" ein Verzeichnis ?
Also so:
Quelltext 1:
| Procedure TForm1.CopyFileWithProgressBar(SourceFiles:TStrings, DestinationFolder : string); |
|
|
fuba
      
Beiträge: 125
Win7
D7 Ent.
|
Verfasst: Mo 24.04.06 19:36
ich habs so gemacht:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| function PProgressRoutine(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: LARGE_INTEGER; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle; lpData: Pointer): DWORD; stdcall; begin if dwCallbackReason = CALLBACK_STREAM_SWITCH then TProgressBar(lpData).max := TotalFileSize.QuadPart;
TProgressBar(lpData).Position := TotalBytesTransferred.QuadPart; Application.ProcessMessages; Result := PROGRESS_CONTINUE; end;
procedure ListCopyProgress(const Files: TStrings; const aDestDir: string; TotalProgressBar, CurrentProgressBar: TProgressBar); var x, y : integer; S: string; begin FCancelled := False; x:=Files.Count; TotalProgressBar.Min:=0; TotalProgressBar.Max:=x; S:=ExcludeTrailingPathDelimiter(aDestDir) + '\'; for y:=0 to x-1 do begin CopyFileEx(PChar(Files[y]), PChar(S + ExtractFileName(Files[y])), @PProgressRoutine, CurrentProgressBar, @FCancelled, 0); TotalProgressBar.Position:=y+1; end; end; |
Moderiert von Narses: Komplett-Zitat des letzen Beitrags entfernt
Einloggen, um Attachments anzusehen!
|
|
whitef
      
Beiträge: 202
Erhaltene Danke: 1
Windows X
Delphi XE X
|
Verfasst: Mi 15.10.08 18:22
nettes programm, gibts da auch ne verison in der man ein ordner in die listbox droppen oder öffnen kann, so das der komplette inhalt (+unterordner) verarbeitet wird?
|
|
|