Announcement

Collapse
No announcement yet.

Methodenzeiger mit Adresse einer Methode vergleichen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Methodenzeiger mit Adresse einer Methode vergleichen

    Hi,

    ich möchte überprüfen ob einem Ereignis eine bestimmte Methode zugewiesen ist. Mit folgendem Code funktioniert dies auch.

    procedure TForm1.Button3Click(Sender: TObject);
    var
    aNotifyEvent: TNotifyEvent;
    begin
    Button1.OnClick:= Button1Click;
    Button2.OnClick:= Button1Click;
    aNotifyEvent:= Button1Click;
    if (@Button2.OnClick = @aNotifyEvent) then
    ShowMessage('sind gleich');
    end;

    Eleganter wäre ein Vergleich ohne die Hilfsvariable, z.B. in der Form:

    if (@Button2.OnClick = @Button1Click) then

    Da meckert der Compiler aber. Auch ein @@ habe ich ausprobiert, geht auch nicht. Der Compiler denkt immer er müßte die Methode jetzt aufrufen, obwohl ein @ bzw. @@ davor steht.

    Ich bin wie immer für jeden Kommentar dankbar.

    Nico

  • #2
    Ohne Hilfsvariable geht es wohl nicht. Es wird eine Variable gabraucht, da nur diese vom Methodentyp (TNotifyEvent) sein kann. Button1Click ist nicht von einem Methodentyp. Es ist nur zuweisungskompatibel.<br>
    Das ist eine Feinheit von Pascal

    Comment


    • #3
      &lt;stichel&gt;Ja, ja, das überaus lesbare Pascal. Super Syntax: Wieviel Klammeraffen waren's doch gleich? Ach so, geht überhaupt nicht&lt;/stichel&gt; (SCNR)
      <p>
      Und jetzt im Ernst: Ich wollte letzthin eine Methode bauen, die eine (globale) Funktion zurückliefert. Das Vorhaben konnte ich leider vergessen -- egal, wie ich die Methode deklariert/implementiert und aufgerufen habe, ich hab's nicht hingekriegt.
      <br>Ciao, Uli

      Comment


      • #4
        <pre>

        type
        TGlobalFunc = function(A: Integer): Boolean;
        TGlobalFuncMethod = function(Sender: TObject): TGlobalFunc; of Object;<br>

        TmyObject = class(Tobject)
        Event: TGlobalFuncMethod;
        function DoEvent(Sender: TObject): TGlobalFunc;
        end;<br>

        function DoGlobal(A: Integer): Boolean;
        begin
        Result := A > 0;
        end;<br>

        function TMyObject.DoEvent(Sender: TObject): TGlobalFunc;
        begin
        Result := @DoGlobal;
        end;<br>

        var
        Obj: TMyObject;
        begin
        Obj := TMyObject.Create;
        Obj.Event := Obj.DoEvent;
        if Obj.Event(Obj)(1) then ;
        end;

        <br>

        Geht doch ?
        Das Geheimnis in Pascal ist das es "typisiert", d.h. auch procedure/function Variablen müssen typisiert werden damit der Compiler überprüfen kann ob die richtigen Paramter übergeben werden.

        Gruß Hage

        Comment


        • #5
          Hi Hagen,<br>
          das mit "typisiert" ist mir schon geläufig. :-)
          Der Code, der mir obige Probleme bereitet hat, existiert leider nicht mehr. Wenn ich mal Zeit habe, versuche ich, ihn zu restaurieren.
          <br>Ciao, Uli

          Comment


          • #6
            Hagen, wenn ich in deinem Code in DoEvent das "@" rausmache (kollidiert bei mir vermutlich mit Projektdefaultoption {$TYPEDADDRESS ON}), kann ich ihn <b>fast</b> kompilieren. Was den Compiler noch stört, ist das Obj.Event in der letzten Zeile. Ein direkter Aufruf von Obj.DoEvent funzt, aber der über eine weitere Variable <b>und</b> der Aufruf der zurückgelieferten Funktion -- das ist ihm wohl zuviel. Oder habe ich wieder eine syntaktische Feinheit verpasst?
            <br>Uli

            Comment

            Working...
            X