Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Type im einer Klasse -> public erlaubt? (https://www.delphipraxis.net/176857-type-im-einer-klasse-public-erlaubt.html)

Mokus 1. Okt 2013 08:04

Delphi-Version: XE2

Type im einer Klasse -> public erlaubt?
 
Delphi-Quellcode:
type

  Twoerterzaehlen = class(Tobject)

  private
    procedure setFwort(const Value: String);

    procedure setFAnzahl(const Value: integer);
  protected
    fWort: string;
    fAnzahl: integer;
  public type
    arroftwoerter = array of Twoerterzaehlen;// möchte ich ich in anderen uniten verwenden
  constructor create(Anz: integer; Wor: String); overload;
  constructor create(Wor: String); overload;
  property Wort: String read fWort write setFwort;
  property Anzahl: integer read fAnzahl write setFAnzahl;

  function woerter_zaehlen(st_woerter: tstringlist): arroftwoerter;
  function toString(a_array: arroftwoerter): String;
  end;
Einen wunder schönen Guten Morgen,

der oben liegende Quellcode ist mein momentanes ergebniss von Aufgabe;
Ich arbeite über mehere Units und muss auf die hervorbehobene Zeile drauf zugreifen.
Deswegen ist Sie im Public.
In der nächsten Unit hab ich nun use woerter ( name der oben abgebildete Unit)
aber er sagt mir dann,
[FEHLER] [DCC Fehler] sortieren.pas(12): E2003 Undeklarierter Bezeichner: 'arroftwoerter' [/Fehler];

Delphi-Quellcode:
unit sortieren;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, woerter;

Type
  sort = class
    function sortieren(d_array: arroftwoerter): arroftwoerter;// FEHLER Zeile;
  end;

implementation


Tut mir leid, für die warscheinlich doofe Frage; aber Delphi ist totales Neuland für mich ....

dank im vorraus :)

mkinzler 1. Okt 2013 08:08

AW: Type im einer Klasse -> public erlaubt?
 
Deklariere ihn im Interface der Unit, vor der Klasse

Delphi-Quellcode:
type

  Twoerterzaehlen = class; //forward Deklaration

  arroftwoerter = array of Twoerterzaehlen;// möchte ich ich in anderen uniten verwenden
 
  Twoerterzaehlen = class(Tobject)

  private
    procedure setFwort(const Value: String);

    procedure setFAnzahl(const Value: integer);
  protected
    fWort: string;
    fAnzahl: integer;
  constructor create(Anz: integer; Wor: String); overload;
  constructor create(Wor: String); overload;
  property Wort: String read fWort write setFwort;
  property Anzahl: integer read fAnzahl write setFAnzahl;

  function woerter_zaehlen(st_woerter: tstringlist): arroftwoerter;
  function toString(a_array: arroftwoerter): String;
  end;

DeddyH 1. Okt 2013 08:11

AW: Type im einer Klasse -> public erlaubt?
 
Nested Types gehören ja zu der Klasse, in der sie deklariert sind. Also muss es wohl lauten:
Delphi-Quellcode:
function sortieren(d_array: Twoerterzaehlen.arroftwoerter): Twoerterzaehlen.arroftwoerter;
//Dummy-Zeile für den DP-Highlighter
Oder Du machst es Dir einfach und machst einen "normalen" Typ daraus wie Markus gezeigt hat.

Uwe Raabe 1. Okt 2013 08:12

AW: Type im einer Klasse -> public erlaubt?
 
Das es sich um einen Nested Type handelt, musst du ihn außerhalb der Klasse voll qualifizieren:

Delphi-Quellcode:
    function sortieren(d_array: Twoerterzaehlen.arroftwoerter): Twoerterzaehlen.arroftwoerter;

Mokus 1. Okt 2013 08:17

AW: Type im einer Klasse -> public erlaubt?
 
Das ich diese vollständig weiter geben muss, war mir nicht bekannt.

Dank euch.

himitsu 1. Okt 2013 11:14

AW: Type im einer Klasse -> public erlaubt?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1230412)
Das es sich um einen Nested Type handelt, musst du ihn außerhalb der Klasse voll qualifizieren:

Jain.

Also zumindesntens bis XE geht es auch ohne einen vollqualifizierten Typbezeichner.

irgendwann danach wurden dann (zumindestens weiß ich es von ENUMs) im Compiler eine Option eingebaut, bzw. standardmäßig aktiviert, welche die Angabe des Namespace (vollqualifizierten Typbezeichners) verlangt,
welches man aber auch wieder deaktivieren kann.

Mokus 1. Okt 2013 15:17

AW: Type im einer Klasse -> public erlaubt?
 
Aber könnte durch das Deaktivieren nicht auch die Eindeutigkeit verloren gehen;
und somit eine verwechslung vorkommen?
Ich persönlich finde schon, dass es nützlich ist eine eindeutige qualifizieren "auszusprechen"

himitsu 1. Okt 2013 16:38

AW: Type im einer Klasse -> public erlaubt?
 
Man kann es praktisch für jeden Typen einzeln angeben.

Nja, also wo es wirklich absolut unleserlich wird, ist da, wo z.B. mehrere/viele ENUMs als SET angegeben werden müssen und man da nicht viel als Bereich (..) zusammenfassen kann.

WITH mit Typen gibt es doch bestimmt noch nicht und wer kommt schon auf die Idee sich dafür einen lokalen Typen/Alias mit "kurzem" Bezeichner anzulegen und am Besten einbuchstabig?



Selbst wenn es dektiviert wurde, dann kann man immernoch per NameSpace zugreifen, wenn es nicht eindeutig ist.
Außerdem prüft ja der Compiler die Typkompatibilität, womit man sowieso keinen falschen Wert verwenden kann.

Praktisch ist das vorallem dadurch, daß man bei den Werten den Prefix weglassen kann.
Delphi-Quellcode:
type
  TEnumeration = (Onw, Two, Tree);
Wobei "kann" besser "sollte" heißen sollte, denn Namespace und Prefix zusammen sind ja ein bissl sinnlos.

Mokus 2. Okt 2013 06:59

AW: Type im einer Klasse -> public erlaubt?
 
Zitat:

Wobei "kann" besser "sollte" heißen sollte, denn Namespace und Prefix zusammen sind ja ein bissl sinnlos.
hust,
doppelt hält besser ;-)

irgendwer muss immer drunter leiden...
arme performance :p


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