AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateidownload

Ein Thema von DieFliege · begonnen am 19. Mai 2017 · letzter Beitrag vom 21. Mai 2017
Antwort Antwort
Seite 1 von 2  1 2      
DieFliege

Registriert seit: 6. Aug 2013
57 Beiträge
 
Delphi XE4 Professional
 
#1

Dateidownload

  Alt 19. Mai 2017, 11:11
Hallo zusammen,

wieder mal habe ich ein (vermutlich) kleines Problem.

Ich habe mir ein kleines Update-Programm geschrieben, was aus dem Netz eine Datei auf den PC kopiert. Das Funktioniert auch soweit prima, allerdings wollte ich den Bediener per verschiedene Panel davon unterrichten, was er gerade macht.
Beispiel:
Panel1: "Es steht eine neue Version zur Verfügung."
Panel2: "Der Download wurde gestartet, bitte warten!"
Panel3: "Der Download wurde abgeschlossen."

Diese Panel blende ich per 'visible' und 'true' oder 'false' entweder ein oder aus - zumindest wollte ich das.

Panel1 wird mit dem Start des Programms eingeblendet. Klicke ich auf "weiter" (btn_weiter), wird mir zwar das Panel1 ausgeblendet aber nicht das Panel2 eingeblendet. Dies geschieht erst nachdem die Datei runter geladen wurde. Geprüft habe ich es, indem ich "Panel3.Visible := True;" raus genommen habe.

Nun die Frage: Warum wird Panel2 erst nachdem ich den Download-Befehl gegeben habe eingeblendet? Das Panel1 wird korrekt ausgeblendet. Hier mein Quelltext:

Delphi-Quellcode:
procedure DeleteIECache;
var
  lpEntryInfo: PInternetCacheEntryInfo;
  hCacheDir: LongWord;
  dwEntrySize: LongWord;
begin
  dwEntrySize := 0;
  FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);
  GetMem(lpEntryInfo, dwEntrySize);
  if dwEntrySize > 0 then lpEntryInfo^.dwStructSize := dwEntrySize;
  hCacheDir := FindFirstUrlCacheEntry(nil, lpEntryInfo^, dwEntrySize);
  if hCacheDir <> 0 then
  begin
    repeat
      DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName);
      FreeMem(lpEntryInfo, dwEntrySize);
      dwEntrySize := 0;
      FindNextUrlCacheEntry(hCacheDir, TInternetCacheEntryInfo(nil^), dwEntrySize);
      GetMem(lpEntryInfo, dwEntrySize);
      if dwEntrySize > 0 then lpEntryInfo^.dwStructSize := dwEntrySize;
    until not FindNextUrlCacheEntry(hCacheDir, lpEntryInfo^, dwEntrySize);
  end;
  FreeMem(lpEntryInfo, dwEntrySize);
  FindCloseUrlCache(hCacheDir);
end;
Delphi-Quellcode:
procedure TForm1.btn_weiterClick(Sender: TObject);
var
  quelldatei : String; //-- Quellpfad im Web
  zieldatei : String; //-- Zielpfand auf Rechner

begin
  Panel2.Visible := True;
  Panel1.Visible := False;

  quelldatei := 'http://www.irgendeine-seite.de/dateiname.typ';
  zieldatei := 'c:\Programme\mein Programm\dateiname.typ';

  DeleteIECache; //-- Cache leeren damit Datei auch tatsächlich aus dem Web geladen wird

  UrlDownloadToFile(nil, PChar(quelldatei), PChar(zieldatei), 0, nil);
  //Panel3.Visible := True;
  Panel2.Visible := False;
  btn_weiter.Visible := False;
  btn_fertig.Visible := True;
end;
Habt Ihr eine Idee? Vielen Dank schon einmal!

LG DieFliege

Geändert von DieFliege (19. Mai 2017 um 11:14 Uhr) Grund: Tippfehler
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Dateidownload

  Alt 19. Mai 2017, 11:20
Du könntest zum Testen ein Application.ProcessMessages; hinter Panel1.Visible := False; einbauen.

Aber das ist wie gesagt nur ein Test. Schöner wäre es, wenn du die Methode UrlDownloadToFile() in einen eigenen Thread auslagerst. Ich vermute einfach mal, dass das noch nicht passiert ist. So wie es jetzt ist, wird deine GUI während des Downloads nicht korrekt neu gezeichnet da sie ja mit dem Herunterladen der Datei beschäftigt ist.
  Mit Zitat antworten Zitat
DieFliege

Registriert seit: 6. Aug 2013
57 Beiträge
 
Delphi XE4 Professional
 
#3

AW: Dateidownload

  Alt 19. Mai 2017, 11:27
Hallo Aviator,

vielen Dank für Deine Antwort.

