Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Komponente mit Objekten, die Eigenschaften der Komponente benötigen (https://www.delphipraxis.net/181924-komponente-mit-objekten-die-eigenschaften-der-komponente-benoetigen.html)

himitsu 19. Sep 2014 08:40

AW: Komponente mit Objekten, die Eigenschaften der Komponente benötigen
 
Aus welchem Grund?
Das TCollectionItem kennt doch nicht die übergeordnete TCollection. (leider)

Und ich weiß auch nicht, warum es schlecht sein soll, seine Eltern zu kennen.

DeddyH 19. Sep 2014 08:42

AW: Komponente mit Objekten, die Eigenschaften der Komponente benötigen
 
Wenn ich es richtig verstehe, ist dafür die Methode Delphi-Referenz durchsuchenTCollection.Notify gedacht.

himitsu 19. Sep 2014 09:07

AW: Komponente mit Objekten, die Eigenschaften der Komponente benötigen
 
Damit kann nur die Collection drauf reagieren, wenn etwas in ihr geändert wird.
Die CollectionsItems haben kein Notify.

Standardmäßig wissen die Items nicht ob und in welcher Collection sie sich befinden,
außer man würde sich selber ein Owner/Parent-Feld in die Items einbauen und dann z.B. im Notify diese Variable setzen.



Hatte mal versucht das als generische Objektvorlage umzusetzen, was bei eigenen Deklarationen geht, aber nicht wenn man von den Originaltypen erbt, also wo dann die Collections und Items sich gegenseitig kennen und auch noch die Typen/Property/Parameter richtig gecastet sind.
Zwei getrennte Typen ableiten und sich gegenseitig referenzieren zu lassen war mit den Generics aber nicht so leicht möglich, vorallem wenn man sie in der VCL und speziell im FormDesigner und ObjektInspektor haben möchte, wo man dann noch das generische < und > im Namen verstecken muß.

DeddyH 19. Sep 2014 09:17

AW: Komponente mit Objekten, die Eigenschaften der Komponente benötigen
 
Wozu brauchen denn die Items ein Notify? Die Collection gibt bei Änderungen Bescheid und benennt dabei das Item und die Art der Änderung. Darauf kann man reagieren und z.B. neu zeichnen.

Captnemo 19. Sep 2014 09:28

AW: Komponente mit Objekten, die Eigenschaften der Komponente benötigen
 
Zitat:

Zitat von himitsu (Beitrag 1273091)
Aus welchem Grund?
Das TCollectionItem kennt doch nicht die übergeordnete TCollection. (leider)

Und ich weiß auch nicht, warum es schlecht sein soll, seine Eltern zu kennen.

Ja, das Item kennt seine Liste, aber kennt die TCollection die Klasse, in der sie existiert?

Es sieht bei mir zur Zeit so aus:
Delphi-Quellcode:
unit tuUrlaubskalender;

  TUrlabuskalender = class
    Property TEintraege: TEintraege;
    property TEintrastypen: TEintragstypen;
    propcedure Paint;
  end;

----

unit tuEintraege;

  TEintraege = class(TCollection)
    ...
  end;
 

  TEintrag = class(TCollectionItem)
    ...
  end;

---

unit tuEintragstypen;

  TEintragstypen = class(TCollection)
    ...
  end;

  TEintragstyp = class(TCollectionItem)
    ...
  end;
Wenn jetzt z.B. TUrlaubskalender.Eintraege.Add aufgerufen wird, wie bekommt denn die Klasse TUrlaubskalender das mit, denn hier existiert die Methode Paint.

Captnemo 19. Sep 2014 09:31

AW: Komponente mit Objekten, die Eigenschaften der Komponente benötigen
 
Gut ich könnte in der TUrlaubskalender eine Methode AddEintrag machen, die ihrerseits dann die Add-Mothode der Collection Eintraege aufruft.
Aber macht man das so? Oder gibt es noch den weg rückwärts über irgendeine Benachrichtigung.

himitsu 19. Sep 2014 09:31

AW: Komponente mit Objekten, die Eigenschaften der Komponente benötigen
 
Indem die Collections deine Komponente kennen. Mußt du einbauen, indem du das Notify überschreibst und dort deinem Kalender sagst "du, da hat sich was geändert ... mach ma".

Captnemo 19. Sep 2014 09:49

AW: Komponente mit Objekten, die Eigenschaften der Komponente benötigen
 
Meinst du so:

Delphi-Quellcode:

Constructor TUrlaubsplan.Create;
begin
  inherited;
  self.FEintraege:=TEintraege.Create(self);
end;


//Und im TEitraege

...
  FParent: TURlaubsplan;
.
.
.
constructor TEintreage.Create(Urlaubsplan: TUrlaubsplan);
begin
  inherited;
  self.FParent:=Urlaubsplan;
end;
dann könnte ich ja im TEintraege.Notify ja self.FParent.Paint aufrufen, oder?

Captnemo 19. Sep 2014 10:14

AW: Komponente mit Objekten, die Eigenschaften der Komponente benötigen
 
Zitat:

Zitat von Captnemo (Beitrag 1273115)
Meinst du so:

Delphi-Quellcode:

Constructor TUrlaubsplan.Create;
begin
  inherited;
  self.FEintraege:=TEintraege.Create(self);
end;


//Und im TEitraege

...
  FParent: TURlaubsplan;
.
.
.
constructor TEintreage.Create(Urlaubsplan: TUrlaubsplan);
begin
  inherited;
  self.FParent:=Urlaubsplan;
end;
dann könnte ich ja im TEintraege.Notify ja self.FParent.Paint aufrufen, oder?

Geht so leider nicht, dann bekomme ich "F2047: Zirkuläre Unit-Referenz" vom Compiler, weil ich ja in beiden Unit die jeweilig andere referenzieren muss.

DeddyH 19. Sep 2014 10:31

AW: Komponente mit Objekten, die Eigenschaften der Komponente benötigen
 
Wieso kein Event? Dann kann der Urlaubsplan dem einen Handler zuweisen, die Einträge müssen den Urlaubsplan aber gar nicht kennen, sondern führen nur den ggf. zugewiesenen Code aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz