AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi "nil" wird nicht als Parameter für TNotifyEvent zugelassen
Thema durchsuchen
Ansicht
Themen-Optionen

"nil" wird nicht als Parameter für TNotifyEvent zugelassen

Ein Thema von mirage228 · begonnen am 1. Nov 2005 · letzter Beitrag vom 3. Nov 2005
Antwort Antwort
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#1

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

  Alt 1. Nov 2005, 23:11
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:
  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:
  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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#2

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

  Alt 1. Nov 2005, 23:14
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) ...
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#3

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

  Alt 1. Nov 2005, 23:19
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#4

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

  Alt 1. Nov 2005, 23:20
Hallo,
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
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#5

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

  Alt 1. Nov 2005, 23:25
@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?
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#6

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

  Alt 1. Nov 2005, 23:35
Hallo,
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 . 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
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#7

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

  Alt 1. Nov 2005, 23:45
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.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#8

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

  Alt 3. Nov 2005, 16:19
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:03 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