AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Container für bestimmte Objekte schaffen...

Ein Thema von BigAl · begonnen am 7. Nov 2009 · letzter Beitrag vom 8. Nov 2009
Antwort Antwort
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#1

Container für bestimmte Objekte schaffen...

  Alt 7. Nov 2009, 19:26
Hallo zusammen,

ich versuche hier mal die Frage zu einem - glaube ich - nicht ganz trivialen Thema abzusetzen:

Derzeit befinde ich mich bei der Entwicklung von Komponenten für die Planung von Vorgängen. Hierbei bin ich auch schon etwas vorann gekommen (siehe Anhang). Der Aufbau ist momentan wie folgt:

Delphi-Quellcode:
  { die zentrale Komponente, enthält die Datumsleiste }
  TPlanGrid = class(TCustomControl)
    (...)
    property TPlanGridGroups;
  end;

  { Gruppen (Zusammenfassung von mehreren Zeilen) }
  TPlanGridGroups = class(TOwnedCollection)
    (...)
    property Items[Index: Integer]: TPlanGridGroup;
  end;

  TPlanGridGroup = class(TCollectionItem)
    (...)
    property TPlanGridLines;
  end;

  { Zeilen }
  TPlanGridLines = class(TOwnedCollection)
    (...)
    property Items[Index: Integer]: TPlanGridLine;
  end;

  TPlanGridLine = class(TCollectionItem)
    (...)
    property TPlanGridEvents;
  end;

  { Ereignisse (die Balken auf den Zeilen) }
  TPlanGridEvents = class(TOwnedCollection)
    (...)
    property Items[Index]: TPlanGridEvent;
  end;

  TPlanGridEvent = class(TCollectionItem)
  end;
Nun mein Problem: Ich würde gerne die Planzeilen (TPlanGridLine) und Ereignisse (TPlanGridEvent) sensitiv gestalten. Sie sollen also auf Mausereignisse usw. reagieren können. Diese Auswertung zentral in der Komponente TPlanGrid zu programmieren hat sich - aufgrund der großen Dynamic zur Laufzeit - als extrem aufwändig herausgestellt. Mein Gedanke wäre nun die Komponente TPlanGrid als Container zu erstellen. Diesem Container sollten dann die Gruppen vom TPlanGridGroup hinzugefügt werden können (und derzeit nur diese!). Die Gruppen wiederum fungieren ebenfalls als Container für TPlanGridLine-Objekte usw. Weiterhin sollten sich die Komponenten jeweils selbst Zeichnen und auf Ereignisse reagieren können.

So, ich hoffe es ist grob verständlich was ich zun möchte. Das Problem ist, dass es sich bei TCollectionItem ja nicht um ein TControl handelt ist dies ja nicht so ohne weiteres sensitiv zu bekommen... Irgendwie stehe ich momentan etwas auf dem Schlauch...

Konkrete Frage:

Wie würdet ihr den oben genannten Aufbau gestalten?
Von welchen Objekten würdet ihr die einzelnen Klassen ableiten?
Gibt es Standardobjekte mit ähnliche Funktionalität?

Bin für alle Anregungen dankbar...

Liebe Grüße

Alex
Miniaturansicht angehängter Grafiken
sample_967.jpg  
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#2

Re: Container für bestimmte Objekte schaffen...

  Alt 8. Nov 2009, 08:43
Ich bin ja ein großer Fan von TCollection, aber in diesem Fall ist es vielleicht besser die TPlanGridLines von eine TControl (o.ä.) abzuleiten und in einer TObjectList zu speichern. Falls es nur ein Ereignis pro TPlanGridLine gibt, solltest du diesem ein Feld innerhalb von TPlanGridLine spendieren. Falls es mehrere Ereignisse pro Line sind kannst du innerhalb von PlanGridLine ebenfalls eine ObjectList verwenden. Ich hoffe ich habe dein Problem überhaupt richtig verstanden
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#3

Re: Container für bestimmte Objekte schaffen...

  Alt 8. Nov 2009, 09:45
Zitat von guidok:
Ich bin ja ein großer Fan von TCollection, aber in diesem Fall ist es vielleicht besser die TPlanGridLines von eine TControl (o.ä.) abzuleiten und in einer TObjectList zu speichern. Falls es nur ein Ereignis pro TPlanGridLine gibt, solltest du diesem ein Feld innerhalb von TPlanGridLine spendieren. Falls es mehrere Ereignisse pro Line sind kannst du innerhalb von PlanGridLine ebenfalls eine ObjectList verwenden. Ich hoffe ich habe dein Problem überhaupt richtig verstanden
Hallo Guido,

vielen Dank für Deine Antwort. Mein Problem ist, dass ich die Intelligenz in die jeweiligen Objekte packen möchte. Aktuell wird alles im zentralen TPlanGrid gezeichnet. Es wird daher (jetzt schon) sehr komplex z.B. Positionen für die Maussteurung zu ermitteln...

Die Richtung mit TObjectList und TControl ist auf jeden Fall mal der richtige Weg. Ich stelle mir auf meinem Formular die Basiskomponente (TPlanGrid) vor, dan die ich nach belieben TPlanGridGroup-Objekte "andocken" kann. An die TPlanGridGroup-Objekte würde ich dann TPlanGridLines-Objekte anhängen usw. Das Neuzeichnen sowie das reagieren auf Ereignisse (Tastatur und Maus) übernhemen dann die einzelnene Komponenten jeweils für sich selbst.

Ich tue mich im Moment nur etwas schwer damit was ich von was ableite... Früher gab's, damals noch von Borland, immer so eine tolle grafische Übersicht der Objekthirarchie innerhalb der VCL. Die würde mir da schon weiterhelfen... Leider gibt's ja sowas nimmer...

Ich werde mal weitergrübeln und mich hier wieder melden, wenn ich einen entsprechenden Weg gefunden habe...

Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#4

Re: Container für bestimmte Objekte schaffen...

  Alt 8. Nov 2009, 10:03
Zitat:
Mein Problem ist, dass ich die Intelligenz in die jeweiligen Objekte packen möchte. Aktuell wird alles im zentralen TPlanGrid gezeichnet. Es wird daher (jetzt schon) sehr komplex z.B. Positionen für die Maussteurung zu ermitteln...
Alle Objekte, die visuell sind sollten sich selbst zeichnen und auch auf Ereignisse selbst reagieren. Das hast du ja schon erkannt.

Zitat:
Die Richtung mit TObjectList und TControl ist auf jeden Fall mal der richtige Weg.
Die Liste brauchst du ja hauptsächlich, damit die dynamisch erzeugten Objekte auch wieder entfernt werden können. Da ist die ObjectList mit "OwnsObjects" schon eine feine Sache.

Zitat:
Ich tue mich im Moment nur etwas schwer damit was ich von was ableite...
Fang halt mal bei irgendeiner visuellen Klasse (die dem was du willst nahe kommt, z.B. TPanel) an und schau, von welcher Klasse die abgeleitet ist. Dann steigst du immer höher in der Klassenhirarchie aufwärts, bis du bei irgendeiner Klasse ankommst, die noch alle Funktionalitäten (z.B. Canvas, Mausereignisse, usw.) hat, die du benötigst und erweiterst sie um das was du brauchst.

Delphi-Quellcode:
  TPlanGrid = class(TCustomControl) //z.B.
    (...)
    FPlanGridGroupList : TObjectList;

  end;

  TPlanGridGroup = class(TCustomControl)
    (...)
    FPlanGridLineList: TObjectList;

  end;

   TPlanGridLine = class(TCustomControl)
    (...)

  end;
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#5

Re: Container für bestimmte Objekte schaffen...

  Alt 8. Nov 2009, 14:57
Hi Guido,

Zitat von guidok:
Fang halt mal bei irgendeiner visuellen Klasse (die dem was du willst nahe kommt, z.B. TPanel) an und schau, von welcher Klasse die abgeleitet ist. Dann steigst du immer höher in der Klassenhirarchie aufwärts, bis du bei irgendeiner Klasse ankommst, die noch alle Funktionalitäten (z.B. Canvas, Mausereignisse, usw.) hat, die du benötigst und erweiterst sie um das was du brauchst.
das ist genau das, was ich momentan mache... Dank <Ctrl><Click> ist das ja kein Problem. Ich schaue in diesem Zug auch oft nach, wie verschiedene Dinge in der VCL gelöst sind. Das TPlanGrid-Objekt habe ich schonmal "gesäubert". Jetzt suche ich nach einer Möglichkeit das Objekt sweit zu bringen, dass ich im Designer eine Objekt vom Typ "TPlanGridGroup" darauf abelegen kann. Die Gruppe soll dann unten am PlanGrid angefügt werden. Wenn ich in ControlStyle die Eigenschaft "csAcceptsControls" hinzufüge, dann akzeptiert das Objekt ja alle visuellen Objekte... Ich denke ich schaue mir mal DBCtrlGrid genauer an. Das akzeptiert ja auch blos bestimmte Komponenten...

Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#6

Re: Container für bestimmte Objekte schaffen...

  Alt 8. Nov 2009, 15:03
Na super,

in der Hilfe gäbe es wohl etwas Lesestoff dazu (Elemente ablegen...). Allerdings sind die ganzen Verweise tot (siehe Anhang).



Alex
Miniaturansicht angehängter Grafiken
sample_209.jpg  
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  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 14:16 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