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 Subkomponenten Zeichnen (https://www.delphipraxis.net/157272-subkomponenten-zeichnen.html)

Brainstalker 5. Jan 2011 23:34

Subkomponenten Zeichnen
 
Ich hoffe der Titel ist zutreffend.

Ich schreib mir gerade eine Komponente. Diese enthält eine ObjectList mit Objekten. Jetzt hab ich mir das mit dem Zeichnen der Komponenten wie folgt gedacht:

- Hauptkomponente zeichnet sich selbst ( Paint; )
- Hauptkomponente teilt Subkomponenten Left, Top, Width und Height zu
- Subkomponente zeichnet sich selbst ( Paint; )

Ich habe aber irgendwie das Gefühl, das es so nicht wirklich schlau ist. Wie verfahre ich da richtig? Meine Subkomponenten haben auch nochmal Subkomponenten.

Meine Hauptkomponente ist von TCustomControl abgeleitet.
Die Subkomponenten sind von TCustomControl oder TGraphicControl abgeleitet.

DeddyH 6. Jan 2011 07:08

AW: Subkomponenten Zeichnen
 
Vielleicht hilft Dir das Video zu Composite Controls.

Brainstalker 7. Jan 2011 12:12

AW: Subkomponenten Zeichnen
 
Danke für das Video. Hab einiges gelernt und weiß das ich auf dem richtigen Weg bin.

Ich kann jetzt mein Problem ein bisschen besser differenzieren. Vielleicht sollte ich auch mal sagen was ich eigentlich vorhabe. Ich schreibe gerade ein Planner Komponente um ereignisse eines Tages anzuzeigen.

Die Hauptkomponente hat Gruppen und jede Gruppe besitzt Events. So mein bisheriger Aufbau. Jetzt mein eigentliches Problem, oben (X-Achse) zeige ich die Zeiten von 00:00 bis 24:00 an. Und links (Y-Achse) je nach Ansicht entweder Gruppen bzw. Tage. Im Moment zeichne ich noch alles in der Paint von der Hauptkomponente und hab noch keine Probleme beim Zeichnen.
Wenn ich jetzt das Zeichnen der Gruppen in der eigenen Paint mache, dann werden die Gruppen auch gezeichnet wenn ich in der Tagesansicht bin.

Wie kann ich das verhindern? Soll ich bei den Gruppen eine Visible Property hinzufügen und dann nur zeichnen wenn sichtbar? Also in der Paint á la
Delphi-Quellcode:
if Visible then zeichne;

DeddyH 7. Jan 2011 12:21

AW: Subkomponenten Zeichnen
 
Der Ansatz klingt für mich zumindest nicht schlecht. Diese Visible-Property muss ja nur intern ausgewertet werden und nicht nach außen hin verfügbar sein.

ChrisE 7. Jan 2011 12:39

AW: Subkomponenten Zeichnen
 
Hallo,

ich denke man sollte sich die Frage stellen "wer" die Aufgabe übernehmen soll für die Entscheidung des neu zeichnens. Also, wer soll das wissen darüber umsetzen, ob etwas neu gezeichnet werden soll. Das können zum einen die einzelnen Komponenten tun, indem Sie die Visible-Property abfragen oder auch z.B. das ClipRect der Canvas auswerten (bin ich im ClipRect, dann muss ich mich neu zeichnen) oder es entscheidet immer der Master-Container.

Ich selber halte es für besser, dass jeder für sich entscheidet, ob er neu gezeichnet werden muss, da der "Auftrag" zum Neuzeichnen ja von beliebig verschieden Stellen kommen kann. Aber das ist sicher eine Designfrage.

Gruß, Chris

DeddyH 7. Jan 2011 13:04

AW: Subkomponenten Zeichnen
 
Ich meine auch, dass die "Items" (ich nenne sie mal so) sich selbst zeichnen sollten, da sie ja schließlich ihre Daten auch selbst verwalten.

Brainstalker 7. Jan 2011 13:52

AW: Subkomponenten Zeichnen
 
Also im Moment setze ich im Paint der Hauptkomponente die Position der "Items" wodurch sie sich ja selber neu zeichnen.
Also lege ich jetzt am besten eine Protected Property in den "Items" an, damit die Hauptkomponente darauf zugreifen kann? Die Hauptkomponente soll ja entscheiden ob die "Items" sichtbar sind oder nicht, weil es ja von ihrer View Property abhängt.

Wo kann ich denn mehr über ClipRect erfahren?

Vielleicht hat ja jemand ein kleines Beispiel, hab da glaub ich eine kleine Denkblockade.

DeddyH 7. Jan 2011 14:31

AW: Subkomponenten Zeichnen
 
Du hast ja das Rechteck des jeweiligen Items und kannst Delphi-Referenz durchsuchenClipRect der Zeichenfläche abfragen. Nun musst Du nur noch sehen, ob es Überschneidungen zwischen diesen beiden gibt. Wenn nicht, muss das Item auch nicht gezeichnet werden. Mal aus der hohlen Hand:
Delphi-Quellcode:
procedure TDeinItem.SetRect(R: TRect);
var Clip, dummy: TRect;
begin
  Left := R.Left;
  Top := R.Top;
  Width := R.Right - R.Left;
  Height := R.Bottom - R.Top;
  Clip := DeinCanvas.ClipRect;
  if IntersectRect(dummy, Clip, R) then
    Invalidate;
end;


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