Announcement

Collapse
No announcement yet.

Fehlermeldung: Inkompatible Typen: Methodenzeiger und Prozedur

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

  • Fehlermeldung: Inkompatible Typen: Methodenzeiger und Prozedur

    Hallo
    Diese Meldung bekomme ich immer, wenn ich einer dynamisch erzeugten Komponente ein Ereignis zuweisen will. Die Ereignisprozedur funktioniert und lässt sich problemlos zuweisen, wenn sie im private oder public Bereiche des FORMULARS steht, ansonsten nicht. Die Prozedur verwendet auch die richtige Syntax (siehe beigefügte Codestücke). Wer weiß Rat?

    Unit 1:
    --------
    ...

    type
    TMyForm = class(Tform)
    ...
    procedure TuIrgendWas;
    ...
    end;
    ...

    uses
    unit2;
    ...
    procedure TMyForm. TuIrgendWas;
    begin
    ...
    ErzeugeKomponenteAusUnit2;
    ...
    end;

    Unit 2:
    --------

    interface

    procedure RxCharIstDa(Sender : Tobject ; Count : Integer);
    ...
    var
    MyComPort: TComPort ;
    ...
    implementation

    procedure RxCharIstDa(Sender : Tobject ; Count : Integer);
    begin
    ShowMessage(IntToStr(Count));
    end;

    procedure ErzeugeKomponenteAusUnit2;
    begin
    MyComPort := TComPort.Create(nil) ;
    MyComPort.OnRxChar := RxCharIstDa; // <- Hier kommt der Fehler
    end;
    ...

  • #2
    Hi

    Der Unterschied von Methoden und Proceduren ist folgender

    <pre>

    type
    TProcedure = procedure; // einfache procedure
    TMethode = procedure; of object; // Methode

    </pre>

    Eine methode (Event) wird somit als <b>"zu einem object zugehörige procedure"</b> definiert. Dadurch impliziert eine Methode immer einen versteckten Parameter "Self", auf das "gemeinte" Object.
    Du versuchst nun eine normale procedure einer Methodenvariablen zuzuweisen, das geht nicht.<br>
    <b>2 Lösungen:</b><br>
    1. Die methode in ein Object verlagern, also das was Du mit "private"/"public" Bereich Deines Forms meintest.<br>
    2. follow:

    <pre>

    procedure RxCharIstDa(Self, Sender: Tobject; Count: Integer);
    begin
    ...blabla
    end;

    var
    N: TRxCharEvent; // procedure(Sender: TObject; Count: Integer); of object;

    begin
    TMethod(N).Data := nil; // versteckter Self Parameter !!
    TMethod(N).Code := @RxCharIsDa;

    ...
    MyComPort.OnRxChar := N;
    end;

    <pre>

    Ist NICHT clean aber ein PASCAL sauberer Code.

    Gruß Hage

    Comment


    • #3
      Danke Hagen!
      Das war sehr anschaulich - hab's kapiert!

      Terr

      Comment

      Working...
      X