Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variable nur in der unit sichtbar machen (https://www.delphipraxis.net/92644-variable-nur-der-unit-sichtbar-machen.html)

Andreas L. 23. Mai 2007 19:56


Variable nur in der unit sichtbar machen
 
Hi,
wenn ich eine Variable im protected-Teil meiner Komponente deklariere kann diese ja auch von anderen Komponenten und Routinen die in dieser Unit enthalten sind verwendet werden. Dachte ich jedenfalls. So sieht mein Code aus:

Delphi-Quellcode:
type
 TTrack = record
   ...
   ...
 end;

 TTrackCollection = Array of TTrack;

type
  TTracks = class(TComponent)
  public
    function Add(Track: TTrack):Integer;
  end;

type
  TXSPF = class(TComponent)
  private
    FOptions: TOptions;
    FFilename: String;
    FTracks: TTracks;
  protected
    FTrackCollection: TTrackCollection;
  public
    property Tracks: TTracks read FTracks;
  published
    constructor Create(AOwner: TComponent); override;
    property Options: TOptions read FOptions write FOptions;
    property Filename: String read FFilename write FFilename;
  end;
Wenn ich jetzt in function TTracks.add(Track: TTrack):Integer; auf FTrackCollection zugreifen möchte, meldet der Compiler "[Pascal Fehler] XSPF.pas(89): E2003 Undefinierter Bezeichner: 'FTrackCollection'". Doch warum?

bye,
Andy

Apollonius 23. Mai 2007 20:01

Re: Variable nur in der unit sichtbar machen
 
Was ist denn, wenn du mehrere Instanzen von TXSPF hast? Soll sich das Programm dann die Instanz aussuchen, die ihm am besten gefällt und daraus die FTrackColllection nehmen? Entweder du gibst eine Instanz an oder du leitest ab. Denn ein protected field ist keine globale Variable.

mkinzler 23. Mai 2007 20:02

Re: Variable nur in der unit sichtbar machen
 
Es handelt sich hier aber um einen Member der Klasse TXSPF

Apollonius 23. Mai 2007 20:04

Re: Variable nur in der unit sichtbar machen
 
Wir reden hier doch über TTracks.add? Wie soll denn eine Methode auf ein Feld einer Klasse, die nichts mit der eigenen Klasse zu tun hat, zugreifen?

mkinzler 23. Mai 2007 20:07

Re: Variable nur in der unit sichtbar machen
 
Zeig mal die Methode.

daddy 23. Mai 2007 20:18

Re: Variable nur in der unit sichtbar machen
 
So wie ich das sehe, wirst Du Deiner Funktion "ADD" noch einen Parameter vom Typ "TTrackCollection" spendieren müssen.

Gruß Daddy

Andreas L. 23. Mai 2007 20:50

Re: Variable nur in der unit sichtbar machen
 
Hier die ganze Unit:
Delphi-Quellcode:
unit XSPF;

interface

uses
  SysUtils, Classes;

type
  TOptions = set of (opAllowUrls, opAllowRelativePaths, opAllowLocalFiles);

type
 TTrack = record
   Location: String;   //filename (also relative) or url, see TOptions
   Identifier: String; //file hash, etc...
   Title: String;
   Creator: String;    //artist
   Annotation: String; //comment
   Info: String;       //homepage for more informations
   Image: String;      //e. g. a cover. URL or filename required
   Album: String;
   TrackNum: Integer;  //track number/position in the playlist or on the cd
   Duration: Integer;  //length in miliseconds
 end;

 TTrackCollection = Array of TTrack;

type
  TTracks = class(TComponent)
  public
    function Add(Track: TTrack):Integer;
  end;

type
  TXSPF = class(TComponent)
  private
    FOptions: TOptions;
    FFilename: String;
    FTracks: TTracks;
  protected
     FTrackCollection: TTrackCollection;
  public
    property Tracks: TTracks read FTracks;
  published
    constructor Create(AOwner: TComponent); override;
    property Options: TOptions read FOptions write FOptions;
    property Filename: String read FFilename write FFilename;
  end;

procedure Register;

implementation

{$R 'TXSPF.dcr'}

procedure Register;
begin
  RegisterComponents('CapSystems', [TXSPF]);
end;

constructor TXSPF.Create(AOwner: TComponent);
begin

 inherited Create(AOwner);

 FOptions := [opAllowUrls, opAllowRelativePaths, opAllowLocalFiles];
 FFilename := '';
 SetLength(FTrackCollection, 0);

end;

function TTracks.Add(Track: TTrack):Integer;
begin

 if Length(FTrackCollection) <> 0 then
  begin

   SetLength(FTrackCollection, Length(FTrackCollection) + 1);

  end;

 FTrackCollection[Length(FTrackCollection)] := Track;
 Result := Length(FTrackCollection);

end;

end.

mkinzler 23. Mai 2007 21:02

Re: Variable nur in der unit sichtbar machen
 
Wie gesagt benötigst du eine Instanz der Klasse

Delphi-Quellcode:
<Instanz von TXSPF>.FTrackCollection

Andreas L. 23. Mai 2007 21:07

Re: Variable nur in der unit sichtbar machen
 
Und wie bekomme ich dann die Instanz?

mkinzler 23. Mai 2007 21:10

Re: Variable nur in der unit sichtbar machen
 
Delphi-Quellcode:
var
   ...
    XSPF: TXSPF ...
...

    XSPF := TXSPF.Create ( self);

Andreas L. 23. Mai 2007 21:15

Re: Variable nur in der unit sichtbar machen
 
Das ist aber irgendwie blöd. Ich könnte ja theoretisch eine globale Variable von FTrackCollection anlegen. Doch dann ist die ja von außerhalb auch beschreibbar.

Gibt's denn nicht noch eine Alternative?

mkinzler 23. Mai 2007 21:19

Re: Variable nur in der unit sichtbar machen
 
Zitat:

Das ist aber irgendwie blöd. Ich könnte ja theoretisch eine globale Variable von FTrackCollection anlegen. Doch dann ist die ja von außerhalb auch beschreibbar.
Nicht wenn du sie im Implementation-Teil anlegst

Andreas L. 23. Mai 2007 21:21

Re: Variable nur in der unit sichtbar machen
 
Stimmt. :wall: Sollte wohl mal wieder schlafen. :freak:

Hurra es kompiliert... :stupid:

daddy 23. Mai 2007 22:36

Re: Variable nur in der unit sichtbar machen
 
Also ich blick da nicht ganz durch. :wiejetzt:

Du möchtest doch innerhalb deiner Objektinstanz das dort deklarierte Tracks.Add(...) aufrufen. Was nützt Dir denn dann eine außerhalb davon deklarierte zusätzliche Objektinstanz. Und warum fügst Du deiner Routine "Add" nicht einfach einen Parameter vom Typ "TTrackCollection" zu und rufst dann Tracks.Add(..., FTrackCollection) auf? Wäre doch viel sauberer und universeller nutzbar. Oder versteh ich hier irgend etwas völlig falsch?

Gruß, Daddy

mkinzler 24. Mai 2007 06:37

Re: Variable nur in der unit sichtbar machen
 
Er möchte nur eine Liste haben, welche nur in der Unit sichtbar ist.


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