![]() |
Ereignisse
Ich benutze in meinem Programm die Ereignisse. wie z.B. onclick und co.
Wenn das Objekt bereits da ist kann man auf dieses klicken und das Ereignis per maus erstellen. Jetzt erzeuge ich jedoch dynamisch ein Objekt und möchte auch die Ereignisse nutzen. Dafür habe ich eine Procedure
Delphi-Quellcode:
Wenn die Form1 erzeugt wird habe ich folgendes Deklariert
procedure testlauf(sender: TObject);
begin form1.Caption:='Der Test ist ok'; end;
Delphi-Quellcode:
Es kommt die Fehlermeldung : E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
windowsmediaplayer1.OnStatusChange:=testlauf; //das Ergeigniss Statusänderung wird def
Wie muss ich die Procedure deklarieren um die Ergebnisse zu nutzen ? |
Re: Ereignisse
Die Prozedur muss eine Methode sein, das heißt sie muss als Member einer Klasse deklariert sein. Beispiel:
Delphi-Quellcode:
type
TForm1 = class(TForm) private procedure testlauf(sender: TObject); end; // ... procedure TForm1.testlauf(sender: TObject); begin form1.Caption:='Der Test ist ok'; end; |
Re: Ereignisse
Das hatte ich bereits gemacht leider ohner Erfolg
Delphi-Quellcode:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, Grids, jpeg, ExtCtrls, OleCtrls, WMPLib_TLB, AXVLC_TLB, Outline, DirOutln, FileCtrl, ShlObj, ActiveX, Registry; type TForm1 = class(TForm) PageControl1: TPageControl; TabSheet1: TTabSheet; TabSheet2: TTabSheet; PageControl2: TPageControl; TabSheet3: TTabSheet; TabSheet4: TTabSheet; Image1: TImage; TabSheet8: TTabSheet; PageControl4: TPageControl; TabSheet9: TTabSheet; RadioGroup1: TRadioGroup; RadioButton1: TRadioButton; RadioButton2: TRadioButton; RadioButton3: TRadioButton; TabSheet10: TTabSheet; PageControl3: TPageControl; TabSheet5: TTabSheet; StringGrid1: TStringGrid; TabSheet6: TTabSheet; Button1: TButton; ListBox1: TListBox; Button2: TButton; procedure FormCreate(Sender: TObject); procedure FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean); procedure Button1Click(Sender: TObject); procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure FormResize(Sender: TObject); procedure RadioButton1Click(Sender: TObject); procedure RadioButton2Click(Sender: TObject); procedure RadioButton3Click(Sender: TObject); procedure TabSheet4Show(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure TabSheet8Show(Sender: TObject); private { Private-Deklarationen } procedure testlauf(sender: TObject); public { Public-Deklarationen } end;
Delphi-Quellcode:
var
Form1: TForm1; Vorschauname1,Vorschauname2,Vorschauname3,row:string; oi:integer; ausschalt:boolean; VLCPlugin1: TVLCPlugin; blVLCPluginFound: boolean; mediaplayerPluginFound:boolean; WindowsMediaPlayer1: TWindowsMediaPlayer; Oder muss ich dem Windowsmediaplayer die procedure zuordnen ? ---------------------------------------- Die Class wäre ja TWindowsmediaplayer aber so kann ich die Procedur nicht zuordnen.
Delphi-Quellcode:
Ich denke mal ich habe da einen Denkfehler wie an dieser Stelle Delphi arbeitet.
type
TWindowsMediaPlayer1 = class(TWindowsMediaPlayer) private procedure testlauf(sender: TObject); end; |
Re: Ereignisse
Zitat:
Zitat:
Delphi-Quellcode:
constructor TWindowsMediaPlayer1.Create(AOwner: TComponent);
begin inherited; OnStatusChange := testlauf; end; |
Re: Ereignisse
Zitat:
Delphi-Quellcode:
Nachdem du die Klammer aufgemacht hast, sollte dir die Delphi IDE Hilfe zu den Parametern anbieten.
windowsmediaplayer1.OnStatusChange(
Falls nicht musst du sie dir irgendwo im Netz suchen. Musst einfach das Ereignis - wie oben schon beschrieben - als Methode des Form1 deklarieren und die richtigen Parameter einsetzen. |
Re: Ereignisse
Zitat:
Sicher, dass es ein OnStatusChange gibt?
Delphi-Quellcode:
Ansonsten habe ich
property OnClick: EMPNotify read FOnClick write FOnClick;
property OnContextPopup; property OnEnter; property OnExit; property OnMouseEnter; property OnMouseLeave; property OnPostClick: EMPPostNotify read FOnPostClick write FOnPostClick; property OnNotify: TNotifyEvent read FOnNotify write FOnNotify; ![]()
Delphi-Quellcode:
TWMStatusChangeEvent = procedure(const State: WideString) of Object;
|
Re: Ereignisse
Was heißt hier
Zitat:
Bevor Du meine Aussage in Frage stellst, solltest Du Dir erstmal darüber im Klaren sein, um welches Control es hier geht :!: Zitat:
Die Komponente, um die es hier geht, nämlich TWindowsMediaPlayer, besitzt sehr wohl ein Event namens OnStatusChange. Nun sage mir, was an meinem Beitrag #4 falsch ist. |
Re: Ereignisse
OK, dass das 2 unterschiedliche Klassen sind wusste ich nicht, mein Fehler! :stupid:
Und ich hab auch grad kein Delphi da um das nachzuschauen, trotzdem sieht das was du da machst... sagen wir "suboptimal" aus. Ich gehe mal davon aus, dass TWindowsMediaPlayer eine Klasse ist. Diese hat scheinbar das Event OnStatusChange. Wenn man bei diesem Event jetzt was machen will, warum sollte man extra für dieses Ereignis die Klasse ableiten und das im Constructor regeln? Viel einfacher wäre doch ein
Delphi-Quellcode:
Außerdem... ist TWindowsMediaPlayer1 bei dir eine Klasse oder eine Instanz? :zwinker:
MyWindowsMediaPlayer := TWindowsMediaPlayer.Create();
MyWindowsMediaPlayer.OnStatusChange := MeineStatusChangeMethode; |
Re: Ereignisse
Zitat:
So habe ich es ja bereits versucht. Siehe Oben leider ohne Erfolg |
Re: Ereignisse
Zitat:
Delphi-Quellcode:
Wird eigentlich immer so gemacht.
TForm1 = class(TForm)
{...} procedure MeineStatusChangeMethode(Sender: TObject); end; implementation {...} procedure TForm1.MachMediaplayer; begin MyWindowsMediaPlayer := TWindowsMediaPlayer.Create(); MyWindowsMediaPlayer.OnStatusChange := {Self.}MeineStatusChangeMethode; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:57 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-2025 by Thomas Breitkreuz