Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - In einer Gauge Datenübetragungsfortschritt anzeigen
ErnestoChe - Do 23.01.03 10:04
Titel: In einer Gauge Datenübetragungsfortschritt anzeigen
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.
Delete - 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? :roll:
ErnestoChe - 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.
Delete - 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 - 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.
Brueggendiek - 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 - 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 |
Brueggendiek - 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! :mrgreen:
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 - 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.
ErnestoChe - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!