AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie greife ich auf bestimmte Objekte einer Klasse zu?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie greife ich auf bestimmte Objekte einer Klasse zu?

Ein Thema von toko · begonnen am 18. Mai 2005 · letzter Beitrag vom 24. Mai 2005
Antwort Antwort
toko

Registriert seit: 19. Apr 2005
40 Beiträge
 
#1

Wie greife ich auf bestimmte Objekte einer Klasse zu?

  Alt 18. Mai 2005, 12:53
Hallo,

ich hoffe ich plaziere mein Thema in diesem Forum richtig.

Ich habe folgendes Problem: In meinem Programm verwalte ich Musiklisten. Eine Liste enthält mehrer CD's. Diese CD's werden in einem TStringGrid angezeigt, wenn ich auf einen Eintrag in diesem TStringGrid klicke, dann soll in einem zweiten TStringGrid der Inhalt dieser CD dargestellt werden, also die Titel der angeklickten CD. Es sollte, laut Vorgabe, soweit wie sinnvoll objektorientiert sein.

Ich speichere die Datensätze einer CD-Liste in einer XML-Datei. Also für jede Liste eine XML-Datei. Dabei erzeuge ich für jeden Eintrag/CD ein Objekt der selbsterstellten Klasse "TCD" und zeige diese CDs in dem ersten TStringGrid an. Anschließend speichern. Das klappt auch soweit alles ganz gut.

In dem zweiten TStringGrid bilde ich die Lieder ab. Ich habe aber dabei das Problem, dass ich die Objekte, die ich im obigem CD-StringGrid erzeugt habe, nicht anprechen kann, um auf das Attribut (TStringList), in dem ich die Lieder speichern möchte, zuzugreifen. Gespeichert werden, sollte dann zum Schluß. D.h., das Programm soll die Lieder, die ich zu beliebigen CDs hinzufüge, als Kindknoten einem CD-Element anhängen.

Funktionieren würde das, wenn ich jede neue CD sofort in die XML-Datei speichere und so über die Kontensuche, die CD finde, bei der ich die Lieder anhängen möchte. Aber dann kann ich mir die Klasse "TCD" gleich sparen und objektorientiert ist das dann auch nicht...
Abgesehen davon, finde ich das auch schlechten Programmierstil.


Hoffentlich, kann mir jemand helfen
  Mit Zitat antworten Zitat
Benutzerbild von TKC
TKC

Registriert seit: 21. Apr 2004
Ort: Tuningen
367 Beiträge
 
Delphi XE2 Enterprise
 
#2

Re: Wie greife ich auf bestimmte Objekte einer Klasse zu?

  Alt 18. Mai 2005, 13:57
also irgendwie kapiere ich nicht was du genau meinst

Eventuell kannst du ja mal ein code Beispiel posten...oder ein demo Projekt?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Wie greife ich auf bestimmte Objekte einer Klasse zu?

  Alt 18. Mai 2005, 15:44
Du musst deine Objekte hierarchisch aufbauen.
Das oberste Objekt nenne ich mal TMediaList.
TMediaList enthält eine Liste von TMedia.
TMedia beschreibt eine CD; ungefähr so:
Delphi-Quellcode:
TMedia = class(TPersistent)
   public
      property MediaName:string; // name der CD
      property Artist:string; // name des Künstlers/Band

      property Songlist : TSongList;
end;
TSongList ist eine StringListe, in die du mit AddObject Objekt vom Typ TSong verpackt hast.
Delphi-Quellcode:
TSong = class(TPersistent)
   public
      property SongName:string;
      property Duration:double; // Dauer in Sekunden
      property MediaIndex:integer; // Liednummer
end;
Andreas
  Mit Zitat antworten Zitat
toko

Registriert seit: 19. Apr 2005
40 Beiträge
 
#4

Re: Wie greife ich auf bestimmte Objekte einer Klasse zu?

  Alt 18. Mai 2005, 16:06
Hallo,

vielleicht habe ich mich vorhin etwas undeutlich ausgedrückt.

In dem Programm soll man auch die Möglichkeit haben selber CD-Listen anzulegen. D.h., ich erstelle nach und nach neue CD's (Objekte der Klasse "TCD", mit den Attributen Titel, Genre, Interpret, Lieder). Titel, Genre und Interpret sind vom Typ String. Lieder ist vom Typ TStringList. Wenn ich jetzt also über eine Eingabemaske Titel, Genre und Interpret eingebe, stelle ich diese im ersten TStringGrid dar. Dann kommt eine zweite CD, eine dritte usw...
Jetzt klicke ich aber auf den ersten Eintrag des ersten TStringGrids, in dem die CD's angezeigt werden. Ich habe also die erste CD markiert. Nun möchte ich auf den Button "Lied hinzufügen" drücken und über eine Eingabemaske ein Lied zu dieser ersten CD speichern. Hier weiß ich aber nicht, wie ich jetzt auf das Attribut "Lieder" zugreifen kann, um dieser TStringList einen Eintrag hinzuzufügen.
Ich gebe die Objekte der Klasse TCD, beim Schließen der CD-Eingabe-Datenmaske, durch "free" wieder frei. Ich habe also nichts wo ich drauf zugreifen kann...

Ich glaube ich stehe vollkommen auf dem Schlauch...
Gruß

PS: Ich poste nachher mal meinen Quellcode... Hab ihn gerade nicht zur Hand...
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Wie greife ich auf bestimmte Objekte einer Klasse zu?

  Alt 18. Mai 2005, 16:39
