AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

klassenfremde ereignisse weitergeben

Ein Thema von Marco Steinebach · begonnen am 26. Feb 2008 · letzter Beitrag vom 26. Feb 2008
Antwort Antwort
Marco Steinebach

Registriert seit: 4. Aug 2006
490 Beiträge
 
Delphi 5 Enterprise
 
#1

klassenfremde ereignisse weitergeben

  Alt 26. Feb 2008, 16:06
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
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#2

Re: klassenfremde ereignisse weitergeben

  Alt 26. Feb 2008, 16:28
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.


Gruss

Thomas
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
490 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: klassenfremde ereignisse weitergeben

  Alt 26. Feb 2008, 17:18
Hallo,
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 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 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
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#4

Re: klassenfremde ereignisse weitergeben

  Alt 26. Feb 2008, 18:57
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;
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
490 Beiträge
 
Delphi 5 Enterprise
 
#5

Re: klassenfremde ereignisse weitergeben

  Alt 26. Feb 2008, 21:39
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
Marco Steinebach
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 14:47 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