Autor Beitrag
ErnestoChe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: 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:
ausblenden 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 user profile iconTino: Code-Tags hinzugefügt.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Do 23.01.03 10:22 
Hi,

ich hab das schon in einer While-Schleife gemacht. Ich wollt nur nicht den kompletten Code posten:
ausblenden 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 user profile iconTino: Code-Tags hinzugefügt.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Do 23.01.03 11:23 
Hallo,

Brueggendiek hat recht.

@ErnestoChe
Folgende Funktion liefert Dir die Dateigröße in Byte zurück.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: 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:
ausblenden 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 user profile iconTino: Code-Tags hinzugefügt.