AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz

Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz

Ein Thema von Alallart · begonnen am 24. Jan 2023 · letzter Beitrag vom 24. Jan 2023
Antwort Antwort
Alallart

Registriert seit: 8. Dez 2015
121 Beiträge
 
#1

Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz

  Alt 24. Jan 2023, 14:18
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.650 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz

  Alt 24. Jan 2023, 14:33
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
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
672 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz

  Alt 24. Jan 2023, 14:35
"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;

Geändert von CCRDude (24. Jan 2023 um 14:37 Uhr)
  Mit Zitat antworten Zitat
Alallart

Registriert seit: 8. Dez 2015
121 Beiträge
 
#4

AW: Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz

  Alt 24. Jan 2023, 14:39
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.

Geändert von Alallart (24. Jan 2023 um 14:45 Uhr)
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
672 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz

  Alt 24. Jan 2023, 14:42
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.

Geändert von CCRDude (24. Jan 2023 um 14:45 Uhr)
  Mit Zitat antworten Zitat
Alallart

Registriert seit: 8. Dez 2015
121 Beiträge
 
#6

AW: Ich verstehe das Problem mit dem Sichtbarkeitsattribut nicht ganz

  Alt 24. Jan 2023, 14:52
@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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2023, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf