Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Spezielle Konstruktion funktioniert in D2005 nicht mehr (https://www.delphipraxis.net/36775-spezielle-konstruktion-funktioniert-d2005-nicht-mehr.html)

mirage228 25. Dez 2004 14:33


Spezielle Konstruktion funktioniert in D2005 nicht mehr
 
Hallo,

ich hatte unter Delphi 7 diese Konstruktion (bzw. Klasse), die ohne Probleme funktionierte:

Delphi-Quellcode:
type
  TCipher = class(TObject)
  protected
    class function GetGUID(): TGUID; virtual; abstract;
    class function GetName(): WideString; virtual; abstract;
    class function GetShortDesc(): WideString; virtual; abstract;
    class function GetAdvDesc(): WideString; virtual; abstract;
    class function GetDevelopers(): WideString; virtual; abstract;
    class function GetSecurity(): Integer; virtual; abstract;
    class function GetSpeed(): Integer; virtual; abstract;
  public
    property Name      : WideString read GetName;
    property ID        : TGUID      read GetGUID;
    property ShortDesc : WideString read GetShortDesc;
    property AdvDesc   : WideString read GetAdvDesc;
    property Developers : WideString read GetDevelopers;
    property Security  : Integer    read GetSecurity;
    property Speed     : Integer    read GetSpeed;

    procedure WriteInformationToStream(F: TStream); virtual; abstract;
    procedure ReadInformationFromStream(F: TStream); virtual; abstract;

    procedure EnCryptText(const InPut, Password: WideString;
      var Result: WideString); virtual; abstract;
    procedure EnCryptFile(InPut, OutPut: TStream;
      const Password: WideString); virtual; abstract;
    procedure DeCryptText(const InPut, Password: WideString;
      var Result: WideString); virtual; abstract;
    procedure DeCryptFile(InPut, OutPut: TStream;
      const Password: WideString); virtual; abstract;
end;
Unter Delphi 2005 bekomme ich jedoch diese Fehlermeldungen:
Zitat:

[Fehler] uAppCipherClass.pas(30): E2356 Für Eigenschaftszugriff muss ein Instanzenfeld oder eine Instanzenmethode verwendet werden
[Fehler] uAppCipherClass.pas(22): E2065 Ungenügende Forward- oder External-Deklaration: 'TCipher.GetGUID'
Erstere für jede property, letztere für jede Abstrakte Methode.

Was mache ich falsch und wieso ist solch ein Konstrukt nicht mehr in Delphi Win32 in Delphi 2005 erlaubt?

mfG
mirage228

Christian Seehase 25. Dez 2004 15:36

Re: Spezielle Konstruktion funktioniert in D2005 nicht mehr
 
Moin David,

sieht für mich so aus, als akzeptiere D2005 keine Klassenmethoden als Get-/Setmethoden für Eigenschaften.

mirage228 25. Dez 2004 15:46

Re: Spezielle Konstruktion funktioniert in D2005 nicht mehr
 
Hi Christian,

ja das erscheint mir auch so :? . Nur: Wieso sollte es denn nicht mehr gehen? :gruebel:

mfG
mirage228

Edit:
P.S.: Unter Windows.Forms geht es auch nicht.

Robert Marquardt 25. Dez 2004 16:37

Re: Spezielle Konstruktion funktioniert in D2005 nicht mehr
 
Eine virtuelle abstrakte Klassen-Methode? Das ist doch ein bischen widersinnig. Auf jeden Fall etwas ueberdesignt.
Entweder hat man Klassenmethoden, dann ist die Property zuviel, oder umgekehrt.

Bernhard Geyer 25. Dez 2004 17:00

Re: Spezielle Konstruktion funktioniert in D2005 nicht mehr
 
Ich denke mal der neue Compiler ist hier etwas strenger.

Evtl. kannst Du vor den Property auch noch das Schlüsselwort class setzen, damit der Compiler weiß das wirklich alles sich auf die Klasse und nicht auf Instanzen bezieht. (Klassen-Member sollten mit D2005 jetzt erlaubt sein).
So ist er überfordert. Ist das Property nun Klassen- oder Instanzabhängig.

Was hat den der alte Compiler gemacht? Wurden die Properties der Klasse zugeodnet (Alle Instanzen hatten den selben Wert) oder den Instanzen (Die class-Angaben wurden ignoriert).

mytar 25. Dez 2004 17:07

Re: Spezielle Konstruktion funktioniert in D2005 nicht mehr
 
Was erreiche ich mit diesem class vor der Methode?

Beispiel:
Delphi-Quellcode:
class function GetGUID(): TGUID; virtual; abstract;
Danke :-D

Bernhard Geyer 25. Dez 2004 17:09

Re: Spezielle Konstruktion funktioniert in D2005 nicht mehr
 
Das die Methode der Klasse zugeordnet ist und nicht einer Instanz davon.
Du kannst Die Methode anwenden ohne eine Instanz der Klasse zu haben.
Du darfst in einer solchen Methode nicht auf Member von Variablen zugreifen.
Der Konstruktor Create ist eine Klassenmethode.

Delphi-Quellcode:
TMyClass.Create(Owner);
TMyClass.MyClassMethode(...);

mytar 25. Dez 2004 17:11

Re: Spezielle Konstruktion funktioniert in D2005 nicht mehr
 
Wieso sollte ich eine Klassenmethode aufrufen wollen,
bevor ich sie instanziert habe?

:-D
Danke

Bernhard Geyer 25. Dez 2004 17:16

Re: Spezielle Konstruktion funktioniert in D2005 nicht mehr
 
Zitat:

Zitat von mytar
Wieso sollte ich eine Klassenmethode aufrufen wollen,
bevor ich sie instanziert habe?

Um z.B. Instanzübergreifende Einstellungen vorzunehmen. Oder die Anzahl der Instanzen der Klasse abzufragen.
Alles was keiner einzelnen Instanz zugeordnet werden kann sondern für alle Instanzen der Klasse gilt/gelten soll.

mirage228 26. Dez 2004 07:37

Re: Spezielle Konstruktion funktioniert in D2005 nicht mehr
 
Zitat:

Zitat von Robert Marquardt
Eine virtuelle abstrakte Klassen-Methode? Das ist doch ein bischen widersinnig. Auf jeden Fall etwas ueberdesignt. Entweder hat man Klassenmethoden, dann ist die Property zuviel, oder umgekehrt.

Ja der Code ist schon etwas älter und es gibt sicher wege, das ganze eleganter und evtl. auch besser zu lösen, aber es geht mir darum, dass der Code unter D7 einwandfrei und korrekt funktioniert hat und in D2005 halt nicht mehr :?

Zitat:

Zitat von Bernhard Geyer
Evtl. kannst Du vor den Property auch noch das Schlüsselwort class setzen, damit der Compiler weiß das wirklich alles sich auf die Klasse und nicht auf Instanzen bezieht. (Klassen-Member sollten mit D2005 jetzt erlaubt sein).

Wenn ich "class property" schreibe, erhalte ich folgende Meldung:
Zitat:

[Fehler] uAppCipherClass.pas(30): E2355 Für den Zugriff auf Klasseneigenschaften muss ein Klassenfeld oder eine statische Klassenmethode verwendet werden
Also scheint D2005 für class properties wohl keine virtuellen bzw. virtuell abstrakten Klassenmethoden zuzulassen. :?

Zitat:

Zitat von Bernhard Geyer
Ich denke mal der neue Compiler ist hier etwas strenger.
So ist er überfordert. Ist das Property nun Klassen- oder Instanzabhängig.
Was hat den der alte Compiler gemacht? Wurden die Properties der Klasse zugeodnet (Alle Instanzen hatten den selben Wert) oder den Instanzen (Die class-Angaben wurden ignoriert).

Ja, das wird wohl so sein (... oder doch ein "Bug"?), aber wieso hatte D7 das noch richtig gemacht bzw. es akzeptiert (D2005 hat ja für den Win32 Teil "nur" ein veränderten D7 Compiler) und jede Instanz hatte den selben Wert (also die properties waren der Klasse zugeordnet)?

mfG
mirage228


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr.
Seite 1 von 2  1 2      

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