Autor Beitrag
Anfänger
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

WinXP
D3 Prof
BeitragVerfasst: Do 14.10.04 21:31 
Ich komme einfach nicht drauf, was falsch ist.

So sieht beispielsweise der Code aus:
ausblenden volle Höhe 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Do 14.10.04 21:35 
Hi,

"Test" muss den Parameter "Sender" haben, damit Delphi das Teil als TNotifyEvent erkennt :)

AXMD

//EDIT:

Code:

ausblenden Delphi-Quelltext
1:
procedure Test(Sender: TObject); ...					
Anfänger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

WinXP
D3 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Do 14.10.04 22:02 
Hallo Anfänger,

das geht so nicht. Test muss eine Methode von TForm1 sein.
ausblenden 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  
    { Private-Deklarationen }  
    procedure Test(Sender: TObject);
  public  
    { Public-Deklarationen }  
  end;  
  ...
  ...
procedure TForm1.Test(Sender: TObject);  
begin  
  Close;  
end;  

 
procedure TForm1.FormCreate(Sender: TObject);  
begin  
  Button1.OnClick:=Test;  
end;

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: 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.

_________________
Ist Zeit wirklich Geld?
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Do 14.10.04 22:07 
Anfänger hat folgendes geschrieben:
Ich komme einfach nicht drauf, was falsch ist.
ausblenden 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...
ausblenden 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;

_________________
Ciao, Sprint.
Anfänger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

WinXP
D3 Prof
BeitragVerfasst: Do 14.10.04 22:17 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Fr 15.10.04 10:54 
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.

_________________
Ist Zeit wirklich Geld?