Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Published Methode und Zeiger (https://www.delphipraxis.net/191076-published-methode-und-zeiger.html)

Ghostwalker 5. Dez 2016 17:15

Delphi-Version: 2006

Published Methode und Zeiger
 
Öhm...beim testen meiner Event-Liste fällt mir grad was auf.

Das

Delphi-Quellcode:
{$Methodinfo on}
Type
  TMyObject = Class(TObject)
  private
  protected
  public
  published
    Procedure DoSomething(aPointer:pointer);
quitiert der Compiler mit einem internen Fehler. Verschieb ich die Methode in den Public-Bereich
funzt er wider.

Ist das in neueren Versionen auch so ? Warum ? :shock:

himitsu 5. Dez 2016 19:46

AW: Published Methode und Zeiger
 
Interne Fehler hab ich och öfters.

Aber muß die Methode überhaut unbedingt published sein?

Ghostwalker 6. Dez 2016 07:19

AW: Published Methode und Zeiger
 
Jup, sonst krieg ich keine RTTI-Infos über die Methode an anderer Stelle.

Ich hab als Test mal das $METHODINFO raus, dann läufts. Scheint so als hätte BDS2006 da ein Problem,
wenn ich als Parameter einen Zeiger (egal ob typisiert oder pointer) benutzen will.


Ich weiß nicht, in wie weit das Problem noch in neueren Delphi-Versionen existiert, da sich da in Sachen RTTI ja einiges getan hat.

uligerhardt 6. Dez 2016 08:01

AW: Published Methode und Zeiger
 
Ich hab's mal kurz getestet. Folgender Code:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  SysUtils;

{$METHODINFO on}
type
  TMyObject = class(TObject)
  private
  protected
  public
  published
    procedure DoSomething(aPointer: pointer);
  end;

{ TMyObject }

procedure TMyObject.DoSomething(aPointer: pointer);
begin

end;

begin
  try
    { TODO -oUser -cConsole Main : Code hier einfügen }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
liefert unter D2007
Zitat:

[DCC Fehler] Project1.dpr(18): F2084 Interner Fehler: D13360
Unter XE6 kompiliert's kommentarlos.

Ghostwalker 6. Dez 2016 09:19

AW: Published Methode und Zeiger
 
Jup..genau den bekomm ich auch unter 2006.

Ich schätz mal das das für neuere Versionen (pi mal daumen ab XE) wohl gefixt wurde.

Für meine Event-Liste hab ich (für besagte Ältere Versionen) einen andere Weg gefunden, um Zeiger als
Parameter übergeben zu können.

himitsu 6. Dez 2016 09:54

AW: Published Methode und Zeiger
 
Es kommt drauf an mit welchen RTTIFunktionen man das ausliest.

Die "neue" erweiterte RTTI hat standardmäßig auch Public-Methoden drin und selbst bis runter zu Private liestet die auf.
Delphi-Quellcode:
{$METHODINFO ON}
wäre da nicht nötig. Das wird dann über
Delphi-Quellcode:
{$RTTI METHODS([vcPublic, vcProtected, vcPrivate])}
geregelt.

Ghostwalker 6. Dez 2016 10:35

AW: Published Methode und Zeiger
 
Jap. Da ich aber nicht über die neue RTTI verfüge, krieg ich die Infos über die Parameter und Aufruf-Konventionen nur über die VMT und damit letztlich nur aus dem published Bereich.

Was mich verwundert ist nur, das bei obigem Beispiel der Compiler einen Fehler rauswirft (eben interner Fehler), während sowas:

Delphi-Quellcode:
$METHODINFO on}
type
  TMyObject = class(TObject)
  private
  protected
  public
  published
    procedure DoSomething(caption:widestring);
  end;
Kein Problem ist. Widestring ist ja (intern betrachtet) auch nix anderes als ein Pointer. Sogar var oder out Parameter (auch wieder nix anderes als Pointer) frist der Compiler ohne zu Mucken.

Nur eben Zeiger (egal ob typisiert oder untypisiert) mag er so garnicht in dem Bereich.

Stevie 6. Dez 2016 15:29

AW: Published Methode und Zeiger
 
Interne Compilerfehler ergeben in den seltensten Fällen einen logischen Sinn - es sind Defekte im Compilercode, die zu einem wie auch immer gearteten Fehler (AV oder sonstiges) führen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 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