Entwickler-Ecke
Sonstiges (Delphi) - Inkompatible Typen:Methodenzeiger und reguläre Procedur
Anfänger - Do 14.10.04 21:31
Titel: Inkompatible Typen:Methodenzeiger und reguläre Procedur
Ich komme einfach nicht drauf, was falsch ist.
So sieht beispielsweise der Code aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.DFM}
Procedure Test; begin Form1.close; end;
procedure TForm1.FormCreate(Sender: TObject); begin Button1.OnClick:=Test; end;
end. |
Nun gibt er die Fehlermeldung heraus:
"Inkompatible Typen:Methodenzeiger und reguläre Procedur"
Warum? Wie müsste der Code richtig aussehen?
AXMD - Do 14.10.04 21:35
Hi,
"Test" muss den Parameter "Sender" haben, damit Delphi das Teil als TNotifyEvent erkennt :)
AXMD
//EDIT:
Code:
Delphi-Quelltext
1:
| procedure Test(Sender: TObject); ... |
Anfänger - Do 14.10.04 21:42
OK, hab ich gemacht > Fehler bleibt :?:
Als Versuch hab ich die Prozedur Form1 zugeordnet > dann funzt es :shock:
Das war aber nicht mein Ziel und würd es gern auch ohne die Zuordnung hinkriegen.
smiegel - Do 14.10.04 22:02
Hallo Anfänger,
das geht so nicht. Test muss eine Methode von TForm1 sein.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); private procedure Test(Sender: TObject); public end; ... ... procedure TForm1.Test(Sender: TObject); begin Close; end;
procedure TForm1.FormCreate(Sender: TObject); begin Button1.OnClick:=Test; end; |
AndyB - Do 14.10.04 22:04
smiegel hat folgendes geschrieben: |
das geht so nicht. Test muss eine Methode von TForm1 sein. |
Oder eine Methode eines anderen Objekts.
Sprint - Do 14.10.04 22:07
Titel: Re: Inkompatible Typen:Methodenzeiger und reguläre Procedur
Anfänger hat folgendes geschrieben: |
Ich komme einfach nicht drauf, was falsch ist.
Delphi-Quelltext 1:
| Button1.OnClick:=Test; |
Nun gibt er die Fehlermeldung heraus:
"Inkompatible Typen:Methodenzeiger und reguläre Procedur" |
OnClick ist eine Eigenschaft und erwartet einen Methodenzeiger. Und keine Prozedur.
Ich würde davon abraten, aber so kannst du es machen...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure Test(Sender: TObject); begin end;
procedure TForm1.FormCreate(Sender: TObject); var MyMethod: TMethod; begin MyMethod.Code := @Test; Button1.OnClick := TNotifyEvent(MyMethod); end; |
Anfänger - Do 14.10.04 22:17
Titel: Re: Inkompatible Typen:Methodenzeiger und reguläre Procedur
Klappt :D
Aber wieso ist davon abzuraten?
Wenn ich z.B. eine Unit habe, die keine Kompos besitzt und nur von anderen Units drauf zugegriffen werden soll, ist das doch bestimmt die beste Möglichkeit.
AndyB - Fr 15.10.04 10:54
Titel: Re: Inkompatible Typen:Methodenzeiger und reguläre Procedur
Anfänger hat folgendes geschrieben: |
Aber wieso ist davon abzuraten? |
Weil sie falsch ist und Sender somit jeden beliebigen Wert zwischen 0 und $FFFFFFFF annehmen kann.
Zitat: |
Wenn ich z.B. eine Unit habe, die keine Kompos besitzt und nur von anderen Units drauf zugegriffen werden soll, ist das doch bestimmt die beste Möglichkeit. |
Du kannst eine Klasse nehmen, die die Methoden hält.
Mit TMethod sollte nicht arbeiten, wenn man nicht die Hintergründe dazu kennt. Denn zwischen abtippen und verstehen ist immernoch ein gewaltiger Schritt. Und TMethod ist "Compiler-Eigentum", also sollte man die Vorgänge die da ablaufen verstanden haben.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!