AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Komponente mit Objekten, die Eigenschaften der Komponente benötigen
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente mit Objekten, die Eigenschaften der Komponente benötigen

Ein Thema von Captnemo · begonnen am 18. Sep 2014 · letzter Beitrag vom 19. Sep 2014
Antwort Antwort
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

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

  Alt 18. Sep 2014, 20:55
Ein konkretes Problem sehe ich aber. Wenn Du später die Daten aus einer Datenbank holen willst wird sich das nicht mit den zur Designtime erzeugten Einträgen vertragen. Was soll dann Vorrang haben.
Das muß nicht unbedingt zu einem Problem werden. In einem TListView kann man auch zur DT Einträge hinzufügen, und zur RT auch. Man kann evtl. vorhandene Einträge ja vorher löschen. Wie man will.

Das ich Einträge zur DT haben möchte hat 2 entscheidenden Gründe.
1. Ich will lernen wie das geht. Also wie man über den OI und ggf. einer Eingabemaske eben zur DT schon vollwertige Einträge hinzufügen kann. (Evtl. will ich ja später mal eine Komponente entwickeln, bei der das sinnvoller wäre).

2. Für die grafische Gestaltung meiner Komponente zur DT wäre es sinnvoll, wenn man ein paar Einträge einstellen kann, und die Auswirkungen von Designeigenschaften gleich bei der Entwicklung gut sehen kann. Auch das könnte man natürlich auch anderes überprüfen, aber auch hier will ich gleich mal lernen wie man das am elegantesten macht.

Deswegen hoffe ich auf eure Unterstützung. Und seht es mir bitte nach, wenn ich hier und da noch ein paar blöde Fragen stelle. Aber was für manchen selbstverständlich und logisch ist, ist mir manchmal noch nicht so ganz klar.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#2

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

  Alt 19. Sep 2014, 07:35
Ich hab das jetzt mal umgestellt auf TCollection und das gefällt mir so richtig gut
Vielen Dank. Wieder was gelernt.

Nun möchte ich noch was erreichen.

Ich kann meiner Komponente zur DT Items für Eintragstypen (Urlaub, Krank...) hinzufügen.
Ich kann auch Einträge mit den Daten Beginn und Ende (halt was ich im CollectionItem definiert habe) hinzufügen. Ich würde aber gerne im Item des Entrags aus einer Liste eine Eintragstyp auswählen, und zwar aus denen, die ich vor in den Eintragstypen angelegt habe.
Ich weiß aber nicht wirklich, wie ich da dran komme bzw. wie ich so was machen könnte.

Grundsätzlich würde ich das gerne so mache, wie das z.B. bei TMainMenu und den Images ist.
Also meinem Eintrag eine Property für den zu verwendenden Eintragtypenlistenindex auswähle. Aber er soll mir auch nur die tatsächlich vorhanden EintragstypenlistenIDs anbieten, bzw. ich muss ja in dem Eintrag auch festlegen, welche Eintragstypenliste zu verwenden ist.

Hier mal ein Beispiel wie ich das meine:

Code:
  TUrlaubsplaner
   |
   +-->TEintragstypenList
   |    |
   |    +-->TEintragstyp
   |         |
   |         +-->Bezeichnung z.B. Urlaub
   |         +-->ID z.B. 0
   |
   +-->TEintrag
        |
        +-->Von (TDate)
        +-->Bis (TDate)
        +-->TypID (Über diese ID will ich dann den Typ ermitteln, bzw. im OI sollte auch nur
                   die möglichen ID's auftauchen, vlt. sogar mit Namen dahinter. Aber dazu muß
                   der Eintrag ja wissen, dass er die obige EintragstypenListe verwenden soll.)
Ich weiß nicht ob das so überhaupt möglich ist.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

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

  Alt 19. Sep 2014, 07:39
Habe ich doch hier erklärt. Du musst nur meine Bezeichnungen durch deine ersetzen.
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#4

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

  Alt 19. Sep 2014, 08:10
Habe ich doch hier erklärt. Du musst nur meine Bezeichnungen durch deine ersetzen.
Ja, ich weiß.
Ich hab auch drauf geantwortet:
Okay. Zu TLayoutTemplate oder zu Template Manager spuckt meine Hilfe so gar nichts aus. Kann mir das jemand noch mal erläutern.
Ich hab also nicht wirklich verstanden, wie du das gemeint hat, und kann's deswegen nicht umsetzen. Entschuldigung, aber Komponentenerstellung ist für mich ziemliches Neuland. Ich glaube ich mal vor 10 Jahren mir eine Komponente selber erstellt.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

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

  Alt 19. Sep 2014, 08:18
Entschuldigung. Die Begriffe waren von mir, so wie ich sie benannt hätte.

