Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Container für bestimmte Objekte schaffen... (https://www.delphipraxis.net/143002-container-fuer-bestimmte-objekte-schaffen.html)

BigAl 7. Nov 2009 18:26


Container für bestimmte Objekte schaffen...
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

guidok 8. Nov 2009 07:43

Re: Container für bestimmte Objekte schaffen...
 
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 :stupid:

BigAl 8. Nov 2009 08:45

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

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 :stupid:

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

guidok 8. Nov 2009 09:03

Re: Container für bestimmte Objekte schaffen...
 
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;

BigAl 8. Nov 2009 13:57

Re: Container für bestimmte Objekte schaffen...
 
Hi Guido,

Zitat:

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

BigAl 8. Nov 2009 14:03

Re: Container für bestimmte Objekte schaffen...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Na super,

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

:(

Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:11 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