AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Verwendung von Events

Ein Thema von hadschi92 · begonnen am 8. Apr 2013 · letzter Beitrag vom 8. Apr 2013
Antwort Antwort
hadschi92

Registriert seit: 25. Okt 2006
83 Beiträge
 
Delphi XE3 Professional
 
#1

Verwendung von Events

  Alt 8. Apr 2013, 23:10
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.

Geändert von hadschi92 ( 8. Apr 2013 um 23:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Verwendung von Events

  Alt 8. Apr 2013, 23:13
Die Methode die du zuweisen möchtest muss die gleichen Parameter haben, wie in TOutputDoneEvent deklariert (also nur ein Parameter vom Typ TObject ).
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
hadschi92

Registriert seit: 25. Okt 2006
83 Beiträge
 
Delphi XE3 Professional
 
#3

AW: Verwendung von Events

  Alt 8. Apr 2013, 23:24
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?
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Verwendung von Events

  Alt 8. Apr 2013, 23:30
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
 FWaveOut.OnDone := ProcessSavingThreadAsWave; in StartSavingThreadAsWave ja schon funktioniert haben ....
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi ( 8. Apr 2013 um 23:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Verwendung von Events

  Alt 8. Apr 2013, 23:30
Oh, da hatte ich mich verlesen, der Parameter muss vom Typ TComponent sein.

(siehe 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/
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:18 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