Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht (https://www.delphipraxis.net/162113-zugriff-auf-klasseneigenschaften-verstehe-die-fehlermledung-nicht.html)

Jazzman_Marburg 7. Aug 2011 13:22

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:
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;
Die Fehlermeldung:
E2355 Für den Zugriff auf Klasseneigenschaften muss ein Klassenfeld oder eine statische Klassenmethode verwendet werden.

Wenn ich stattdessen:
Delphi-Quellcode:
CLASS PROPERTY XMLFileName : STRING READ FXMLFileName WRITE FXMLFileName;
schreibe, ist es ok. Ich wollte aber gern eine Klassenmethode aufrufen.

Jemand eine Idee, was ich falsch mache?

Vielen Dank & Gruß
Jazzman

jaenicke 7. Aug 2011 14:12

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;

himitsu 7. Aug 2011 16:00

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

Jazzman_Marburg 7. Aug 2011 17:52

AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
 
Zitat:

Zitat von jaenicke (Beitrag 1115503)
Hinter deinen Klassenmethoden fehlt das Schlüsselwort static. ;-)

:thumb: Vielen Dank!

Zitat:

Zitat von himitsu (Beitrag 1115518)
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.

Juup, das hilft! :-D

Zitat:

Zitat von jaenicke (Beitrag 1115503)
Nebenbei würde ich mir mal einen Styleguide anschauen, der Quelltext sieht ja aus...

Ooch, soo übel sieht das garnicht aus -- habe mir halt die Großschreibung angewöhnt und werd sie nicht mehr los.

Aber Danke auch für diesen Hinweis.

Schönen Abend an alle!

Gruß
Jazzman

jaenicke 7. Aug 2011 19:30

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.) ;-)

Jazzman_Marburg 7. Aug 2011 20:49

AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
 
Zitat:

Zitat von jaenicke (Beitrag 1115542)
Ich meinte nicht nur die Groß- und Kleinschreibung. ;-)

Puuh.

Zitat:

Zitat von jaenicke (Beitrag 1115542)
Unterstriche in Bezeichnern (_instance) sind nicht üblich

100% korrekt - ist Mist.

Zitat:

Zitat von jaenicke (Beitrag 1115542)
...und Getter und Setter sollten auch so heißen, nämlich mit Get und Set anfangen. ;-)

Ebenso.

Zitat:

Zitat von jaenicke (Beitrag 1115542)
...die Klassenvervollständigung von Delphi durcheinanderbringst...

Delphi XE Starter -- da gibt es so einen Luxus nicht. Man war hier der Meinung, Hobby-Programmierer benötigten sowas nicht (in etwa so, als wenn selten-Autofahrer kein ABS benötigen, das ist nur etwas für Profis :evil:).

Lieben Dank für die Kommentare!

Gruß
Jazzman

himitsu 7. Aug 2011 22:35

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:

Jazzman_Marburg 8. Aug 2011 09:08

AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
 
Zitat:

Zitat von himitsu (Beitrag 1115561)
... also dem her wäre es eigentlich noch vollkommen OK.

Ich finde auch.

Danke & Gruß
Jazzman

jaenicke 8. Aug 2011 10:15

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... ;-)

Jazzman_Marburg 8. Aug 2011 15:26

AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
 
Zitat:

Zitat von jaenicke (Beitrag 1115605)
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... ;-)

Hmmm... also jetzt bin aber doch mal neugierig: Wir sieht denn mein Coding (s.o.) aus, nach dem der Formatter seine Arbeit erledigt hat aus? (Kenne den "Formatter" nicht).

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 http://vcldeveloper.com/tips-tricks/...ern-in-delphi/.

Gruß, Jazzman

Stevie 8. Aug 2011 15:30

AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
 
Zitat:

Zitat von Jazzman_Marburg (Beitrag 1115535)
Ooch, soo übel sieht das garnicht aus -- habe mir halt die Großschreibung angewöhnt und werd sie nicht mehr los.

Dazu fällt mir ein Zitat ein: "I like my source code yelling at me!" ;)

himitsu 8. Aug 2011 16:17

AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
 
Liste der Anhänge anzeigen (Anzahl: 2)
Der Codeformatter fehlt wohl im XE Starter? (bin mir grad nicht so sicher)

Strg+D

Standardmäßig dürfte es wohl so aussehn, aber man kann die Formatter meißt noch an seine Wünsche anpassen.
Delphi-Quellcode:
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;
Es gibt aber auch externe Bei Google suchenDelphi Code Formatter


[edit]
och menno, das Bild wird hier ja automatisch bis zur Unkenntlichkeit verkleinert :wall:



Und ja, ich hab auch meinen ganz privaten "Schreibstil" und leider noch keinen Code Formatter gefunden, welcher diesen so schön hinbekommt :cry:

Hier müßte ja eigentlich noch der "class var"-Block eingerückt werden, aber leider hat man sowas vergessen zu implementieren (und sowas auch noch vom Verfasser der Syntax :wall: )

FredlFesl 9. Aug 2011 07:22

AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
 
Zitat:

Zitat von Jazzman_Marburg (Beitrag 1115656)
Übrigens die _instance Schreibweise (_ Unterstrich) scheint bei Singletons ganz üblich zu sein

... Na ja. "Üblich" mit einem Beispiel belegen zu wollen, ist nicht gerade üblich.

Jazzman_Marburg 9. Aug 2011 09:57

AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
 
Zitat:

Zitat von FredlFesl (Beitrag 1115698)
... Na ja. "Üblich" mit einem Beispiel belegen zu wollen, ist nicht gerade üblich.

Och, nur mal so auf die Schnelle:
Delphi-Praxis
w3support
Delphigroups

Irgendwelche Win-Botschaften fangen auch mit _WM an -- aber weder bin ich da Spezialist noch möchte ich einen Glaubenskrieg vom Zaun brechen: Nix fü Ungut :-D.

Gruß
Jazzman

jaenicke 9. Aug 2011 10:21

AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
 
Zitat:

Zitat von Jazzman_Marburg (Beitrag 1115716)
Irgendwelche Win-Botschaften fangen auch mit _WM an

Richtig, das ist eine Ausnahme, die auch im Styleguide erwähnt wird. Bei Headerübersetzungen usw. sollte man die ursprüngliche Schreibweise beibehalten, hier eben die in C/C++ übliche. Sonst findet man seine Übersetzungen ja nicht. ;-)

FredlFesl 10. Aug 2011 07:05

AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
 
Zitat:

Zitat von Jazzman_Marburg (Beitrag 1115716)
Och, nur mal so auf die Schnelle:
w3support

Wieso bringst Du C# Code als Beispiel?:lol:
Zitat:

Zitat von Jazzman_Marburg (Beitrag 1115716)

Ein Beispiel, das sofort korrigiert wird. :lol:

Du kannst es drehen und wenden, wie Du willst: Es gibt einen StyleGuide, an den man sich halten sollte. Aber auspeitschen wird man dic deswegen nicht. Nur jedesmal drauf ansprechen... ;-)

Zurück zum Thema, oder?

himitsu 10. Aug 2011 08:26

AW: Zugriff auf Klasseneigenschaften -- Verstehe die Fehlermledung nicht
 
Wie gesagt, er hat ja wenigstens eine gewisse Formatierung drin.
Im Gegensatz zu dem, was man sonst so, von vielen Anderen, zu sehen bekommt.


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