AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Auf Feld der übergeordneten Klasse zugreifen
Thema durchsuchen
Ansicht
Themen-Optionen

Auf Feld der übergeordneten Klasse zugreifen

Ein Thema von silver-moon-2000 · begonnen am 18. Mär 2009 · letzter Beitrag vom 19. Mär 2009
Antwort Antwort
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#1

Auf Feld der übergeordneten Klasse zugreifen

  Alt 18. Mär 2009, 22:08
Hallo zusammen,

ich habe (mal wieder) eine Grundsatzfrage, (der Post wird also wieder etwas länger)

Delphi-Quellcode:
type TBookShelf = class(TObject)
  private
    FSavePath : string;
    FBooks : TObjectList;
  public
end;

type TBook = class(TObject)
  private
    FBookTitle : string;
    FChapters : TObjectList;
end;

type TChapter = class(TObject)
  private
    FChapterTitle : string;
  public
    procedure OpenChapter;
end;
Die Klasse TChapter hat nun eine Methode namens OpenChapter, die dieses Chapter (das als PDF File existiert) mit dem zugehörigen Programm (per Shell-Execute o.Ä.) öffnen soll

Nun das eigentliche Problem: Wie bekomme ich in TChapter den gesamten Dateinamen heraus, der sich folgendermaßen zusammensetzt:
"TBookShelf".FSavePath\"TBook".FBookTitle\"TChapte r".FChapterTitle.pdf

Die einzige Möglichkeit, die ich kenne, wie es zu machen geht, wäre, dass ich über die Konstruktoren den Instanzen von TBook & TChapter eine Referenz auf deren "Parent" mitgebe:
Delphi-Quellcode:
constructor TBook.Create(bks : TBookShelf)
constructor TChaoter.Create(bk : TBook)
[...]

in TBookShelf:
  FBooks.Add(TBook.Create(self));

[...]

in TBook:
  FChapters.Add(TChapter.Create(self));
Somit also am Beispiel von TChapter (TBook analog: FBookShelf : TBookShelf)
Delphi-Quellcode:
type TChapter = class(TObject)
  private
    FChapterTitle : string;
    FBook : TBook;
  public
    constructor Create(bk : TBook);
    procedure OpenChapter;
end;

constructor TChapter.Create(bk : TBook);
begin
  inherited Create;
  FBook := bk;
end;

procedure TChapter.OpenChapter;
var completePath : string;
begin
  completePath := bk.FBookShelf.SavePath + bk.BookTitle + FChapterTitle;
end;
Ich habe dabei das Gefühl, den OOP Ansatz nicht wirklich umzusetzen / verstanden zu haben, wenn ich jedem Element eine Referenz auf seinen "Parent" mitgebe.

Um diesen langen und zugegebenermaßen verwirrenden Post zusammenzufassen:
Gibt es eine andere Möglichkeit, in TChapter auf Felder aus TBook und TBookShelf zuzugreifen, als jedem Element eine Referenz auf seinen "Parent" zu geben

p.s. mir ist so, als ob ich diese Frage schon mal gestellt hätte, aber ich habe bei einer Suche nichts gefunden. Falls dem tatsächlich so ist, tut's mit leid.
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Auf Feld der übergeordneten Klasse zugreifen

  Alt 19. Mär 2009, 05:40
Über den Owner. Du hast ja beim Erzeugen das TBookShelf bzw. das -Objekt als diesen übergeben. Also:
completePath := bk.((Owner as TBook) as TBookShelf)).SavePath + bk.(Owner as TBookShelf).BookTitle + FChapterTitle;
Markus Kinzler
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#3

Re: Auf Feld der übergeordneten Klasse zugreifen

  Alt 19. Mär 2009, 07:29
Auch wenn's funktioniert - ist das sinnvoll? Wenn andere Klassen den Zugriff auf private-Felder benötigen, dann sollte der Zugriff doch wohl besser über properties erfolgen, oder?
Ralph
  Mit Zitat antworten Zitat
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#4

Re: Auf Feld der übergeordneten Klasse zugreifen

  Alt 19. Mär 2009, 08:24
Danke für eure Antworten,
(wie immer gibts dabei ein) aber:

Zitat von mkinzler:
Über den Owner. Du hast ja beim Erzeugen das TBookShelf bzw. das -Objekt als diesen übergeben. Also:
completePath := bk.((Owner as TBook) as TBookShelf)).SavePath + bk.(Owner as TBookShelf).BookTitle + FChapterTitle;
Owner gibt's doch bei TObject, von dem ich ableite nicht, oder? Sonst hätte ich das auch gerne gemacht. Owner wird in TComponent eingeführt, für mich war TComponent bisher "Grundlage für (nicht)graphische IDE-Componenten" und daher für einfache Classen wie die meinen zu überladen. Aber der Owner machts dann wieder wett.

Zitat von taaktaak:
Auch wenn's funktioniert - ist das sinnvoll? Wenn andere Klassen den Zugriff auf private-Felder benötigen, dann sollte der Zugriff doch wohl besser über properties erfolgen, oder?
Auf wen beziehst Du dich? Du hast natürlich recht, statt auf private Felder zuzugreifen, machen properties mehr Sinn, dafür sind sie schließlich da. War ich wohl gestern abend zu müde zu.

Danke für eure Hilfe, hier habe ich immer wieder gerne Probleme
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  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 12:59 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