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 [erledigt] Rechteck füllen (https://www.delphipraxis.net/87569-%5Berledigt%5D-rechteck-fuellen.html)

Hansa 2. Mär 2007 11:57


[erledigt] Rechteck füllen
 
Hi,

habe einige Panele und darauf einige Labels. Code-Fragment :

Delphi-Quellcode:
procedure Tfrm.LabelMouseEnter(Sender: TObject);

...
  if (Sender is TLabel) then begin
    Canvas.Brush.Color := clSkyBlue;
    Canvas.FillRect (Rect ((Sender as TLabel).Parent.Left-5,
                      (Sender as TLabel).Parent.Top-5,
                      (Sender as TLabel).Parent.Left+5 + (Sender as TLabel).Parent.Width+1,
                      (Sender as TLabel).Parent.Top+5 + (Sender as TLabel).Parent.Height+1));
    Canvas.Pen.Color := clNavy;
    Canvas.Pen.Width := 4;
    Canvas.Rectangle ((Sender as TLabel).Parent.Left,
                      (Sender as TLabel).Parent.Top,
                      (Sender as TLabel).Parent.Left + (Sender as TLabel).Parent.Width+1,
                      (Sender as TLabel).Parent.Top + (Sender as TLabel).Parent.Height+1);
  end;
Parent der Labels ist immer ein Panel. Sofern man mit der Maus in die Nähe der Labels kommt, sollen die Panels umrandet und auch gefüllt werden. Folgender Effekt tritt auf : die Umrandung klappt einwandfrei, das Füllen mit anderer Farbe aber nicht. :shock: mit dem -5/+5 im FillRect habe ich zumindest einen Effekt erzielt : außerhalb der Panels ist was zu sehen (5 Pixel breiter Rahmen in clSkyBlue).

So was in der Art geht nicht :

Delphi-Quellcode:
(Sender as TLabel).Parent.Color := clSkyBlue;
Was ist da zu machen ?

WordsBG 2. Mär 2007 12:17

Re: Rechteck füllen
 
Wie wäre es mit

Delphi-Quellcode:
((Sender as TLabel).Parent as TPanel).Color := clSkyBlue;
Bei mir geht das. :zwinker:

scrat1979 2. Mär 2007 12:22

Re: Rechteck füllen
 
Anhand Deiner Eintragszahl folgere ich, dass Du Dich mit Delphi recht gut auskennst :-)

Wäre es in Deinem Fall evtl. daher nicht günstiger eine eigene Komponente von TLabel oder TCustomLabel abzuleiten und einen "Hover" Effekt bei DoPaint/DoDrawText zu realisieren. So weit ich das nachvollziehe ist das doch dein Anliegen?!? Ich kenne mich zwar nicht sooo gut aus, aber habe eine ähnliche Komponente mit Rahmen/Textfarbenänderung auch hinbekommen, dann dürfte das für Dich ein Klacks sein.

Grüsse,
SCRaT

Hansa 2. Mär 2007 12:36

Re: Rechteck füllen
 
Eigene Komponente ? Wäre zu überlegen. Aber : schon mal selbst überlegt, was da alles zu tun wäre ? Das Label müssste als Subkomponente behandelt werden usw. Solange die Frage nicht geklärt ist, baue ich nicht noch irgendwas in eine Komponente und habe dann mit der denselben Ärger, wie ohne.

OT : nicht mal Luckie weiß alles. :mrgreen:

smudo 2. Mär 2007 12:41

Re: Rechteck füllen
 
TPanel und Color funktioniert m.E. nicht. Hast du schon mal probiert, einem Panel im OI eine andere Farbe zuzuweisen? Da passiert glaube ich rein gar nichts.

Hawkeye219 2. Mär 2007 12:53

Re: Rechteck füllen
 
Hansa, ich kann in deinem Code-Fragment keine Stelle entdecken, an der du ein Panel färbst. Meiner Meinung nach zeichnest du auf dem Canvas des Formulars.

@smudo
Warum sollte das nicht funktionieren? Ich muß allerdings zugeben, daß ich keine Erfahrungswerte über die Auswirkungen einer Manifest-Datei habe.

Gruß Hawkeye

Hansa 2. Mär 2007 18:51

Re: Rechteck füllen
 
Also :

Zitat:

Zitat von smudo
TPanel und Color funktioniert m.E. nicht. Hast du schon mal probiert, einem Panel im OI eine andere Farbe zuzuweisen? Da passiert glaube ich rein gar nichts.

OI interessiert nicht. Du hast den as / is Kram vergessen. Woher soll denn Delphi wissen, was es konkret nutzen soll ? :shock: Das steht zur Runtime zwar fest, aber nicht schon beim Design.

Zitat:

Zitat von Hawkeye219
Hansa, ich kann in deinem Code-Fragment keine Stelle entdecken, an der du ein Panel färbst.

Wie wärs hiermit :

Zitat:

Zitat von Hansa
[delphi]
procedure Tfrm.LabelMouseEnter(Sender: TObject);

...
if (Sender is TLabel) then begin
Canvas.Brush.Color := clSkyBlue;
Canvas.FillRect (Rect ((Sender as TLabel).Parent.Left-5,
(Sender as TLabel).Parent.Top-5,
(Sender as TLabel).Parent.Left+5 + (Sender as TLabel).Parent.Width+1,
(Sender as TLabel).Parent.Top+5 + (Sender as TLabel).Parent.Height+1));
[delphi]

Geht zwar wegen Quereffekten so anscheinend nicht, aber "(Sender as TLabel)" sind definitiv die Panele. Das hier allerdings sieht gut aus :

Zitat:

Zitat von WordsBG
[pre]((Sender as TLabel).Parent as TPanel).Color := clSkyBlue;[/pre]

Bei mir geht das. :zwinker:

Noch mehr "aASen". :zwinker: Mein Gespür sagt intuitiv, das könnte tatsächlich der Trick sein. Jo, Beitragsanzahl hat schon was zu sagen. :mrgreen:

Edit : Tags verbessert.

Edit 2 : geht nicht.

Marco Haffner 2. Mär 2007 20:31

Re: Rechteck füllen
 
Mit "(Sender as TLabel)" greifst Du zwar auf das Panel zu, aber eben nur für die Position, wohin das Rechteck gezeichnet wird. "Canvas.FillRect" ist aber der Canvas des Formulars auf dem das Panel liegt.

Hansa 2. Mär 2007 20:56

Re: Rechteck füllen
 
Wie geahnt : der Vorschlag von WordsBG geht tatsächlich so ! :thumb: FillRect usw. macht mehr Ärger, als nötig und ist überflüssig. Zumindest für den Fall hier. Zweimal AS und das wars.


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