Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi "nil" wird nicht als Parameter für TNotifyEvent zugelassen (https://www.delphipraxis.net/56173-nil-wird-nicht-als-parameter-fuer-tnotifyevent-zugelassen.html)

mirage228 1. Nov 2005 22:11


"nil" wird nicht als Parameter für TNotifyEvent zu
 
Hallo,

Ich habe diese beiden überladenen Methoden (in etwa):
Delphi-Quellcode:
  function AddMenuItem(Parent: TTBXSubmenuItem; ItemClass: TComponentClass;
    const Caption, Name, Hint: string; Tag, ImageIndex: Integer;
    OnClick: TNotifyEvent; ImageList: TImageList): TComponent; overload;
  function AddMenuItem(Parent: TTBXSubmenuItem;
    ItemClass: TComponentClass; Action: TBasicAction; const Name: string;
    Tag: Integer; Images: TImageList): TComponent; overload;
Versuche ich nun die erste Methode so aufzurufen:
Delphi-Quellcode:
  AddMenuItem(nil, nil, '', '', '', 0, -1, nil, nil);
Das quittiert der Compiler mit:
Zitat:

[Fehler] Unit4.pas(78 ): E2250 Es gibt keine überladene Version von 'AddMenuItem', die man mit diesen Argumenten aufrufen kann
Schreibe ich das so, gehts:
Delphi-Quellcode:
  AddMenuItem(nil, nil, '', '', '', 0, -1, TNotifyEvent(nil), nil);
Lasse ich die Überladung weg, habe also nur noch eine AddMenuItem Methode, geht es auch ohne den Type-Cast.

Ich konnte das mit Delphi 6, 7 und 2005 reproduzieren.
Schlimm ist es ja nun nicht, aber merkwürdig finde ich das schon...

Also, wo liegt die Ursache dieses "Phänomens"?

mfG
mirage228

jim_raynor 1. Nov 2005 22:14

Re: "nil" wird nicht als Parameter für TNotifyEven
 
nil ist ja auch nur ein 4 Byte Zeiger. Aber TNotifyEvent ist 8 Byte (Pointer auf Objekt + Pointer auf Funktion). Würde sagen du musst dir was mit TMethod basteln. (keine Ahnung ob es klappt).

Delphi-Quellcode:
var
  nilMeth: TMethod;
begin
nilMeth.Code:=nil;
nilMeth.Data:=nil;

AddMenuItem(TNotifyEvent(nilMeth) ...

mirage228 1. Nov 2005 22:19

Re: "nil" wird nicht als Parameter für TNotifyEven
 
Hi,

hm, ja, das klingt logisch. Wieso wird ein normales "nil", ohne Überladung, dann akzeptiert? Oder ist der Compiler bei den Überladungen und den Prozedurparametern da nur etwas "genauer"?

mfG
mirage228

xaromz 1. Nov 2005 22:20

Re: "nil" wird nicht als Parameter für TNotifyEven
 
Hallo,
Zitat:

Zitat von jim_raynor
nil ist ja auch nur ein 4 Byte Zeiger. Aber TNotifyEvent ist 8 Byte (Pointer auf Objekt + Pointer auf Funktion

Das ist leider Blödsinn. Ein TNotifyEvent ist ein Zeiger auf eine Methode. Und als Zeiger ist auch TNotifyEvent vier Byte lang. Der Self-Zeiger, den Du ansprichst, wird per Compiler-Magic an die Methode übergeben.

Gruß
xaromz

jim_raynor 1. Nov 2005 22:25

Re: "nil" wird nicht als Parameter für TNotifyEven
 
@xaromz:

Probier es aus:

Delphi-Quellcode:
begin
  ShowMessage(IntToStr(SizeOf(TNotifyEvent)));
end;
Zumindestens bei Delphi 5 gibt es 8 aus. Denn du kannst ja auch:

Delphi-Quellcode:
var
  a: TNotifyEvent;
begin
  a:=Form1.ButtonClick;
  a(Self);
end;
Und dann verrate mir mal, wo der Compiler mit seiner Compiler-Magic die Referenz auf Form1 in a speichern soll?

xaromz 1. Nov 2005 22:35

Re: "nil" wird nicht als Parameter für TNotifyEven
 
Hallo,
Zitat:

Zitat von jim_raynor
@xaromz:

Probier es aus:

Delphi-Quellcode:
begin
  ShowMessage(IntToStr(SizeOf(TNotifyEvent)));
end;
Zumindestens bei Delphi 5 gibt es 8 aus. Denn du kannst ja auch:

Delphi-Quellcode:
var
  a: TNotifyEvent;
begin
  a:=Form1.ButtonClick;
  a(Self);
end;
Und dann verrate mir mal, wo der Compiler mit seiner Compiler-Magic die Referenz auf Form1 in a speichern soll?

hast natürlich recht :oops: . Sowas aber auch. Es stellt sich allerdings die Frage, wieso man einem TNotifyEvent nil (vier Byte) zuweisen kann, das aber nicht über eine Prozedur geht (beim Property-Setter geht's ja auch). Fragen über Fragen...

Gruß
xaromz

jim_raynor 1. Nov 2005 22:45

Re: "nil" wird nicht als Parameter für TNotifyEven
 
MMh. Bin bissle mit dem Topic-Title durcheinander gekommen, da dort was anderes steht, als im Beitrag ;) Denke mal, für den Compiler ist im Falle es im Falle von nil nur ein vier Byte Pointer. Bei Überladungen und bei var Parametern prüft er etwas genauer die Typen. Er sucht also wirklich passende Typen. Er sagt er auch bei Überladungen nie Inkompatible Typen, sondern immer nur Es gibt keine Überladene ... blalaber.

mirage228 3. Nov 2005 15:19

Re: "nil" wird nicht als Parameter für TNotifyEven
 
Hi,

Sorry, dass ich erst jetzt anworte, habe den Thread irgendwie vergessen...

Also dann bleibe ich dann auch bei der Vermutung, dass der Compiler bei overload-Methoden einfach etwas genauer mit den Typen der Parameterliste ist.
Wie man das dann machen kann, habe ich ja im ersten Beitrag schon geschrieben.

mfG
mirage228


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz