Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ereignisse (https://www.delphipraxis.net/144833-ereignisse.html)

michback 17. Dez 2009 19:06


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:
procedure testlauf(sender: TObject);
begin
form1.Caption:='Der Test ist ok';
end;
Wenn die Form1 erzeugt wird habe ich folgendes Deklariert

Delphi-Quellcode:
windowsmediaplayer1.OnStatusChange:=testlauf; //das Ergeigniss Statusänderung wird def
Es kommt die Fehlermeldung : E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'

Wie muss ich die Procedure deklarieren um die Ergebnisse zu nutzen ?

dominikkv 17. Dez 2009 19:11

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;

michback 17. Dez 2009 19:20

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:
 type
  TWindowsMediaPlayer1 = class(TWindowsMediaPlayer)
  private
    procedure testlauf(sender: TObject);
  end;
Ich denke mal ich habe da einen Denkfehler wie an dieser Stelle Delphi arbeitet.

MarioM. 17. Dez 2009 19:55

Re: Ereignisse
 
Zitat:

Zitat von michback
Oder muss ich dem Windowsmediaplayer die procedure zuordnen ?

Ja

Zitat:

Zitat von michback
Die Class wäre ja TWindowsmediaplayer aber so kann ich die Procedur nicht zuordnen.

Nimm die Zuweisung im Create-Event des Mediaplayers vor.
Delphi-Quellcode:
constructor TWindowsMediaPlayer1.Create(AOwner: TComponent);
begin
   inherited;

   OnStatusChange := testlauf;
end;

Cicaro 17. Dez 2009 20:10

Re: Ereignisse
 
Zitat:

Zitat von michback
Wie muss ich die Procedure deklarieren um die Ergebnisse zu nutzen ?

Tipp mal Folgendes ein:

Delphi-Quellcode:
windowsmediaplayer1.OnStatusChange(
Nachdem du die Klammer aufgemacht hast, sollte dir die Delphi IDE Hilfe zu den Parametern anbieten.

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.

dominikkv 17. Dez 2009 20:31

Re: Ereignisse
 
Zitat:

Zitat von MarioM.
Zitat:

Zitat von michback
Oder muss ich dem Windowsmediaplayer die procedure zuordnen ?

Ja

Zitat:

Zitat von michback
Die Class wäre ja TWindowsmediaplayer aber so kann ich die Procedur nicht zuordnen.

Nimm die Zuweisung im Create-Event des Mediaplayers vor.
Delphi-Quellcode:
constructor TWindowsMediaPlayer1.Create(AOwner: TComponent);
begin
   inherited;

   OnStatusChange := testlauf;
end;

Nein!

Sicher, dass es ein OnStatusChange gibt?

Delphi-Quellcode:
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;
Ansonsten habe ich im Internet noch folgendes gefunden:

Delphi-Quellcode:
TWMStatusChangeEvent = procedure(const State: WideString) of Object;

MarioM. 17. Dez 2009 20:55

Re: Ereignisse
 
Was heißt hier
Zitat:

Zitat von dominikkv
Nein!

:?:

Bevor Du meine Aussage in Frage stellst, solltest Du Dir erstmal darüber im Klaren sein, um welches Control es hier geht :!:

Zitat:

Zitat von dominikkv
Sicher, dass es ein OnStatusChange gibt?

Delphi-Quellcode:
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;

Du postest hier Events der TMediaPlayer-Komponente; die ist aber nicht Thema dieses Beitrages!
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.

dominikkv 17. Dez 2009 23:17

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:
MyWindowsMediaPlayer := TWindowsMediaPlayer.Create();
MyWindowsMediaPlayer.OnStatusChange := MeineStatusChangeMethode;
Außerdem... ist TWindowsMediaPlayer1 bei dir eine Klasse oder eine Instanz? :zwinker:

michback 18. Dez 2009 05:38

Re: Ereignisse
 
Zitat:

Zitat von dominikkv
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:
MyWindowsMediaPlayer := TWindowsMediaPlayer.Create();
MyWindowsMediaPlayer.OnStatusChange := MeineStatusChangeMethode;
Außerdem... ist TWindowsMediaPlayer1 bei dir eine Klasse oder eine Instanz? :zwinker:




So habe ich es ja bereits versucht. Siehe Oben leider ohne Erfolg

Blup 18. Dez 2009 09:00

Re: Ereignisse
 
Zitat:

Zitat von michback
So habe ich es ja bereits versucht. Siehe Oben leider ohne Erfolg

Oben steht eine ganze Menge und was heißt "ohne Erfolg"?
Delphi-Quellcode:
TForm1 = class(TForm)
{...}
  procedure MeineStatusChangeMethode(Sender: TObject);
end;

implementation

{...}
procedure TForm1.MachMediaplayer;
begin
  MyWindowsMediaPlayer := TWindowsMediaPlayer.Create();
  MyWindowsMediaPlayer.OnStatusChange := {Self.}MeineStatusChangeMethode;
end;
Wird eigentlich immer so gemacht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:50 Uhr.
Seite 1 von 2  1 2      

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