Zitat von toko:
Ich gebe die Objekte der Klasse TCD, beim Schließen der CD-Eingabe-Datenmaske, durch "free" wieder frei. Ich habe also nichts wo ich drauf zugreifen kann.
Das kann nicht ganz wahr sein. Du willst doch später ein XML-Dokument speichern. Was ist denn dein Konzept für die interne Repräsentation deiner Daten? Arbeitest du direkt auf einem DOM-Dokument oder verwendest du deine eigenen Klassen? Wenn letzteres der Fall ist, dann darfst du die Objekte doch erst dann frei geben, wenn du die Daten wieder als XML-Dokument gespeichert hast.

Grüße vom marabu
  Mit Zitat antworten Zitat
toko

Registriert seit: 19. Apr 2005
40 Beiträge
 
#6

Re: Wie greife ich auf bestimmte Objekte einer Klasse zu?

  Alt 18. Mai 2005, 21:10
Hallo,

@shmia
Ich habe meine Klassen folgendermaßen aufgebaut:

Die Klasse
Delphi-Quellcode:
  TCDCollection = class
  private
    FCollectionName: string;
    FCollectionCDs: TStringList;
  end;
soll den Namen einer CD-Liste und die CD's selber repräsentieren. Hiermit wollte ich ursprünglich arbeiten. Da ich mich aber für die Arbeitsweise mit den XML-Dateien entschieden habe, habe ich das aus den Augen verloren.

Die Klasse
Delphi-Quellcode:
  TCD = class
  private
    FCDID: Integer;
    FCDTitel: string;
    FCDInterpret: string;
    FCDGenre: string;
    FCDTracks: TStringList;
    procedure SetCDTitel(CDTitel: string);
    procedure SetCDInterpret(CDInterpret: string);
    procedure SetCDGenre(CDGenre: string);
  public
    procedure Load; virtual;
    procedure Save; virtual;
    property CDTitel: string read FCDTitel write SetCDTitel;
    property CDInterpret: string read FCDInterpret write SetCDInterpret;
    property CDGenre: string read FCDGenre write SetCDGenre;
  end;
repräsentiert oben beschriebenes. Mit dem Attribut FCDTracks kann ich nicht arbeiten, da ich nicht drauf zu greifen kann, wenn ich zwischendurch eine neue CD eingetragen habe.
Ich hatte folgendes vor: Ein Objekt der Klasse TCDCollection beinhaltet Objekte der Klasse TCD. Ein Objekt der Klasse TCD beinhaltet das Attribut FCDTracks vom Typ TStringList, in der ich die einzelnen Tracks/Lieder speichere.

@marabu
ich speichere sofort die CD mit Anlegen eines neuen Knoten in die XML-Datei. Das Objekt einer TCD gebe ich sofort nach dem Schließen der Eingabemaske frei.


@All
Ich möchte eigentlich folgendes Verhalten: Bei jedem Klick auf eine andere im ersten TStrigGrid dargestellten CD, soll das zweite TStringGrid mit den Elementen der TStringList des aktuellen CD-Objekts gefüllt werden.
Auf die XML-Geschichte bin ich nur gekommen, weil ich die Daten irgendwie speichern muß. Da mir Ini-Files nicht so geläufig und bekannt waren, habe ich mich für die XML-Variante entschieden. Eine Datenbank soll ich laut Vorgabe nicht benutzen.

Wie kann ich denn die Objekte der Klasse TCD in einem Objekt der Klasse TCDCollection speichern? Dann muss das Attribut FCollectionCDs bestimmt vom Typ TObjectList sein, um hier Pointer zu speichern!? Mit Pointer kenne ich micht nicht so gut aus. Falls jemand eine einfachere Idee hat, bin ich sehr dankbar. Falls die Zeigergeschichte nur sinnvoll kann hier jeden Tipp gebrauchen.

Im Prinzip habe ich generell die Schwierigkeit wie man auf Objekte von bestimmten Klassen zugreift. Hätte ich dass nicht, könnte ich den Speichervorgang einmal durchführen, indem ich mit dem TCDCollection-Objekt den Elternknoten der XML-Datei bilde. Als Kindknoten nehme ich die TCD-Objekte, diese haben wiederum die Lieder als Kinder, also Elemente des TCD-Objekt-Attributs FCDTracks.

Danke für eure Tapferkeit Gruß
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Wie greife ich auf bestimmte Objekte einer Klasse zu?

  Alt 18. Mai 2005, 21:30
Bin mit so einer ähnlichen Geschichte beschäftigt. Aber ich glaube, daß der Ansatz der Stringgrids schon falsch ist. Das da klingt schwer nach Treeview. Warum muß das ein Grid sein ? Die CDs würde ich als Hauptnodes machen und die Tracks als SubNodes. Nur mal als Vorschlag.
Gruß
Hansa
  Mit Zitat antworten Zitat
toko

Registriert seit: 19. Apr 2005
40 Beiträge
 
#8

Re: Wie greife ich auf bestimmte Objekte einer Klasse zu?

  Alt 24. Mai 2005, 17:27
Hallo Hansa,

die Grids werden laut Aufgabenaufstellung so verlangt, die besagt auch, dass die CD's in einer Datei gespeichert werden sollen. Aber das Speichern ist auch nicht mein Problem.

Sondern: Wie greife ich auf die Attribute nicht aktueller Objekte zu?
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:20 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