Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Verwendung von Events (https://www.delphipraxis.net/174195-verwendung-von-events.html)

hadschi92 8. Apr 2013 23:10

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:
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.
Sobald ich die Zuweisung von FWaveOut.OnDone := ProcessSavingThreadAsWave(...) mache wirft er mir folgenden Error:
Code:
[dcc32 Error] AudioControl.pas(227): E2010 Incompatible types: 'TOutputDoneEvent' and 'procedure, untyped pointer or untyped parameter'
Als Information ist der Code der WaveOut Komponente sicher noch nützlich:
Delphi-Quellcode:
TOutputDoneEvent = procedure(Sender : TComponent) of object;
FOnDone : TOutputDoneEvent;
property OnDone : TOutputDoneEvent read FOnDone write FOndone;
Das zweite Problem ist, dass meine selbst erstellte Klasse solch ein Event weitergeben soll, dazu kann ich nach dieser Anleitung ein Event erstellen, wie ich ich jedoch das Ursprungsevent mit meinem eigenen Event verknüpfe habe ich nicht herausgefunden.

Als Querverweis hier mein Projekt, in dem der ganze Code meiner selbst erstellten Klasse steht.

Sir Rufo 8. Apr 2013 23:13

AW: Verwendung von Events
 
Die Methode die du zuweisen möchtest muss die gleichen Parameter haben, wie in
Delphi-Quellcode:
TOutputDoneEvent
deklariert (also nur ein Parameter vom Typ
Delphi-Quellcode:
TObject
).

hadschi92 8. Apr 2013 23:24

AW: Verwendung von Events
 
Müsste es (gekürzt) dann so aussehen?
Delphi-Quellcode:
procedure TAudioControl.StartSavingThreadAsWave(Sender: TObject);
begin
  FWaveOut := TWaveOut.Create(nil);
  FWaveOut.OnDone := ProcessSavingThreadAsWave;
end;

procedure TAudioControl.ProcessSavingThreadAsWave(Sender: TObject);
begin
  FWaveOut.OnDone := ProcessSavingThreadAsWave;
end;
Dabei bekomme ich dann leider diesen Fehler ausgespuckt:
Code:
[dcc32 Error] AudioControl.pas(227): E2010 Incompatible types: 'TComponent' and 'TObject'
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?

Bummi 8. Apr 2013 23:30

AW: Verwendung von Events
 
wenn Du hier ankommst
Delphi-Quellcode:
procedure TAudioControl.ProcessSavingThreadAsWave(Sender: TComponent);
begin
 // hier das was Du tun möchtest mit ProcessSavingThreadAsWave
end;
muss das obige
Delphi-Quellcode:
 FWaveOut.OnDone := ProcessSavingThreadAsWave;
in StartSavingThreadAsWave ja schon funktioniert haben ....

Sir Rufo 8. Apr 2013 23:30

AW: Verwendung von Events
 
Oh, da hatte ich mich verlesen, der Parameter muss vom Typ
Delphi-Quellcode:
TComponent
sein.

(siehe
Delphi-Quellcode:
TOutputDoneEvent = procedure(Sender : TComponent) of object;
)

Also so muss die Methode deklariert sein
Delphi-Quellcode:
procedure TAudioControl.ProcessSavingThreadAsWave(Sender: TComponent);
begin
  ...
end;
Tutorial zu Events http://www.delphi-treff.de/tutorials...gnisse-events/


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