AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Subkomponenten Zeichnen

Ein Thema von Brainstalker · begonnen am 6. Jan 2011 · letzter Beitrag vom 7. Jan 2011
Antwort Antwort
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#1

Subkomponenten Zeichnen

  Alt 6. Jan 2011, 00:34
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.
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.533 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Subkomponenten Zeichnen

  Alt 6. Jan 2011, 08:08
Vielleicht hilft Dir das Video zu Composite Controls.
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
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Subkomponenten Zeichnen

  Alt 7. Jan 2011, 13:12
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 if Visible then zeichne;
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.533 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Subkomponenten Zeichnen

  Alt 7. Jan 2011, 13:21
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.
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
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Subkomponenten Zeichnen

  Alt 7. Jan 2011, 13:39
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
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.533 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Subkomponenten Zeichnen

  Alt 7. Jan 2011, 14:04
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.
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
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Subkomponenten Zeichnen

  Alt 7. Jan 2011, 14:52
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.
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.533 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Subkomponenten Zeichnen

  Alt 7. Jan 2011, 15:31
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;
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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:55 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