Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Klassenchaos (https://www.delphipraxis.net/153319-klassenchaos.html)

LWChris 29. Jul 2010 05:36

Klassenchaos
 
Hallo,

kann mir jemand auf die Schnelle sagen, wo hier der Fehler liegt? :?
Ich bekomme in TAlbum.GetSC immer vor dem Songs einen Fehler E2066 Operator oder Semikolon fehlt

Delphi-Quellcode:
function TAlbum.GetSC: Integer;
begin
  result:=Length(<HIER>Songs);
end;
:shock:

Bei allen anderen Klassen klappt alles; wenn ich Length(Songs) durch ein schlichte 0 ersetze, klappt es auch.

Delphi-Quellcode:
unit U_Tools;

interface

uses
  SysUtils, Classes, Links;

// Parameters
type
  TAlbumType = (atAlbum, atDoubleAlbum, atCompilation, atSingle, atEP, atBoxSet,
               atDisneyST, atMovieST, atMusicalST, atTVSeriesST, atVideoGameST);

// Forward declarations              
  TAlbum = class;
  TSong = class;

// Classes
  TArtist = class
    Links: TLinks;
    Name: String;
    Albums: Array of TAlbum;
    Songs: Array of TSong;
    function GetAC: Integer;
    function GetSC: Integer;
    procedure AddAlbum(Album: TAlbum);
    procedure AddSong(Song: TSong);
    property AlbumCount: Integer read GetAC;
    property SongCount: Integer read GetSC;
  end;

  TAlbum = class
    Links: TLinks;
    Title: String;
    Year: String;
    Artist: TArtist;
    Songs: Array of TSong;
    AlbumType: TAlbumType;
    Length: Integer;
    Genre: String;
    function GetSC: Integer;
    procedure AddSong(Song: TSong);
    property SongCount: Integer read GetSC;
  end;

  TSong = class
    Links: TLinks;
    Title: String;
    Artist: TArtist;
    Albums: Array of TAlbum;
    function GetAC: Integer;
    procedure AddAlbum(Album: TAlbum);
    property AlbumCount: Integer read GetAC;
  end;

function FLetterUC(Title: String): String;

implementation

function FLetterUC(Title: String): String;
var a: Integer; NextLetterUC: Boolean;
begin
  result:=''; NextLetterUC:=True;
  for a:=1 to Length(Title) do
    begin
      if NextLetterUC then
        result:=result+AnsiUpperCase(Title[a])
      else
        result:=result+Title[a];
      NextLetterUC:=((Title[a]=' ') or (Title[a]='('));
    end;
end;

// ARTIST //

function TArtist.GetAC: Integer;
begin
  result:=Length(Albums);
end;

function TArtist.GetSC: Integer;
begin
  result:=Length(Songs);
end;

procedure TArtist.AddAlbum(Album: TAlbum);
begin
  SetLength(Albums,AlbumCount+1);
  Albums[AlbumCount-1]:=Album;
end;

procedure TArtist.AddSong(Song: TSong);
begin
  SetLength(Songs,SongCount+1);
  Songs[SongCount-1]:=Song;
end;

// ALBUM //

function TAlbum.GetSC: Integer;
begin
  result:=Length(Songs);
end;

procedure TAlbum.AddSong(Song: TSong);
begin
  SetLength(Songs,SongCount+1);
  Songs[SongCount-1]:=Song;
end;

// SONG //

function TSong.GetAC: Integer;
begin
  result:=Length(Albums);
end;

procedure TSong.AddAlbum(Album: TAlbum);
begin
  SetLength(Albums,AlbumCount+1);
  Albums[AlbumCount-1]:=Album;
end;

end.
Ich bin vollkommen ratlos :(

LWChris 29. Jul 2010 05:44

AW: Klassenchaos
 
OMG ich habs gefunden :oops: Ich hab ein Attribut "Length" - und ich hab ehrlich 2 Stunden den Fehler gesucht deswegen :lol:

Nix für ungut. Sorry.

himitsu 29. Jul 2010 07:29

AW: Klassenchaos
 
Für Andere, mit dem selben Problem.
Hier noch die unterschlagene Lösung:
* entweder man bennent das gleichnamige Feld oder eine gleichnamige Funktion/Prozedur um, hier das
Delphi-Quellcode:
TAlbum = class
  ...
  Length: Integer;
* oder man gibt einen Namespace mit an, also (das gewünschte "Length" liegt in der Unit System)
Delphi-Quellcode:
function TAlbum.GetSC: Integer;
begin
  result := System.Length(Songs);
end;

xZise 29. Jul 2010 07:34

AW: Klassenchaos
 
Alternativ kann man, was sich gerade bei der Eigenschaft "Length" anbietet, es auch als eine Property schreiben, die auf das private Feld FLength zugreift.

Jetzt ungetestet, aber das müsste auch gehen.

MfG
Fabian

himitsu 29. Jul 2010 07:48

AW: Klassenchaos
 
ob nun ein direktes Feld "Length" oder ein Property "Length" ... in beiden Fällen wird das/die "Length" der Systemunit verdeckt :zwinker:

xZise 29. Jul 2010 08:23

AW: Klassenchaos
 
Ach mist, ich dachte bei Read-Only Properties funktioniert es. Wobei eigentlich ergibt es eher andersherum nur Sinn. Naja gut alternativ schreibe "Size" :D

MfG
Fabian

LWChris 29. Jul 2010 08:57

AW: Klassenchaos
 
Da es bei mir um Zeiten geht, heißt es "Duration" ;) Klar, auf "System.Length" hätte ich auch kommen können :stupid:

himitsu 29. Jul 2010 08:58

AW: Klassenchaos
 
Zitat:

Zitat von xZise (Beitrag 1038292)
Ach mist, ich dachte bei Read-Only Properties funktioniert es.

Nee, dann mekert Delphi nur, daß diesem nichts zugewiesen werden kann, falls man es versucht.


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