![]() |
property listener
ich habe da ein problem mit einem eigenen klassen-framework. meine basisklasse habe ich von TObject abgeleitet.
in dieser klasse habe ich properties die wiederrum auf eine eigene klasse hinweisen die von tobjectlist abgeleitet ist und die wiederrum von eigenen objekttypen gefuellt wird.
Delphi-Quellcode:
wenn ich nun aus meiner application der liste ein objekt hinzufuegen moechte TMyObjekt= class(TObject) private ... FValue: String; function getValue: String; procedure setValue(value: String); ... protected public ... property Value: String read getValue write setValue; ... end; TMyList = class(TObjectList) private protected flist: TObjectList; function GetItems(index: integer): TMyObjekt; ... public ... function Add(Item: TMyObjekt): integer; function Count: integer; procedure Delete(index: integer); property Items[index: integer]: TMyObjekt read GetItems; default; ... end; Tklasse = class(TMeinObject) private { Private declarations } ... FMeineListe: TMyList; function getMeineListe: TMyList; procedure setMeineListe(MyList: TMyList); ... protected { Protected declarations } public { Public declarations } ... property MeineListe: TMyList read getMeineListe write setMeineListe; ... end;
Delphi-Quellcode:
dann bekomme ich nen fehler - sowit ist's logisch, ich muss die Liste erst erzeugen, bevor ich ihr was hinzufuegen kann.
FKlasse.MeineListe.Add(MeinObjekt);
jetzt kommt aber mein problem: es waere ganz einfach, wenn ich im constructor von TKlasse TMyList erzeugen wuerde. In diesem Fall wuerde aber bei jeder erzeugung von TKlasse TMyList angelegt, auch wenn TMyList kein Objekt hinzugefuegt wird -> ist von mir nicht erwuenscht. Was ich also suche ist eine Art "property listener". wenn also die property MeineListe von irgendwoher benutzt wird (z.B. via Add) soll TKlasse das bemerken und die Liste erzeugen. gibts sowas schon oder hat vielleicht jemand eine idee wie ich das prob loesen kann. im voraus schonmal vielen liebsten dank sven |
Nehm einfach den Constructor von TMyList :mrgreen:
Ist auch logischer und viel schöner ... :dancer: |
??? :roll:
das ist mir schon klar. jedoch wo kann ich ihn aufrufen? ich greife doch von der applikation auf fklasse.MyList.Add(MyObjekt) zu - und um dies so zuzuordnen zu koennen muss ich den constructor von TMyList in TKlasse aufrufen. also muss mir TKlasse sagen koennen wann auf das property MyList zugegriffen wird, damit ich den constructor von TMyList aufufen kann. |
Deine Lese-Methode getMeineListe (property MeineListe: TMyList read getMeineListe write setMeineListe;) informiert dich darüber wann auf das Objekt-Feld "MeineListe" zugegriffen wird...
|
Ich glaube in deiner MyList ist was doppeltgemoppelt!
Delphi-Quellcode:
Wenn TMyList schon vom Typ TObjectList ist, ist es eigentlich
TMyList = class(TObjectList)
private protected flist: TObjectList; function GetItems(index: integer): TMyObjekt; ... public ... function Add(Item: TMyObjekt): integer; function Count: integer; procedure Delete(index: integer); property Items[index: integer]: TMyObjekt read GetItems; default; ... end; unnötig noch eine flist vom Typ TObjectList zu deklarieren. Jede Instanz die du von TMyList instanziierst hat bereits alle Fähigkeiten einer ObjectList, und damit auch die Fähigkeit Objekte in einer Liste zu speichern! Oder steh ich grad auf dem Schlauch? :?: Zu deinem Problem: mich würde interessieren Wie deine Deklaration zu FKlasse aussieht! Minz Da hat Motzi allerdings recht :mrgreen: [edit=Daniel B]Delphi-Tags gesetzt. MfG Daniel B.[/edit] |
Etwas ist noch falsch.
FMeineListe: TMyList; gehört nicht in die Tklasse sondern in die TMyList Klasse, diese wird im eigenen Constructor initialisiert. Auf diese Instanz einer Objectlist kannst du dann adden was du willst. |
öhm, des glob ich net unbedingt :mrgreen:
|
@Motzi :spin: :hello:
das wars, manchmal sieht man vor lauter wald eben die baeume nicht mehr ;-) das ich da nicht selber drauf gekommen bin :oops: |
@Minz
das stimmt so schon, nur moechte ich eine explizite liste haben, in der per "add" nur meine eigenen objekttypen hinzugefuegt werden koennen. |
dazu hast du doch
function add... darin kannst du doch dann die Objekte checken, die kommen und einen entsprechenden Fehler ausgeben oder behandeln, so müsstest du das doch auch bei flist machen! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 Uhr. |
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