Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi klassenfremde ereignisse weitergeben (https://www.delphipraxis.net/109222-klassenfremde-ereignisse-weitergeben.html)

Marco Steinebach 26. Feb 2008 15:06


klassenfremde ereignisse weitergeben
 
Hallo Listers,
sorry für den nicht ganz so sinnigen Betreff.
Ich habe folgendes Problem, und brauch mal 'ne Denkhilfe.
Ich bin dabei eine Komponente zu entwickeln, die u.a. Dateien aus dem Internet downloaden kann. Der Download geschicht mittels der Indy-Komponenten, hier konkret mit der Methode Get der Klasse TIdHTTP. Diese Methode lädt eine Datei aus dem Internet herunter und löst während des Downloads ein Ereignis namens OnWork aus, um sich beispielsweise anzeigen zu lassen, wieviele Bytes schon runtergeladen sind. Dieses Ereignis möchte ich an das Formular, welches meine Komponente benutzt, weitergeben.
Defininiere ich meine Komponente als Nachfahr der Klasse TIdHTTP ist alles schön, ich abe das Ereignis, und das war's. Ich möchte aber nicht alle Attribute, die TIdHTTP zur Verfügung stellt, in meiner Klasse haben, deshalb ist sie vom Typ TComponent.
Wie kann ich aber nun dem aufrufenden Formular dieses OnWork-Ereignis zur verfügung stellen?
Für jeden Tip wäre ich echt dankbar.
Viele Grüße
Marco

thkerkmann 26. Feb 2008 15:28

Re: klassenfremde ereignisse weitergeben
 
Hi,

na weiterreichen...

Du definierts in deiner Komponente ein Ereignis OnWork, welches sich der Benutzer auf eine Ereignisprozedur setzen kann.
Desweiteren baust Du eine Behandlungsroutine für das Indy OnWork in deine Klasse ein, und rufst darin dein Event auf.
Im Constructor- wo du wohl auch die Indy createst, setzt du das Event entsprechend auf deine Behandlungsroutine.

Hab jetzt keine Lust es in Quellcode zu schreiben, ich hoffe Du verstehst was ich meine.
:-D

Gruss

Thomas

Marco Steinebach 26. Feb 2008 16:18

Re: klassenfremde ereignisse weitergeben
 
Hallo,
Zitat:

Zitat von thkerkmann
Hi,
Du definierts in deiner Komponente ein Ereignis OnWork, welches sich der Benutzer auf eine Ereignisprozedur setzen kann.

Okay, soweit klar.
Delphi-Quellcode:
  TDownloadFortschritt = procedure (Sender: TObject; AWorkMode: TWorkMode;
    const AWorkCount: Integer) of object;
....
TMeineKomponente = Class (TComponent)
{ private deklarationen }
    fIdHTTP: TIdHTTP;
    fOnDownloadFortschritt: TOnDownloadFortschritt;
Zitat:

Zitat von thkerkmann
Desweiteren baust Du eine Behandlungsroutine für das Indy OnWork in deine Klasse ein, und rufst darin dein Event auf.

Genau hier hänge ich. Meine procedure heißt
Delphi-Quellcode:
procedure TMeineKomponente.Execute;
begin
  ...
  fIdHTTP.Get (url, fs); // fs ist'n filestream
...
Wie sieht denn jetzt hier welche Behandlungsroutine aus????
Zitat:

Zitat von thkerkmann
Im Constructor- wo du wohl auch die Indy createst, setzt du das Event entsprechend auf deine Behandlungsroutine.

Das ist auch wieder klar, aber vielleicht noch'n Tippp für die mitte? ;-)

Viele Grüße
Marco

wicht 26. Feb 2008 17:57

Re: klassenfremde ereignisse weitergeben
 
Hi!

Ich hab mal was hier hingeschrieben, das könnte helfen...

Delphi-Quellcode:
type
  TDownloadFortschritt = procedure (Sender: TObject; AWorkMode: TWorkMode;
    const AWorkCount: Integer) of object;

  TForm1 = class(TForm)
  private
    MeineKomponente: TMeineKomponente;

    procedure StarteDownload;
    procedure MeineKomponenteDownloadFortschritt(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
  end;

  TMeineKomponente = class (TComponent)
  { private deklarationen }
  private
    FIdHTTP: TIdHTTP;
    FOnDownloadFortschritt : TDownloadFortschritt; // du hattest TOnDownloadFortschritt

    procedure IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
  public
    constructor Create;
    property OnDownloadFortschritt: TDownloadFortschritt read FOnDownloadFortschritt write FOnDownloadFortschritt ;
  end;

var
  Form1: TForm1;

implementation

procedure Form1.StarteDownload;
begin
  // Komponente fertig machen und sowas...
  MeineKomponente.OnDownloadFortschritt = MeineKomponenteDownloadFortschritt;
  MeineKomponente.Execute;
end;

procedure Form1.MeineKomponenteDownloadFortschritt(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
 // Hier haste alles in deiner Form jetzt ;-)
end;

procedure TMeineKomponente.Execute;
begin
  FIdHTTP.OnWork := IdHTTPWork;
  FIdHTTP.Get(url, fs); // fs ist'n filestream
end;

procedure TMeineKomponente.IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  if Assigned(FOnDownloadFortschritt) then
    FOnDownloadFortschritt(NamenKenneIchNicht);
end;

Marco Steinebach 26. Feb 2008 20:39

Re: klassenfremde ereignisse weitergeben
 
Hallo an alle,
vielen herzlichen Dank für die raschen Antworten. Joa, jetzt hat's geschnackelt. Ich hab nach was viel komplizierterem gesucht. Nu läuft alles, außer, daß beim Download meine Form einfriert, obwohl TIdAntiFreeze mit dabei ist, aber das ist 'n anderes Thema.
Nochmal danke und viele Grüße
Marco


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