Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz (https://www.delphipraxis.net/212312-ich-verstehe-das-problem-mit-dem-sichtbarkeitsattribut-nicht-ganz.html)

Alallart 24. Jan 2023 13:18

Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz
 
Das hier funktioniert:

Delphi-Quellcode:
type
  TKlasse1 = class(TObject)
    FTest: string;
  end;
Das hier funktioniert nicht:

Delphi-Quellcode:
type
  TKlasse2 = class(TStringList)
    FTest: string;
  end;
Ignorieren wir mal die Frage ob das die feine Art ist, den theoretisch sollte eine Feldvariable auch ohne Sichtbarkeitsattribute funktionieren. Ohne ein Attribut sollte FTest meines wissens nach Public (oder Published) sein.

Nun habe ich zufällig vergessen ein Sichtbarkeitsattribut in eine Klasse einzufügen, und es knallte. War ich überrascht, denn ich habe mich erinnert, dass ich vor Jahren (am Anfang) eine Klasse schon mal ohne ein Attribut gemacht habe. Und tatsächlich, leite ich die Klasse von TObject wird das akzeptiert, von anderen höheren Klassen nicht.

Ich habe da paar Theorien, aber keine wirkliche Erklärung.

Sherlock 24. Jan 2023 13:33

AW: Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz
 
Knallt es irgendwo auf dem Flur, oder hast du eine nachvollziehbare Fehlermeldung? :)
Vielleicht gibt es bereits ein FTest in "höheren" Klassen? Eventuell ist etwas anderes falsch geschrieben. Nur mit komplettem Fehlertext, den man übrigens mit F1 dann auch in der Hilfe erklärt bekommt, gerade bei älteren Fehlermeldungen klappt das überraschend gut, kann man eine sichere Aussage machen.

Sherlock

CCRDude 24. Jan 2023 13:35

AW: Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz
 
"Es knallte" ist so eine wunderbare Fehlerbeschreibung!

Laut Doku hast Du recht:

Zitat:

Ein Element ohne Attribut erhält automatisch die Sichtbarkeit des vorhergehenden Elements in der Deklaration. Die Elemente am Anfang einer Klassendeklaration ohne explizite Sichtbarkeitsangabe werden standardmäßig als published deklariert, wenn die Klasse im Status {$M+} compiliert oder von einer mit {$M+} compilierten Klasse abgeleitet wurde. Andernfalls erhalten sie das Attribut public.
TStringList stammt von TPersistent ab, für das $M+ definiert ist. Daher published, daher ungeeignet. TObject noch ohne $M+, daher public, daher möglich. Einfach kurz die Quellen zu TObject und TStringList angeschaut, schon hat man's :)

Mein Delphi (XE - bin seit dem glücklich auf Lazarus umgestiegen, daher nichts neueres) "knallt" in dem Sinne, als dass es mir das zweite schlicht nicht kompiliert.

Nachtrag:

Folgendes knallt dann logischerweise auch:
Code:
type
  {$M+}
  TClass3 = class(TObject)
    FTest: string;
  end;

Alallart 24. Jan 2023 13:39

AW: Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz
 
Also die Fehlermeldung lautet:

Code:
[Fehler] Unit1.pas(26): Das Published-Feld 'FTest' ist weder vom Typ class noch interface
Sagt mir aber nicht wirklich viel.

Nachtrag:

Danke für den Tipp mit F1, hebe nicht dran gedacht. In der Hilfe steht das:

Code:
Es wurde versucht, ein Feld in einer Klasse als published zu deklarieren, das weder ein Klassen- noch ein Schnittstellentyp ist.

program Produce;

  type
    TBaseClass = class
    published
      x : Integer;
    end;
begin
end.

Dieses Programm verursacht einen Fehler, weil 'x' in einem published-Abschnitt enthalten ist, obwohl 'x' kein Typ ist, der als published deklariert werden kann.

program Solve;
  type
    TBaseClass = class
      Fx : Integer;
    published
      property X : Integer read Fx write Fx;
    end;

begin
end.

Sie müssen alle Felder, die keine Klassen- oder Schnittstellentypen sind, aus dem published-Abschnitt einer Klasse löschen. Muss das Feld als published deklariert werden, ändern Sie es in eine Eigenschaft um, so wie es im Beispiel gezeigt wird.
Schlauer bin ich trotzdem nicht. Ich sehe den Fehler nicht.

CCRDude 24. Jan 2023 13:42

AW: Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz
 
Siehe oben, die Antwort steckt ja schon drin - als published brauchst Du ne property. Spätestens dann brauchst du mindestens ein read oder write, und wenn Du dafür die code completion wählst, fügt er die aktuellen Sichtbarkeitsattribute sogar ein.

Nachtrag: so beschreibt Emba die Fehlermeldung auch.

Alallart 24. Jan 2023 13:52

AW: Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz
 
@CCRDude

Ok, das mit {$M+} ist die Erklärung. TStringList ist übrigens von TStrings abgeleitet (bei der ich nachgeguckt habe), aber TStrings ist wiederum von TPersistent abgeleitet (wo ich nicht nachgeguckt habe).

Danke euch beiden.


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