| Autor |
Beitrag |
ErnestoChe
      
Beiträge: 528
Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
|
Verfasst: Do 23.01.03 10:04
Hi,
wie kann ich in einer Gauge den Fortschritt einer Datenübertragung anzeigen?
Ich habe mit FileSize versucht die Dateigröße zu ermitteln:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| var f1, f2: File of Byte;
{...}
begin AssignFile(f1, Edit1.Text); AssignFile(f2, Edit2.Text); Gauge1.Progress := Round(FileSize(f1)/100* FileSize(f2)); end; |
Das funktioniert aber nicht. Hoffe Ihr könnt mir helfen.
MFG
Ernesto
Moderiert von Tino: Code-Tags hinzugefügt.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 23.01.03 10:14
Hm, also du bräuchtest zu mindest eine Schleife oder eien Callback Funktion die dir den Fortschritt zurück gibt.
Das was du da versuchst  , nun wo soll denn da was passieren? 
|
|
ErnestoChe 
      
Beiträge: 528
Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
|
Verfasst: Do 23.01.03 10:22
Hi,
ich hab das schon in einer While-Schleife gemacht. Ich wollt nur nicht den kompletten Code posten:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); var f1, f2: File of Byte; begin Screen.Cursor := crHourglass; while GetURLFile(Edit1.Text, ExtractFilePath(Paramstr(0)) + Edit2.Text) do begin AssignFile(f1, Edit1.Text); AssignFile(f2, Edit2.Text); Gauge1.Progress := Round(FileSize(f1)/100* FileSize(f2)); end;
Screen.Cursor := crDefault; end;
end. |
Der Download an sich funktioniert ja. Nur die Gauge nicht.
MFG
Moderiert von Tino: Code-Tags hinzugefügt.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 23.01.03 10:34
Wie oft wird denn GetURLFile aufgerufen? Ich nehme an nur einmal und wenn GetURLFiel zurückkehrt ist alles schon gelaufen. Das heißt er geht gar nicht in die Schleife rein und wenn nur einmal oder so.
Hast du das mal debuggt? Wird die Schleife durchlaufen? Welche Werte liefern FileSize?
Geh mal die Scxhleife mit F7 durch, wenn überhaupt möglich.
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Do 23.01.03 10:39
Hallo,
bei Dateioperationen werden die VCL-Controls nicht mehr regelmäßig aktiualisiert, sondern erst dann, wenn diese beendet sind.
Versuche es einmal mit Application.ProcessMessages nach der Zuweisung an die Gauge.
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
Brueggendiek
      
Beiträge: 304
Win 98, Win98SE, Win XP Home
D5 Std
|
Verfasst: Do 23.01.03 11:19
Hallo Leute!
Da ist aber ein grundsätzlicher Fehler im Ansatz von Ernestos Programms:
| Delphi-Hilfe hat folgendes geschrieben: |
function FileSize(var F): Integer;
Beschreibung
Mit FileSize können Sie die Größe der angegebenen Datei (F) ermitteln. Die Funktion kann nur für geöffnete Dateien verwendet werden. Wenn die Datei leer ist, gibt FileSize(F) 0 zurück.
|
Bei mir (Delphi 5 Standard) ist ohne Öffnen der Datei (Reset) nichts zu machen (Absturz bzw. TRY-EXCEPT/FINALLY) - und Reset geht normalerweise nicht bei zum Schreiben geöffneten Dateien!
Man muß hier "FindFirst" einsetzen und den tSearchrec auswerten, da ist die Dateigröße drin.
Abgesehen davon bleibt natürlich das Problem, daß die Download-Prozedur erst endet und damit der Fortschritt aktualisiert wird, wenn die Show bereits gelaufen ist.
Das Problem kann man allenfalls mit einem getrennten Thread umgehen, der parallel läuft und regelmäßig die Fortschrittsanzeige aktualisiert.
Gruß
Dietmar Brüggendiek
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Do 23.01.03 11:23
Hallo,
Brueggendiek hat recht.
@ErnestoChe
Folgende Funktion liefert Dir die Dateigröße in Byte zurück.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function GetDateiGroesse(const aFileName:String):DWord; var sh:THandle; wd:TWin32FindData; begin sh:=FindFirstFile(PChar(ExpandFileName(aFileName)), wd); try if (sh<>INVALID_HANDLE_VALUE) then Result:=(wd.nFileSizeHigh*MAXDWORD)+wd.nFileSizeLow else Result:=0; finally Windows.FindClose(sh); end; // try end; // GetDateiGroesse |
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
Brueggendiek
      
Beiträge: 304
Win 98, Win98SE, Win XP Home
D5 Std
|
Verfasst: Do 23.01.03 12:00
Hallo!
@smiegel: Du hast naturlich vollkommen recht! Die Windows-API-Funktion "FindFirstFile" liefert die Dateigröße in 2 DWORD, während die wesentlich einfacher handhabbare Delphi-Funktion "FindFirst" dafür nur 'nen mickrigen Integer hat, also bei Dateien mit mehr als 2 Gigabyte kläglich versagt!
Allerdings drängt sich mir eine Frage auf: warum nimmst Du als Rückgabewert der Funktion ein dWord?? Wenn schon Sicherheit für wer-weiß-wie-kurz (vielleicht sind in ein paar Monaten solche Riesen-Dateien ja normal), dann bitte als Rückgabewert "Int64" verwenden - der kann zwei DWORD aufnehmen!
Gruß
Dietmar Brüggendiek
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Do 23.01.03 12:07
Hallo,
@Brüggendiek
| Zitat: |
als Rückgabewert "Int64" verwenden
|
darüber lässt dich reden
Aber ich denke fürs erste sind 4GByte-Dateigrösse ausreichend.
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
ErnestoChe 
      
Beiträge: 528
Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
|
Verfasst: Do 23.01.03 15:46
Hi,
danke für Eure Hilfe. Ihr habt natürlich recht. Ich werds mit nem Timer probieren.
@Smiegel
Danke für die function. Ich hab aber trotzdem ne eigene function geschrieben, da es nicht um so grosse Dateien geht:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function GetFileSize(const AFileName: String): Integer; var F: TSearchRec; begin Result:=-1; if FindFirst(AFileName,faAnyFile,F)=0 then begin try Result := F.Size; finally FindClose(F); end; end; end; |
Danke an alle.
MFG
Ernesto
Moderiert von Tino: Code-Tags hinzugefügt.
|
|