Delphi-PRAXiS
Seite 1 von 2  1 2      

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);


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:55 Uhr.
Seite 1 von 2  1 2      

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