Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Eigene Klasse : Ereignisse ? (https://www.delphipraxis.net/133142-eigene-klasse-ereignisse.html)

Real-TTX 26. Apr 2009 18:38


Eigene Klasse : Ereignisse ?
 
Hallo, leider finde ich bezgl der erstellung von Ereignissen in der eigenen Klasse nichts :(

Hat jemand ein kleines Beispiel ? Oder ein spez. Stichwort nachdem ich suchen kann?

Danke :)

Gruß, Real-TTX

Meflin 26. Apr 2009 18:41

Re: Eigene Klasse : Ereignisse ?
 
http://www.delphipraxis.net/internal...ct.php?t=15202

Bei Google suchenDelphi Klasse Event ;)

freak4fun 26. Apr 2009 18:42

Re: Eigene Klasse : Ereignisse ?
 
dsdt.info

mirage228 26. Apr 2009 18:43

Re: Eigene Klasse : Ereignisse ?
 
Moin,

Ereignisse bei OO gehen in Delphi so

Delphi-Quellcode:
type
  TDeinEreignis = procedure(Parameter1: Integer; Parameter2: string) of object;
Wichtig ist das "of object" - Das "Standardereignis", das häufig verwendet wird ist Delphi-Referenz durchsuchenTNotifyEvent.

In der Klasse siehts dann so aus
Delphi-Quellcode:
type
  TDeineKlasse = class
  private
    FEreignis: TDeinEreignis;
  public
    property DeinEreignis: TDeinEreignis read FEreignis write FEreignis;
end;

// Wenn Du es dann aufrufen willst z.B.
if @FEreignis <> nil then
  FEreignis(40, 'Test');
Viele Grüße

Real-TTX 26. Apr 2009 18:56

Re: Eigene Klasse : Ereignisse ?
 
Erstmal Danke für die blitzschnellen Antworten.

Also, das mit dem Ereigniss habe ich nun noch nicht ganz so verstanden.

Was genau macht :
Delphi-Quellcode:
// Wenn Du es dann aufrufen willst z.B.
if @FEreignis <> nil then
  FEreignis(40, 'Test');

Und :

Delphi-Quellcode:
type
  TDeineKlasse = class
  private
    FEreignis: TDeinEreignis;
  public
    property DeinEreignis: TDeinEreignis read FEreignis write FEreignis; // Warum eine Eigenschaft ? Wenn ich außerhalb der Klasse ein Ereigniss Definiere ?
end;
Gruß, Real-TTX

Real-TTX 26. Apr 2009 18:59

Re: Eigene Klasse : Ereignisse ?
 
Mit

Delphi-Quellcode:
if @FEreignis <> nil then
  FEreignis(40, 'Test');
wird überprüft ob FEreignis vorhanden ist -> also definiert worden ist?


Seh ich das richtig? :)

mirage228 26. Apr 2009 19:01

Re: Eigene Klasse : Ereignisse ?
 
Zitat:

Zitat von Real-TTX
Was genau macht :
Delphi-Quellcode:
// Wenn Du es dann aufrufen willst z.B.
if @FEreignis <> nil then
  FEreignis(40, 'Test');

Also die erste Zeile ist äquivalent zu
Delphi-Quellcode:
if Assigned(FEreignis) then
und prüft, ob hinter "FEreignis" auch wirklich ein zugewiesenes Ereignis (siehe unten) oder nichts (Delphi-Referenz durchsuchennil) steckt.
Die zweite Zeile ist der Aufruf des Ereignis mit den gewünschten Parametern.

Zitat:

Warum eine Eigenschaft ? Wenn ich außerhalb der Klasse ein Ereigniss Definiere ?
Das Ereignis definierst Du außerhalb (z.B. in einem Formular)
Delphi-Quellcode:
procedure TForm1.MeinEreignis(Parameter1: Integer; Parameter2: string);
begin
  // Reagiere auf das Ereignis hier...
end;

// Dann musst Du noch das Ereignis zuweisen
var
  Klasse: TDeineKlasse;
begin
  // ...
  Klasse.DeinEreignis := Form1.MeinEreignis;
end;
In der Klasse ist "FEreignis" nun ein Zeiger auf Form1.MeinEreignis. Wenn ich also später "FEreignis(40, 'Test')" schreibe, wird Form1.MeinEreignis mit diesen Parametern aufgerufen.

Viele Grüße

Real-TTX 26. Apr 2009 19:17

Re: Eigene Klasse : Ereignisse ?
 
Ahh Ok :)

War ich ja garnicht so falsch. Aber warum muss ich in meiner Klasse das aufgerufene Ereigniss zuweisen :
Delphi-Quellcode:
Klasse.DeinEreignis := Form1.MeinEreignis;
Ich weiß vorher ja nicht ob mich Frm1, Form2 oder Bla aufruft?

Ist es möglich das als Property oder ähnliches festzulegen, dass ich beim Aufruf dann folgendes habe :
Delphi-Quellcode:
var
 MeinKlasse : TMeineKlasse;

procedure Form1.ButtonClick....
begin
 MeineKlasse.Ereigniss := 'testereignis';
end;

procedure Form1.Testereigniss(blabla,blkbalbal);
begin
...
end;
Gruß, Real-TTX

mirage228 26. Apr 2009 19:19

Re: Eigene Klasse : Ereignisse ?
 
Äh, moment!

Möchtest Du in Deiner Klasse ein Ereignis aufrufen oder möchtest Du einem Ereignis des Formulars oder so (ButtonKlick meinetwegen) eine Methode Deiner Klasse zuweisen?

Real-TTX 26. Apr 2009 20:23

Re: Eigene Klasse : Ereignisse ?
 
In meiner Klasse ein Ereigniss aufrufen und in meinem Program (Unit von einer Form) das Ereigniss definieren.

Oder habe ich da nun was falsch verstanden ?

Gruß, Real-TTX

Luckie 26. Apr 2009 20:29

Re: Eigene Klasse : Ereignisse ?
 
Noch mal anders gefragt: Willst du in deiner Klasse ein Ereignis auslösen?

Real-TTX 26. Apr 2009 20:48

Re: Eigene Klasse : Ereignisse ?
 
Auslösen, ja
Definieren, nein

Oder dreh ich mich gerade im Kreis? :O

Luckie 26. Apr 2009 20:56

Re: Eigene Klasse : Ereignisse ?
 
Wenn du eins auslösen willst, musst du auch ein definieren. Und den Code hast du schon bekommen weiter oben.

Real-TTX 27. Apr 2009 08:46

Re: Eigene Klasse : Ereignisse ?
 
Ja, das habe ich ja soweit verstanden. Aber gint es eine Möglichkeit ohne die Zuweisung der Ereignisse? Wenn ich die Inydy Koponenten nutze muss ich doch auch nicht die Ereignisse zuweisen? Oder irre ich mich?

Gruß, Real-TTX

jfheins 27. Apr 2009 09:27

Re: Eigene Klasse : Ereignisse ?
 
Zitat:

Zitat von Real-TTX
Ja, das habe ich ja soweit verstanden. Aber gint es eine Möglichkeit ohne die Zuweisung der Ereignisse? Wenn ich die Inydy Koponenten nutze muss ich doch auch nicht die Ereignisse zuweisen? Oder irre ich mich?

Gruß, Real-TTX

:gruebel:

Wenn du im Formdesigner auf ein Ereignis doppelklickst (oder auch auf das Formular für das OnCreate-Ereignis) dann wird doch in der Klasse eine Methode erstellt und dem Ereignis wird diese Methode zugewiesen. Das geschieht aber "versteckt" in der dfm-Datei.

Aber da steht im Grunde auich nur sowas: Form1.OnCreate := TForm1.FormCreate;

Wenn mans also genau nimmt: Nein, du musst das Ereignis nicht zuweisen. Zugewiesen muss es aber werden ;)

Real-TTX 27. Apr 2009 10:03

Re: Eigene Klasse : Ereignisse ?
 
Achso.. So einfach geht das eigentlich? Nun versteh ich das auch -> Bin ein Schritt nach rechts und schon war ich unten vom Schlauch :)

Danke euch :)

Real-TTX 27. Apr 2009 10:50

Re: Eigene Klasse : Ereignisse ?
 
Letze Frage habe ich doch noch, Was mach ich an dieser Stelle falsch ? :

Delphi-Quellcode:
....
type

  TDownload = record
    ID : array[3] of string;
    URL : string;
    Size : int64;
    Proto : integer;
    Host : string;
  end;

  TDownloadWork = procedure(Download : TDownload) of object;
  TDownloadBegin = procedure(Download : TDownload, Work : integer) of object;
  TDownloadEnd = procedure(Download : TDownload, Count : integer) of object;

  THTTPDownloader = class
  private
    intDownloads : integer;
    objHTTP      : TidHTTP;
    DownloadWork : TDownloadWork;
    DownloadBegin : TDownloadBegin;
    DownloadEnd  : TDownloadEnd;
  public
    constructor Create;
    function GetURLFileSize(aURL : string) : int64;
    property Downloads : integer read intDownloads;
  end;

var
  Downloader : THTTPDownloader;

implementation
...
Ich glaub nun steh ich auf dem nächsten Schlauch :(

taaktaak 27. Apr 2009 10:55

Re: Eigene Klasse : Ereignisse ?
 
Komma statt Semikolon gesetzt?

DeddyH 27. Apr 2009 11:02

Re: Eigene Klasse : Ereignisse ?
 
Wie äußert sich das "falsch" denn? Der Komma-/Semikolonfehler wurde ja schon genannt. Weiterhin kannst Du von außerhalb die Ereignisse wohl nicht zuweisen, stimmt' s?

Real-TTX 27. Apr 2009 11:07

Re: Eigene Klasse : Ereignisse ?
 
Ja, das sollte man schon machen :wall:

Das war hier gerade so eine Aktion : :coder2:

Danke euch, dass ich nicht direkt eins auf die Mütze bekommen habe bei den unnötigen Frage :O

Real-TTX 27. Apr 2009 11:08

Re: Eigene Klasse : Ereignisse ?
 
@DeddyH : Sollte wohl in den Public bereich, oder wie versteh ich deine Aussage. Soweit bin ich noch nicht zum testen gekommen ;)

Real-TTX 27. Apr 2009 11:16

Re: Eigene Klasse : Ereignisse ?
 
@DeddyH :

Ich habe gerade festgestellt : Ja, es stimmt. Und es liegt nicht an Private/Public :/

Kleiner Tipp ;) ?

Real-TTX 27. Apr 2009 11:26

Re: Eigene Klasse : Ereignisse ?
 
Ach... Habs.. Die Propertys helfen an der Stelle schon sehr :)


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