![]() |
Verwendung von Events
Ich erstelle zur Laufzeit Komponenten in einer eigenen Klasse und möchte auf Events dieser Komponenten reagieren, jedoch bekomme ich nicht heraus, wie ich den Events eine bestimmte Prozedur zuweiße. Dabei möchte ich zwei Varianten realisieren:
Auf das Event der Komponente soll in meiner erstellten Klasse reagiert werden. Ich habe das Event "onDone" und möchte darauf mit einer Ausführung meines Codes reagieren:
Delphi-Quellcode:
Sobald ich die Zuweisung von FWaveOut.OnDone := ProcessSavingThreadAsWave(...) mache wirft er mir folgenden Error:
procedure TAudioControl.StartSavingThreadAsWave(AOwner: TComponent; SaveDirectory: String);
var InputStream: TStreamIn; begin if 1 <= (TrackList.High + 1) then begin FWaveOut := TWaveOut.Create(AOwner); InputStream := TStreamIn.Create(AOwner); FWaveOut.Input := InputStream; InputStream.InChannels := TrackList.FNumberOfChannels; InputStream.InBitsPerSample := TrackList.FBitsPerSample; InputStream.InSampleRate := TrackList.SampleRate; InputStream.Stream := TFileStream.Create(TrackList[0].StreamPath, fmOpenRead); FWaveOut.FileName := SaveDirectory + '1.wav'; FWaveOut.OnDone := ProcessSavingThreadAsWave(AOwner, SaveDirectory, 2); FWaveOut.Run; end else begin FWaveOut.Free; end; end; procedure TAudioControl.ProcessSavingThreadAsWave(AOwner: TComponent; SaveDirectory: String; TrackNumber: Integer); begin if TrackNumber <= (TrackList.High + 1) then begin FWaveOut.FileName := SaveDirectory + '/' + IntToStr(TrackNumber) + '.wav'; Inc(TrackNumber); FWaveOut.OnDone := ProcessSavingThreadAsWave(AOwner, SaveDirectory, TrackNumber); FWaveOut.Run; end else begin FWaveOut.Free; end; end; end.
Code:
Als Information ist der Code der WaveOut Komponente sicher noch nützlich:
[dcc32 Error] AudioControl.pas(227): E2010 Incompatible types: 'TOutputDoneEvent' and 'procedure, untyped pointer or untyped parameter'
Delphi-Quellcode:
Das zweite Problem ist, dass meine selbst erstellte Klasse solch ein Event weitergeben soll, dazu kann ich nach dieser
TOutputDoneEvent = procedure(Sender : TComponent) of object;
FOnDone : TOutputDoneEvent; property OnDone : TOutputDoneEvent read FOnDone write FOndone; ![]() Als ![]() |
AW: Verwendung von Events
Die Methode die du zuweisen möchtest muss die gleichen Parameter haben, wie in
Delphi-Quellcode:
deklariert (also nur ein Parameter vom Typ
TOutputDoneEvent
Delphi-Quellcode:
).
TObject
|
AW: Verwendung von Events
Müsste es (gekürzt) dann so aussehen?
Delphi-Quellcode:
Dabei bekomme ich dann leider diesen Fehler ausgespuckt:
procedure TAudioControl.StartSavingThreadAsWave(Sender: TObject);
begin FWaveOut := TWaveOut.Create(nil); FWaveOut.OnDone := ProcessSavingThreadAsWave; end; procedure TAudioControl.ProcessSavingThreadAsWave(Sender: TObject); begin FWaveOut.OnDone := ProcessSavingThreadAsWave; end;
Code:
Und das verwirrt mit bisschen. Ändere ich alles wieder auf TComponent, dann kommt der Fehler aus meinem vorigen Posting. Muss meine Klasse denn von einer bestimmten Komponente erben wie TComponent oder TObject?
[dcc32 Error] AudioControl.pas(227): E2010 Incompatible types: 'TComponent' and 'TObject'
|
AW: Verwendung von Events
wenn Du hier ankommst
Delphi-Quellcode:
muss das obige
procedure TAudioControl.ProcessSavingThreadAsWave(Sender: TComponent);
begin // hier das was Du tun möchtest mit ProcessSavingThreadAsWave end;
Delphi-Quellcode:
in StartSavingThreadAsWave ja schon funktioniert haben ....
FWaveOut.OnDone := ProcessSavingThreadAsWave;
|
AW: Verwendung von Events
Oh, da hatte ich mich verlesen, der Parameter muss vom Typ
Delphi-Quellcode:
sein.
TComponent
(siehe
Delphi-Quellcode:
)
TOutputDoneEvent = procedure(Sender : TComponent) of object;
Also so muss die Methode deklariert sein
Delphi-Quellcode:
Tutorial zu Events
procedure TAudioControl.ProcessSavingThreadAsWave(Sender: TComponent);
begin ... end; ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 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