![]() |
Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
Hallo Gemeinde.
Ich baue mir gerade ein Singleton, was auch prima klappt solange ich in den Properties nur auf Klassenvariablen zugreife, aber folgende Konstruktion führt zu einem Fehler:
Delphi-Quellcode:
Die Fehlermeldung:
TYPE
TDP = CLASS PRIVATE CLASS VAR _instance : TDP; FXMLFileName : STRING; PUBLIC DESTRUCTOR Destroy; Override; CLASS FUNCTION Instance : TDP; CLASS FUNCTION NewInstance: TObject; Override; CLASS PROCEDURE NewXMLFileName(aFilename: String); CLASS PROPERTY XMLFileName : STRING READ FXMLFileName WRITE NewXMLFileName; // Fehler! END; E2355 Für den Zugriff auf Klasseneigenschaften muss ein Klassenfeld oder eine statische Klassenmethode verwendet werden. Wenn ich stattdessen:
Delphi-Quellcode:
schreibe, ist es ok. Ich wollte aber gern eine Klassenmethode aufrufen.
CLASS PROPERTY XMLFileName : STRING READ FXMLFileName WRITE FXMLFileName;
Jemand eine Idee, was ich falsch mache? Vielen Dank & Gruß Jazzman |
AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
Hinter deinen Klassenmethoden fehlt das Schlüsselwort static. ;-)
Nebenbei würde ich mir mal einen Styleguide anschauen, der Quelltext sieht ja aus... // EDIT:
Delphi-Quellcode:
type
TDP = class private class var FInstance: TDP; FXMLFileName: string; public destructor Destroy; override; class function Instance: TDP; class function NewInstance: TObject; override; class procedure SetXMLFileName(const AFilename: string); static; class property XMLFileName: string read FXMLFileName write SetXMLFileName; end; |
AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
Die Ursache ist wohl einfach nur, daß solche Klasseneigenschaften, aus irgendwelchen unerfindlichen Gründen, keine "Vererbung" unterstützen.
Darum auch nur direkte Klassenvariablen oder statische Klassenmethoden. Also im Grunde hatte dir doch die Fehlermeldung ja genau gesagt, was somit nötig wäre. :angle2: Die Aufrufkonventionen zwischen eine Klassenmethode und einer statischen Klassenmethode sind halt ein bissl unterschiedlich. Denn statische Klassenmethoden besitzen kein Self. Bei den sonstigen Methoden wird über Self der Klassentyp mitgegeben, über welchen die Methode aufgerufen wurde. (bei "normalen" Methoden steckt in Self natürlich die Objekt-Instanz)
Delphi-Quellcode:
TForm1 = class(TForm)
class procedure ClassMethod(i: Integer); class procedure StaticClassMethod(i: Integer); static; class procedure VirtualClassMethod(i: Integer); virtual; end; ClassMethod(123); StaticClassMethod(456); VirtualClassMethod(789); Unit1.pas.37: ClassMethod(123); 004A0ECF BA7B000000 mov edx,$0000007b 004A0ED4 8B03 mov eax,[ebx] 004A0ED6 E8E9FFFFFF call TForm1.ClassMethod Unit1.pas.38: StaticClassMethod(456); 004A0EDB B8C8010000 mov eax,$000001c8 004A0EE0 E80F000000 call TForm1.StaticClassMethod Unit1.pas.39: VirtualClassMethod(789); 004A0EE5 BA15030000 mov edx,$00000315 004A0EEA 8B03 mov eax,[ebx] 004A0EEC FF9018010000 call dword ptr [eax+$00000118]
Delphi-Quellcode:
type
TForm1 = class(TForm) class procedure ClassMethod(i: Integer); class procedure StaticClassMethod(i: Integer); static; end; TFormX = class(TForm1) end; class procedure TForm1.ClassMethod(i: Integer); begin ShowMessage(Format('%s %s %d', [Self.ClassName, ClassName, i])); end; class procedure TForm1.StaticClassMethod(i: Integer); begin ShowMessage(Format('%s %d', [ClassName, i])); end; TFormX.ClassMethod(123); TFormX.StaticClassMethod(456); // TFormX TFormX 123 // TForm1 456 |
AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
Zitat:
Zitat:
Zitat:
Aber Danke auch für diesen Hinweis. Schönen Abend an alle! Gruß Jazzman |
AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
Ich meinte nicht nur die Groß- und Kleinschreibung. ;-)
Unterstriche in Bezeichnern (_instance) sind nicht üblich und Getter und Setter sollten auch so heißen, nämlich mit Get und Set anfangen. ;-) Besonders letzteres ist wichtig, da du sonst die Klassenvervollständigung von Delphi durcheinanderbringst. (Und man den Code nebenbei auch kaum versteht.) ;-) |
AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
Zitat:
Zitat:
Zitat:
Zitat:
Lieben Dank für die Kommentare! Gruß Jazzman |
AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
Sagen wir es mal so: Hauptsache es ist überhaupt ein einheitlicher Style vorhanden ... also dem her wäre es eigentlich noch vollkommen OK.
STRING oder String? :angle2: |
AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
Zitat:
Danke & Gruß Jazzman |
AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
Ich habe ja auch geschrieben sollte, nicht muss.
Wenn ich solchen Quelltext bekomme, schicke ich den ohnehin erst einmal durch den Formatter. ich finde es nur schöner, wenn das nicht nötig ist, aber leider ist der VCL- und RTL-Quelltext selbst nicht ganz sauber... ;-) |
AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
Zitat:
Bis auf die bereits eingestandene Groß/Kleinschreibung und die Set/Get-Namensgebung sehe ich nicht, was der Formatter denn da großartig korrigieren wird. Übrigens die _instance Schreibweise (_ Unterstrich) scheint bei Singletons ganz üblich zu sein ![]() Gruß, Jazzman |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:29 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-2025 by Thomas Breitkreuz