![]() |
"nil" wird nicht als Parameter für TNotifyEvent zu
Hallo,
Ich habe diese beiden überladenen Methoden (in etwa):
Delphi-Quellcode:
Versuche ich nun die erste Methode so aufzurufen:
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;
Delphi-Quellcode:
Das quittiert der Compiler mit:
AddMenuItem(nil, nil, '', '', '', 0, -1, nil, nil);
Zitat:
Delphi-Quellcode:
Lasse ich die Überladung weg, habe also nur noch eine AddMenuItem Methode, geht es auch ohne den Type-Cast.
AddMenuItem(nil, nil, '', '', '', 0, -1, TNotifyEvent(nil), nil);
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 |
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) ... |
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 |
Re: "nil" wird nicht als Parameter für TNotifyEven
Hallo,
Zitat:
Gruß xaromz |
Re: "nil" wird nicht als Parameter für TNotifyEven
@xaromz:
Probier es aus:
Delphi-Quellcode:
Zumindestens bei Delphi 5 gibt es 8 aus. Denn du kannst ja auch:
begin
ShowMessage(IntToStr(SizeOf(TNotifyEvent))); end;
Delphi-Quellcode:
Und dann verrate mir mal, wo der Compiler mit seiner Compiler-Magic die Referenz auf Form1 in a speichern soll?
var
a: TNotifyEvent; begin a:=Form1.ButtonClick; a(Self); end; |
Re: "nil" wird nicht als Parameter für TNotifyEven
Hallo,
Zitat:
Gruß xaromz |
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.
|
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 04:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz