![]() |
ProgressForm schliesst sich nicht.
Hallo Leute,
Ich habe mir ![]() Ich habe dabei eine 3e Form (ProgressForm) im Project eingefuegt um den Fortschritt an zu zeigen. Der Code funktioniert auch wunderbar bis auf 2 Kleinigkeiten. Die Progressbar wirkt nicht und die 3e Form schliesst sich nicht nachdem die Datei gedownload wurde. Hier mein Code zum Downloaden.
Delphi-Quellcode:
Kann mir einer dabei helfen bitte?
var
BytesKopiert, BytesInsgesamt : int64; lStream: TFileStream; begin Form3.Show; <--------------------ProgressForm anzeigen //Initialiesieren Form3.Status.Caption := ''; BytesKopiert := 0; Form3.Progress.Position := 0; //In edit 1 steht die downzuladene Datei (z.b. [url]http://www.server.com/datei.dat[/url]) Form3.Status.Caption := 'Prüfe Header'; // Durch die zwei nächsten Befehle wird die Größe ermittelt und ihn der Variable BytesInsgesamt abgespeichert HTTP.Head(Form3.Edit1.Text); BytesInsgesamt := HTTP.Response.ContentLength; //Wenn die Indy Komponente -1 zurückgibt dann bedeutet es des der die Dateigröße nicht zu verfügung //stellt uns somit kann die Datei ganz normall heruntergeladen werden (ohne Fortschrittsanzeige) if BytesInsgesamt = -1 then begin Form3.SpeedLabel.Caption := 'Normalles herunterladen'; Form3.Status.Caption := 'Erstelle Datei'; //In Edit 2 steht welche Datei (z.b. C:\datei.dat) //Datei erstellen lStream:=TFileStream.Create(Form3.Edit2.Text, fmCreate or fmShareDenyNone); try //und "normal" herunterladen HTTP.Get(Form3.Edit1.Text, lStream); finally if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt end; //Alles auf fertig stellen Form3.SpeedLabel.Caption := 'Fertig'; Form3.Status.caption := 'Fertig'; exit; end; //Also wenn wir hier angelangt sind dann bedeutet es der Server hat uns die Dateigröße zur Verfügung gestellt. Form3.Progress.Max := BytesInsgesamt; Form3.Status.Caption := 'Erstelle Datei'; //In Edit 2 steht welche Datei (z.b. C:\datei.dat) //Datei erstellen lStream:=TFileStream.Create(Form3.Edit2.Text, fmCreate or fmShareDenyNone); lStream.Position := 0; try repeat // Damit sich das Programm nicht aufhängt Application.ProcessMessages; //Nun setzen wir den Start nach die bereits kopierten Bytes HTTP.Request.ContentRangeStart := BytesKopiert; //Hier wird gebrüft ob die restlichen Bytes größer sind als cFileSplitSize if (BytesInsgesamt-BytesKopiert) > cFileSplitSize then begin //Hier wird einmal die cFileSplitSize eingestellt HTTP.Request.ContentRangeEnd := BytesKopiert+cFileSplitSize-1; end //Den rest der Datei else HTTP.Request.ContentRangeEnd := BytesInsgesamt; Application.ProcessMessages; //Den eingesttelten Teil herunterladen und ihn die Datei speichern HTTP.Get(Form3.Edit1.Text, lStream); //Progress und Status aktualliesieren Form3.Progress.Position := BytesKopiert; Form3.SpeedLabel.Caption := GetSizeName(BytesKopiert)+'/'+GetSizeName(BytesInsgesamt); //BytesKopiert weiter setzen BytesKopiert := BytesKopiert+cFileSplitSize; until (BytesKopiert >= BytesInsgesamt); //Schleife beenden wenn datei fertig finally if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt end; Application.ProcessMessages; //Alles auf fertig stellen Form3.SpeedLabel.Caption := 'Fertig'; Form3.Status.caption := 'Fertig'; Form3.Progress.Position := 100; Form3.Close; <--------------------------ProgressForm schliessen, funktioniert nicht. end; Danke im voraus. MFG, Lucius. |
Re: ProgressForm schliesst sich nicht.
Hi Lucius,
wenn deine Form automatisch erzeugt wurde und du sie mit Show() zeigst, dann kannst du sie mit Hide() wieder schließen. Grüße vom marabu |
Re: ProgressForm schliesst sich nicht.
Den Fehler fuer die 3e Form hab ich schon selber gefunden, trotsdem Danke.
Hab mir den Code mal richtig angeschaut.
Delphi-Quellcode:
Wer lesen kann ist klar im Vorteil. :wall:
var
BytesKopiert, BytesInsgesamt : int64; lStream: TFileStream; begin Form3.Show; <--------------------ProgressForm anzeigen //Initialiesieren Form3.Status.Caption := ''; BytesKopiert := 0; Form3.Progress.Position := 0; //In edit 1 steht die downzuladene Datei (z.b. [url]http://www.server.com/datei.dat[/url]) Form3.Status.Caption := 'Prüfe Header'; // Durch die zwei nächsten Befehle wird die Größe ermittelt und ihn der Variable BytesInsgesamt abgespeichert HTTP.Head(Form3.Edit1.Text); BytesInsgesamt := HTTP.Response.ContentLength; //Wenn die Indy Komponente -1 zurückgibt dann bedeutet es des der die Dateigröße nicht zu verfügung //stellt uns somit kann die Datei ganz normall heruntergeladen werden (ohne Fortschrittsanzeige) if BytesInsgesamt = -1 then begin Form3.SpeedLabel.Caption := 'Normalles herunterladen'; Form3.Status.Caption := 'Erstelle Datei'; //In Edit 2 steht welche Datei (z.b. C:\datei.dat) //Datei erstellen lStream:=TFileStream.Create(Form3.Edit2.Text, fmCreate or fmShareDenyNone); try //und "normal" herunterladen HTTP.Get(Form3.Edit1.Text, lStream); finally if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt end; //Alles auf fertig stellen Form3.SpeedLabel.Caption := 'Fertig'; Form3.Status.caption := 'Fertig'; Form3.Close; <-------------------------------//Hier muss er auch noch rein!// exit; end; //Also wenn wir hier angelangt sind dann bedeutet es der Server hat uns die Dateigröße zur Verfügung gestellt. Form3.Progress.Max := BytesInsgesamt; Form3.Status.Caption := 'Erstelle Datei'; //In Edit 2 steht welche Datei (z.b. C:\datei.dat) //Datei erstellen lStream:=TFileStream.Create(Form3.Edit2.Text, fmCreate or fmShareDenyNone); lStream.Position := 0; try repeat // Damit sich das Programm nicht aufhängt Application.ProcessMessages; //Nun setzen wir den Start nach die bereits kopierten Bytes HTTP.Request.ContentRangeStart := BytesKopiert; //Hier wird gebrüft ob die restlichen Bytes größer sind als cFileSplitSize if (BytesInsgesamt-BytesKopiert) > cFileSplitSize then begin //Hier wird einmal die cFileSplitSize eingestellt HTTP.Request.ContentRangeEnd := BytesKopiert+cFileSplitSize-1; end //Den rest der Datei else HTTP.Request.ContentRangeEnd := BytesInsgesamt; Application.ProcessMessages; //Den eingesttelten Teil herunterladen und ihn die Datei speichern HTTP.Get(Form3.Edit1.Text, lStream); //Progress und Status aktualliesieren Form3.Progress.Position := BytesKopiert; Form3.SpeedLabel.Caption := GetSizeName(BytesKopiert)+'/'+GetSizeName(BytesInsgesamt); //BytesKopiert weiter setzen BytesKopiert := BytesKopiert+cFileSplitSize; until (BytesKopiert >= BytesInsgesamt); //Schleife beenden wenn datei fertig finally if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt end; Application.ProcessMessages; //Alles auf fertig stellen Form3.SpeedLabel.Caption := 'Fertig'; Form3.Status.caption := 'Fertig'; Form3.Progress.Position := 100; Form3.Close; <--------------------------ProgressForm schliessen, funktioniert nicht. end; |
Re: ProgressForm schliesst sich nicht.
Danke marabu, habs schon ich Trottel, hahaha.
Siehe Post #3. MFG, Lucius. |
Re: ProgressForm schliesst sich nicht.
ich würde aber trotzdem Form.Hide verwenden.
Meiner Meinung nach sollte Form.Close nur innerhalb des Forms verwendet werden. |
Re: ProgressForm schliesst sich nicht.
Danke RavenIV fuer den Tip aber habe das ganze auf ein Panel verlegt in der MainForm weil das Programm auch in der Taskbar laeuft und die immer erscheinende 3e Form kann dann schonmal stoeren.
Gruss Lucius. |
Re: ProgressForm schliesst sich nicht.
Hier würde ich auch noch was ändern:
Delphi-Quellcode:
Warum so hart die Prozedur verlassen? Warum kein if-else Konstrukt?
Form3.Close; <-------------------------------//Hier muss er auch noch rein!//
exit; end; //Also wenn wir hier angelangt sind dann bedeutet es der Server hat uns die Dateigröße zur Verfügung gestellt. |
Re: ProgressForm schliesst sich nicht.
Zitat:
Ist das generell besser eine Prozedur "normal" fertiglaufen zu lassen anstatt sie mit exit zu beenden? Wenn ja, warum? |
Re: ProgressForm schliesst sich nicht.
Zitat:
Das bringt mehr Übersichtlichkeit und erleichtert die Wartung. Wenn Du die procedure an 23 Stellen mit exit verlässt und übersiehst beim Ändern eine Stelle, dann hst du evtl Chaos. |
Re: ProgressForm schliesst sich nicht.
Ah ok, dass es übersichtlicher ist ist klar, deswegen benutze ich exit auch nur in Ausnahmefällen. Ich dachte jetzt nur, dass es vielleicht irgendwelche Nebenwirkungen haben könnte. Danke für die Antwort :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz