![]() |
Event Handling
Hallo zusammen,
auf meiner Reise von C++ zu Delphi bin ich auf ein weiteres kleines Problem gestoßen: Events Ich hab mal nen kleines Testprogramm dazu geschrieben:
Delphi-Quellcode:
Kann mir jemand erklären warum das so nicht geht? Ich hab schon alles mögliche Probiert das
TAEvent = procedure(A:String) of object; // soweit klar ein Funktionszeiger
TBrowser = class private FEvent: TAEvent; public property Event: TAEvent read FEvent write FEvent; procedure show; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure AnotherEvent(A: String); private FBrowser: TBrowser; public end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.AnotherEvent(A: String); begin ShowMessage(a); end; procedure TForm1.FormCreate(Sender: TObject); begin FBrowser := TBrowser.Create; // soweit noch klar und wenn ich alle möglichen Bücher über Delphi lese und Googel befrage müsste das auch gehn: self.AnotherEvent := (FBrowser.Event); // geht so scheinbar nicht; laut Kompiler: zu wenige Parameter aber ich weise doch nur nen Pointer zu oder nicht? end; procedure TBrowser.show; begin ShowMessage('dfdfdf'); Event('ddddd'); end;
Delphi-Quellcode:
Ist meine Momentane Fassung, so Späße wie nen Temporäres Object mit "with" kreieren oder Tempoäre Variablen, als auch das Event als Pointer zu handeln und das andere als Adresse bringt alles nix. Auch Klammersetzung in jeglicher Form haben nix gebracht.
self.AnotherEvent := (FBrowser.Event);
Vielen lieben dank, Tobi PS: So bald ich mal nen mindest Wissen in Delphi hab schreib ich mal nen kleines Tut für Umsteiger von C++ auf Delphi ;) |
Re: Event Handling
Du benutzt das falsch rum.
Delphi-Quellcode:
Wobei das bei self eigentlich besser EventHandler heissen sollte.
FBrowser.Event := self.anotherEvent;
|
Re: Event Handling
ok gut dann hab ich ne Verständnis Frage:
Ich hol erst mal aus, ein Event ist irgendeine Methode die von einem (internen?) Thread gehandelt wird. Dieser ist quasi als Observer geschrieben und benachrichtigt alle die an diesem Thread hängen wenn sich eine Methode ändert. Soweit richtig? Es gibt verschiedene Methoden aber um einer Methode eine andere zu zuweisen muss man: Zitat:
Euer aufm schlauchstehender Tobi |
Re: Event Handling
Zitat:
![]() |
Re: Event Handling
Zitat:
|
Re: Event Handling
Zitat:
|
Re: Event Handling
Ich glaube, dass du eine falsche Vorstellung von einem Event hast.
Zitat:
Jetzt sollte aber auch klar sein, warum die Zuweisung so aussehen muss, wie sie aussieht: Die Methode selbst wird nicht verändert, lediglich das Feld in der Objektinstanz erhält einen neuen Wert. |
Re: Event Handling
Zitat:
Zitat:
Stimmt das soweit? Wenn ja dann find ich es nämlich verwirrend das man von den Objekten selbst auch noch die Events rufen kann. :?: :?: Gruß, Tobi PS: Sagt mir wenn ich mich zu tief darein denke, oder wie nen Kumpel immer sagt, das ist Delphi nicht C++, was unter der Haube passiert ist hier nicht so wichtig, hauptsache es tut. -> Aber ich wüsste es halt gern :D |
Re: Event Handling
Nein, es gibt keine Magie. In deinem Socket-Beispiel registriert sich der Socket bei Windows, sodass Windows eine bestimmte Prozedur aufruft, wenn neue Daten sind. Diese Prozedur ruft dann das Delphi-Event auf.
|
Re: Event Handling
Hier gibt es keinen Zauberstab:
Delphi-Quellcode:
type TEineMethode=procedure of object;
type TFoo=class procedure EineMethode; procedure andereMethode; end; var Foo:TFoo; //jetzt kann man eben irgendwo (für Ereignisse meist in einer Klasse) //eine Variable deklarieren var gEineMethode:TeineMethode; begin Foo:=TFoo.Create; gEineMethode:=Foo.EineMethode; //jetzt steht in der Variablen gEineMethode der Zeiger auf die Methode EineMethode der Instanz Foo. Das sind simple 8 Bytes (2 Zeiger) //jetzt kannst du geMeineMethode ainfach aufrufen und es wird die darin gespeicherte Methode aufgerufen gEineMethode; //und wir können eine andere Methode drin speichern: gEineMethode:=Foo.andereMethode; //und aufrufen gEineMethode end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:24 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 by Thomas Breitkreuz