Es hat tatsächlich schon mit "Application.ProcessMessages;" geholfen und Du hast natürlich recht, das Programm wartet solange bis der Download abgeschlossen ist. Natürlich bin ich daran interessiert, wie es funktioniert, wenn man den Download in einen Thread auslagert. Werde dazu mal auf die Suche gehen, wie man dies bewerkstelligt.

Vielen Dank erst mal!

LG DieFliege
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
588 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Dateidownload

  Alt 21. Mai 2017, 09:09
Und anstelle mehrere Panels ein und auszublenden solltest Du nur eines verwenden und dessen Beschriftung ändern!

Ciao
Stefan
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#5

AW: Dateidownload

  Alt 21. Mai 2017, 12:01
Hier hast du eine vernünftige Lösung

Stackoverflow: How to download a file with progress with IdHTTP via https

Das https kannst du ignorieren es geht hier nur ums Prinzip wie man mit IdHTTP und Work, Workbegin und WorkEnd arbeitet.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#6

AW: Dateidownload

  Alt 21. Mai 2017, 12:29
Hallöle...
Zitat:
Hier hast du eine vernünftige Lösung
...ich habe mich nicht getraut das anzusprechen.
Hinweis für TE: Das löst aber nicht das Auslagern in einen Thread Problem...
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#7

AW: Dateidownload

  Alt 21. Mai 2017, 12:50
Zitat:
Hinweis für TE: Das löst aber nicht das Auslagern in einen Thread Problem...
Ich benutze oben genannten Code selber in einem Thread. Keinerlei Probleme.

Geändert von SneakyBagels (21. Mai 2017 um 12:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#8

AW: Dateidownload

  Alt 21. Mai 2017, 12:54
So meinte ich das nicht. Er hat ja noch keinen Thread. Deshalb muß er immer noch auf Application.ProcessMessages ausweichen. Soll heißen... auch mit den Indys ist der Download blockierend.

Geändert von haentschman (21. Mai 2017 um 12:57 Uhr)
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#9

AW: Dateidownload

  Alt 21. Mai 2017, 12:57
Vielleicht so?

Benötigt: http://stackoverflow.com/questions/2...59305#28459305

Delphi-Quellcode:
// Variablen
updateThread: TUpdateThread
HTTPFileDownload: THTTPFileDownload;
procedure IdHTTPProgressOnChange(Sender: TObject);

// Initialisierung
updateThread := nil;

// Im Buttonclick
if updateThread = nil then
 updateThread := TUpdateThread.Create;

// Thread-Konstrukt
type
 TUpdateThread = class(TThread)
 protected
  procedure Execute; override;
 public
  constructor Create;
  destructor Destroy; override;
 end;

constructor TUpdateThread.Create;
begin
 inherited Create(False);
end;

destructor TUpdateThread.Destroy;
begin
 inherited Destroy;
end;

procedure TUpdateThread.Execute;
begin
 // Downloade Datei und und und...

 Form1.HTTPFileDownload := THTTPFileDownload.Create(nil);
 Form1.HTTPFileDownload.OnChange := Form1.IdHTTPProgressOnChange;

 try
  if Form1.HTTPFileDownload.DownloadFile(sURL, sDestinationOnDisk) then
   begin
    // Datei heruntergeladen
   end else
    begin
     // Fehler behandeln
    end;
 finally
  Form1.HTTPFileDownload.Free;
 end;

// Progress
procedure TForm1.IdHTTPProgressOnChange(Sender: TObject);
var
 sTmp: string;
 iDownloaded: Int64;
 iPercent: Integer;
begin
 iPercent := THTTPFileDownload(Sender).Progress;
 iDownloaded := HTTPFileDownload.BytesTransfered div 1024;

 if iPercent = 100 then
  Exit;

 if (iPercent mod 5 = 0) then
  begin
   Sleep(1);

   // sTmp := // string zusammenbasteln aus u.a.
   // iPercent, iDownloaded

   // Beispielausgabe mit entsprechenden Anpassungen im Execute-Teil, bei mehreren Dateien:
   // File 6/12: Downloading (91% | 964 KB/1061 KB)
  end;
end;
Deine Prozedur DeleteIECache kannst du löschen. Es gibt schon etwas Fertiges. Einfach Winapi.WinInet.DeleteUrlCacheEntry(filename) aufrufen.

Geändert von SneakyBagels (21. Mai 2017 um 13:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#10

AW: Dateidownload

  Alt 21. Mai 2017, 13:03
Zitat:
Vielleicht so?
...definitiv NÖ!
Delphi-Quellcode:
procedure TUpdateThread.Execute;
begin
 // Downloade Datei und und und...

 Form1.HTTPFileDownload := THTTPFileDownload.Create(nil);
 Form1.HTTPFileDownload.OnChange := Form1.IdHTTPProgressOnChange;
...
...ohne Synchronisierung auf die Form Variable im Thread zugreifen ist ein No-Go. Wieso soll der Thread die Form kennen?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz