Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Inkompatible Typen: Reguläre Prozedure und Methodenzeiger (https://www.delphipraxis.net/104884-inkompatible-typen-regulaere-prozedure-und-methodenzeiger.html)

Ares 12. Dez 2007 10:45


Inkompatible Typen: Reguläre Prozedure und Methodenzeiger
 
Hallo!

Folgende Situation:

Delphi-Quellcode:
unit A;

type
  TPassiertWas = procedure(Param1, Param2: String);

  TMyObject = class(TObject);
  private
    FOnPassiertWas : TPassiertWas;
  public
    procedure TuWas;
    property OnPassiertWas: TPassiertWas read FOnPassiertWas write FOnPassiertWas;
  end;

...

procedure TMyObject.TuWas;
begin
  ...
  if (Assigned(FOnPassiertWas) then FOnPassiertWas('eins', 'zwei');
end;
Delphi-Quellcode:
unit B;

uses
  A;

type
  TMyIrgenwas = class(TObject);
  private
    FMyObj: TMyObject;
    procedure Reagiere(Param1, Param2: String);
  public
    constructor Create;
  end;

...

constructor TMyIrgenwas.Create;
begin
  FMyObj := TMyObject.Create;
  FMyObj.OnPassiertWas := Reagiere; // <-- Fehler: Inkompatible Typen: 'Reguläre Prozedur und Methodenzeiger'
end;

procedure TMyIrgendwas.Reagiere;
begin
  MachWas();
end;

Was mache ich hier falsch? Warum kann ich dem Eventhandler OnPassiertWas nicht die Methode Reagiere zuweisen? Reagiere ist eine Methode einer klasse und keine reguläre Prozedur. Wo liegt also der Fehler?

Besten Dank
Ares

sirius 12. Dez 2007 10:49

Re: Inkompatible Typen: Reguläre Prozedure und Methodenzeige
 
Delphi-Quellcode:
type
  TPassiertWas = procedure(Param1, Param2: String) of object;

Christian Seehase 12. Dez 2007 12:44

Re: Inkompatible Typen: Reguläre Prozedure und Methodenzeige
 
Moin Ares,

wie die Fehlermeldung schon sagt.
Du versuchst eine Prozedur zu übergeben, und keine Methode.

Eine Prozedur (Funktion) hat die Parameter, die man sehen kann, eine Methode hat hingegen noch einen unsichtbaren Parameter self.
Dieser befindet sich vor den anderen.
Damit die interne Struktur stimmt muss die Prozedur so erweitert werden, wie Sirius es geschrieben hat.

himitsu 12. Dez 2007 13:28

Re: Inkompatible Typen: Reguläre Prozedure und Methodenzeige
 
MUSS is so ein unschönes Wort und KANN ist doch auch nett? :stupid:

Delphi-Quellcode:
type TPassiertWas = procedure(Self: TObject; Param1, Param2: String);

ja und sowas gibt's och noch
Delphi-Quellcode:
type
  TMyObject = class(TObject);
    public
      class procedure TuWas;
    end;

TPassiertWas = procedure(Self: TClass; Param1, Param2: String);
aber sirius's Vorschlag ist wohl etwas verständlicher :roll:

Christian Seehase 12. Dez 2007 13:31

Re: Inkompatible Typen: Reguläre Prozedure und Methodenzeige
 
Moin Himitsu,

klar, so geht es wohl auch, aber die andere Variante ist doch etwas sauberer ;-)


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