Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi idFTP-Fortschritt in eigenem Thread (https://www.delphipraxis.net/130334-idftp-fortschritt-eigenem-thread.html)

Admirandis 6. Mär 2009 14:54


idFTP-Fortschritt in eigenem Thread
 
Hallo zusammen,

ich schreibe an einem kleinen FTP-Client, welcher an sich auch schon gut funktioniert. Jedoch möchte ich noch den Fortschritt anzeigen lassen. Generell kein Problem, aber meine idFTP-Komponente wird zur Laufzeit erzeugt und ich weiß nicht, wie ich hier auf das onWork, onWorkbegin etc zugreifen kann. Hier mal noch der Code:

Delphi-Quellcode:
unit FTP_Class;

interface

uses Classes, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdExplicitTLSClientServerBase, IdFTP, SysUtils;

type MyFTPThread = Class(TThread)
  private
    FTP: TIdFTP;
    res: TStringList;
    Description, action: string;
    state: boolean;
   
    procedure updateVLC();

  protected
    procedure Execute; override;

  public
    upload, download, clear: boolean;
     server, user, password: string;
      uploadname, downloadname: string;

    procedure initialize;

end;

implementation

uses OC_F1;

procedure MyFTPThread.Execute;
begin
  res := TStringList.Create;
  initialize;
end;

procedure MyFTPThread.initialize;
begin
  FTP := TIdFTP.Create();
  FTP.Host := server;
  FTP.Username := user;
  FTP.Password := password;
  FTP.Connect;

  if FTP.Connected then
    begin
      if download then
        begin
          ...
        end;

      if upload then
        begin
          ...
        end;
    end;
  FTP.Free;
end;


procedure MyFTPThread.updateVLC();
begin
  Form1.updateVLC(res, Description, state, action);
end;

end.
Im Voraus schonmal vielen Dank!

Admirandis

DeddyH 6. Mär 2009 14:59

Re: idFTP-Fortschritt in eigenem Thread
 
Du kannst die Methoden zur Laufzeit einfach zuweisen, sofern sie die entsprechende Signatur besitzen.

Admirandis 6. Mär 2009 16:47

Re: idFTP-Fortschritt in eigenem Thread
 
kannst du das evtl. etwas weiter ausführen? bin nicht sooo der Held im Delphi-Programmieren!

Generell ist schon klar was du meinst, aber ich muss ja auf die Variablen aus der "originalen" Prozedur zugreifen um den Fortschritt zu bekommen. Wie komm ich an diese?


EDIT:
Also ich habs jetzt durch viel herumprobieren selber rausgefunden: Für alle Suchenden:

Delphi-Quellcode:
type MyFTPThread = Class(TThread)
  private
    res: TStringList;
    Description, action: string;
    state: boolean;
    connected: boolean;
    max: Double;
    FTP: TIdFTP;

    procedure sync(descr: string; atend: boolean; ac: string);
    procedure updateVLC();
    procedure FTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);
    procedure FTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer);

  protected
    procedure Execute; override;

  public
    upload, download, clear, abort: boolean;
     server, user, password: string;
      uploadname, downloadname: string;
    procedure initialize;
end;

implementation

uses OC_F1;

procedure MyFTPThread.Execute;
begin
  res := TStringList.Create;
  state := false;
  action := '-';
  initialize;
end;

procedure MyFTPThread.initialize;
var
  cnt: integer;
begin
  sync('Sequence started'#9#9' @ ' + TimeToStr(now), false, '_');

  FTP := TIdFTP.Create();
  FTP.Host := server;
  FTP.Username := user;
  FTP.Password := password;
  FTP.OnWork := FTPWork;                     // <-- Zuweisung der onWork-Prozedure auf meine eigene. Die Argumente müssen gleich sein!!!
  FTP.OnWorkBegin := FTPWorkBegin;           // <-- Dasselbe für OnWorkBegin...

  FTP.Connect;

  if FTP.Connected then
    begin

      if download then
        begin
          ...
        end;

    if upload then
      begin
        ...
      end;

    if clear then
      begin
        ...
      end;
  end;

  FTP.Free;
end;

procedure MyFTPThread.updateVLC();
begin
  Form1.updateVLC(res, Description, state, action);
end;


procedure MyFTPThread.FTPWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
begin
  if max > 0 then
    begin
      Form1.updatePROG(AWorkCount, max);  // Bei mir wird beim Download keine Maximalgröße der Datei übertragen. Deswegen setze ich bei
    end;                                  // Downloads die Größe noch in der Downloadroutine mit FTP.GetSize (o.Ä.).

  if abort then
    begin
      FTP.Abort;
      download := false;
      upload := false;
      abort := false;
    end;
end;

procedure MyFTPThread.FTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Integer);
begin
if AWorkMode = wmWrite then         // Wie oben beschrieben nur bei Uploads zu verwenden...
  max := AWorkCountMax;
end;

end.
Grüße Admirandis


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 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