TLayoutTemplate = TEintrag
Template Layout Manager = Die Instanz von TEintragstypenList in deiner TUrlaubsplaner-Komponente.

Wenn Du also einen neuen Eintrag erstellst übergibst Du ihm deine EintragstypenList:
Delphi-Quellcode:
Procedure TUrlaubsplaner.AddEntry(aTypID : TEintragsTypID);
Var
  derNeueEintrag : TEintrag;

Begin
  derNeueEintrag := TEintrag.Create (EintragsTypenList);
  derNeueEintrag.EintragTypID := aTypID;
  EintragsList.Add(derNeueEintrag);
End;
...

Procedure TEintrag.Paint(...);
var
  vorlage : TEintrafsTyp;

Begin
  vorlage := fEintragsTypenList.FindByID(this.EintragTypID);
  ...
  // Zeichne mit den Farben, Schrifttyp etc. aus der 'vorlage'
End;
Du könntest theoretisch einem Eintrag auch gleich den ganzen TUrlaubsplaner mitgeben, aber das ist kein guter Stil, denn hier kennen sich dann zwei Klassen gegenseitig und das sollte vermieden werden (zirkuläre Abhängigkeit (*)).

So kennt der TUrlaubsplaner eine TEintragsTypenList und ein TEintrag kennt eine TEintragstypenList. Kein Zirkel, kein Problem.

(*) Aus diesem Grund mag ich auch keine TCollection.
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#6

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

  Alt 19. Sep 2014, 08:32
(*) Aus diesem Grund mag ich auch keine TCollection.
Hab grad auf TCollection umgestellt Und dann kann ich auch im OI zur DT Items hinzufügen. Als ich es noch über TObjectList gemacht hatte, ging das nicht.

Jetzt hab ich das auch besser verstanden.

Dafür gibt es eine Klasse, die diese Templates verwaltet (TemplateManager). Die Klasse hat eine Methode
Delphi-Quellcode:
//
Function Template(aTemplateType : TTemplateType) : TLayoutTemplate;
//
Der Urlaubsplan instantiiert einen TemplateManager. Im OI kannst Du die Farben für die einzelnen Eintragstypen (TTemplateType) dann konfigurieren.
Dieser Satz hat mich zu der Annahme geführt, dass es eine vordefiniert Klasse TLayoutTemplate o.ä. gibt.

Beim TEintrag.Create die Typenliste mit zu übergeben hatte ich mir auch schon so vorgestellt. Werde ich gleich mal ausprobieren. Mal sehen wie weit ich komme.

Aber es stellt sich mir noch ein anderen Problem: Das Neuzeichnen wenn Einträge hinzugefügt werden.
Als Beispiel nehme ich mal ein TListView. Wenn ich im OI Columns oder Items hinzufüge, dann wird das sofort im ListView umgesetzt und dargestellt.
So würde ich das auch gerne machen.
Aber wie erfährt meine Basisklasse, dann ist der Klasse TEinträge ein Eintrag hinzugefügt wurde? Ich hab schon überlegt das über eine Windows-Message zu machen, aber da meine Basisklasse von TGraphicControl abgeleitet ist, hat sie kein Handle.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.667 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 19. Sep 2014, 08:42
Wenn ich es richtig verstehe, ist dafür die Methode Delphi-Referenz durchsuchenTCollection.Notify gedacht.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

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

  Alt 19. Sep 2014, 11:47
Aber es stellt sich mir noch ein anderen Problem: Das Neuzeichnen wenn Einträge hinzugefügt werden.
Als Beispiel nehme ich mal ein TListView. Wenn ich im OI Columns oder Items hinzufüge, dann wird das sofort im ListView umgesetzt und dargestellt.
So würde ich das auch gerne machen.
Mach es doch. Der TEintrag hat ein Event 'OnChange'. Das ruft ein Eintrag auf, wenn sich irgendwas in ihm verändert hat. Und dein TUrlaubsplan 'subscribed' sich auf dieses Event. Einfach ausgedrückt: Im 'AddEintrag' setzt Du das Event.

Delphi-Quellcode:
Procedure TUrlaubsPlan.ItemChanged (Sender : TObject);
Begin
  Assert (Sender is TEintrag, 'Nee, Du darfst diesen Handler nur an TEintrag-Instanzen bepseln');
  Repaint....
End;

Procedure TUrlaubsPlan.AddEntry (...);
Var
  derNeueEntrag : TEintrag;

begin
  ...
  derNeueEintrag.OnChanged := ItemChangeD;
  ...
End;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.588 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 19. Sep 2014, 08:40
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#10

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

  Alt 19. Sep 2014, 09:28
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  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 02:32 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