![]() |
Rahmen um Label
Hi,
kann man irgendwie mit möglichst einfachen Mitteln einen Rahmen um ein Label zeichnen ? Bzw. wie ? Bevor der obligatorische Hinweis auf die Suche kommt, da kommt als Ergebnis u.a. : "das sprengt den Rahmen" :lol: |
Re: Rahmen um Label
Ein Label hat doch schon ein Rahmen oder nicht?
|
Re: Rahmen um Label
Zitat:
|
Re: Rahmen um Label
Hi,
am einfachsten ist es wahrscheinlich, ein TShape hinter das Label zu legen. Damit kannst du sogar Farbe, Dicke und Strichart beeinflussen. Bei TStaticText fehlt leider die Möglichkeit, den Text vertikal zu zentrieren. Gruß Hawkeye |
Re: Rahmen um Label
Zitat:
|
Re: Rahmen um Label
Es beantwortet zwar genau genommen nicht deine Frage, aber: Nimm ein Panel anstatt einem Label. :cyclops:
|
Re: Rahmen um Label
Oder Setz das Label auf ein Panel stell einen Rahmen ein und Setz das Editfeld auf BorderStyle bsNone
Eine nicht so schöne Lösung geht aber im Notfall Gruss Sascha |
Re: Rahmen um Label
Zitat:
|
Re: Rahmen um Label
Möglichst einfach is im OnPaint einen Rahmen um das Label zu Zeichnen.
|
Re: Rahmen um Label
Delphi-Quellcode:
procedure TForm1.FormPaint(Sender: TObject);
begin Canvas.Pen.Width:=1; Canvas.Pen.Color:=clBlack; Canvas.Rectangle(Label1.Left-1, Label1.Top-1, Label1.Left + Label1.Width+1, Label1.Top + Label1.Height+1); end; |
Re: Rahmen um Label
Canvas der Form ? :gruebel: Habe jetzt mal folgendes gemacht :
Delphi-Quellcode:
Die showmessage zeigt immer 20 an, also relativ wenig. Die Labels sind auf einer Form verteilt und sollen eine andere Farbe und auch einen Rahmen erhalten, sofern sich der Mauszeiger darüber befindet. Die Farben gehen so, der Rahmen noch nicht.
procedure TfrmKey.lblMouseEnter(Sender: TObject);
begin with Sender as TLabel do begin Color := clSkyBlue; Font.Color := clNavy; showmessage (IntToStr (Height)); Canvas.Pen.Width:=1; Canvas.Pen.Color:=clBlue; Canvas.Rectangle(Left-1, Top-1,Left + Width+1, Top + Height+1); end; end; |
Re: Rahmen um Label
Zitat:
Gruß Hawkeye |
Re: Rahmen um Label
Delphi-Quellcode:
procedure TForm1.Label1MouseEnter(Sender: TObject);
begin with Sender as TLabel do begin Color := clSkyBlue; Font.Color := clNavy; Form1.Canvas.Pen.Width:=1; Form1.Canvas.Pen.Color:=clRed; Form1.Canvas.Rectangle(Left-1, Top-1,Left + Width+1, Top + Height+1); Repaint; end; end; |
Re: Rahmen um Label
Ich Idiot habe ja auch in der showmessage Height anzeigen lassen. :wall: Klar, dass das immer gleich blieb.
Delphi-Quellcode:
Jetzt wird da was gezeichnet, aber an völlig falscher Stelle irgendwo in rechter Form-Ecke. Brauche das Rechteck aber um das Label in Abhängigkeit von dessen Koordinaten. Hat jemand vielleicht noch fertigen Code ? :mrgreen:
procedure TfrmKey.lblMouseEnter(Sender: TObject);
begin with Sender as TLabel do begin Color := clSkyBlue; Font.Color := clNavy; end; showmessage (IntToStr ((Sender as TLabel).Top)); Canvas.Pen.Width:=1; Canvas.Pen.Color:=clBlue; Canvas.Rectangle(Left-1, Top-1,Left + Width+1, Top + Height+1); end; wg. roter Kasten : das ist so ähnlich. Bin aber hingegangen und habe den Code lieber aus dem with rausverlagert. Ergebnis : siehe oben. |
Re: Rahmen um Label
Siehe Eintrag 13.
|
Re: Rahmen um Label
Zitat:
|
Re: Rahmen um Label
Mein Source darf nicht nur für "Form1" gelten. Das wird alles vererbt. Letzter Stand ist der hier :
Delphi-Quellcode:
Sofern die showmessage nicht auskommentiert ist, sieht man den Rahmen und zwar auch mit den richtigen Koordinaten. Repaint nützt da auch nichts.
with Sender as TLabel do begin
Color := clSkyBlue; Font.Color := clNavy; end; //showmessage ('1111'); Canvas.Pen.Width:=1; Canvas.Pen.Color:=clBlue; Canvas.Rectangle((Sender as TLabel).Left,(Sender as TLabel).Top, (Sender as TLabel).Left + (Sender as TLabel).Width, (Sender as TLabel).Top+(Sender as TLabel).Height); Noch ein Effekt : ist der Rahmen zu sehen, dann ist die Label.Caption weg oder wohl eher überdeckt. Ich denke das Rectangle zeichnet nur Linien ? Habe doch kein FillRect etc. verwendet. :shock: |
Re: Rahmen um Label
Zitat:
|
Re: Rahmen um Label
Zitat:
Rectangle zeichnet mit dem Pen einen Rahmen rundum und füllt dann mit dem brush aus. Versuch brush.style auf bsClear zu setzen und evtl auch Brush.Color auf clClear. Hope it helps Thomas |
Re: Rahmen um Label
Liste der Anhänge anzeigen (Anzahl: 1)
Ne, Brush bezieht sich auf die Form. Das hier liefert etwas wie im Anhang. Aber nur, solange die showmessage da ist.
Delphi-Quellcode:
Wichtig wäre jetzt erstmal zu wissen, wie das showmessage wegzubekommen ist. Das ist lästig und es könnte Quereffekte hervorrufen.
procedure TfrmKey.lblMouseEnter(Sender: TObject);
begin with Sender as TLabel do begin Color := clSkyBlue; Font.Color := clNavy; end; showmessage ('KJHJK'); Canvas.Pen.Width := 2; Canvas.Pen.Color :=clBlue; Canvas.Rectangle ((Sender as TLabel).Left,(Sender as TLabel).Top, (Sender as TLabel).Left + (Sender as TLabel).Width, (Sender as TLabel).Top+(Sender as TLabel).Height); end; |
Re: Rahmen um Label
Mache erstmal den Rand so groß, dass man ihn auch vernünftig sieht (siehe Code). Die Reihenfolge der späteren Anzeige (also dass das Label auf dem Rectangel liegt) kannst du beeinflussen, indem du das Label zuletzt noch einmal refreshed.
Delphi-Quellcode:
Wie willst du bei diesem Konstrukt den Rahmen eigentlich wieder wegmachen, wenn die Maus das Label verlässt?
begin
with Sender as TLabel do begin Color := clSkyBlue; Font.Color := clNavy; end; //showmessage ('KJHJK'); Canvas.Pen.Width := 2; Canvas.Pen.Color :=clBlue; Canvas.Rectangle ((Sender as TLabel).Left-5,(Sender as TLabel).Top-5, (Sender as TLabel).Left + (Sender as TLabel).Width+5, (Sender as TLabel).Top+(Sender as TLabel).Height+5); (Sender as TLabel).Refresh; end; |
Re: Rahmen um Label
Hallo,
ein Verbesserungsvorschlag:
Delphi-Quellcode:
Grüße vom marabu
procedure TDemoForm.Decorate(l: TLabel; entering: Boolean);
const PENWIDTH = 2; var r: TRect; begin Canvas.Pen.Width := PENWIDTH; if entering then Canvas.Pen.Color := clHighLight else Canvas.Pen.Color := Color; r := l.BoundsRect; InflateRect(r, PENWIDTH, PENWIDTH); Canvas.Rectangle(r); Canvas.Pen.Width := 1; l.Refresh; end; |
Re: Rahmen um Label
Zitat:
Kann Dir hier nicht ganz folgen. Was meinst Du damit? Gruß Thomas |
Re: Rahmen um Label
Zitat:
Das von dir vorgeschlagene Canvas.Brush.Style:=bsClear funktioniert sehr gut. Es erspart zudem das Label.Refresh (war eh nur 'ne Trickserei) und ermöglicht damit das ungefährdete Neuzeichnen (und damit das "Ausblenden") des Rectangels (mit Farbe BtnFace) beim Verlassen des Labels mit der Maus. Wenn die Labels jetzt weit genug entfernt von anderen Dingen auf der Form liegen, so dass der Rahmen nichts übermalt, ist's gut, andernfalls muss das Übergemalte neu gezeichnet werden. Das würde pauschal ein Form.Refresh am Ende der LabelMouseLeave-Routine erledigen. //Nachtrag: Wie früher schonmal sinngemäß angedeutet, wird ein 2 Pixel dicker Rahmen um ein Label auch erst sichtbar, wenn man ihn 2 Pixel größer als das Label macht. Also so:
Delphi-Quellcode:
Letzteres wird von marabus Vorschlag möglicherweise auch schon berücksichtigt. Aber zur Verabschaulichung bleibe ich hier noch bei der "aufgelösten" Version. :-)
Canvas.Rectangle ((Sender as TLabel).Left-2,(Sender as TLabel).Top-2,
(Sender as TLabel).Left + (Sender as TLabel).Width+2, (Sender as TLabel).Top+(Sender as TLabel).Height+2); |
Re: Rahmen um Label
Zitat:
Delphi-Quellcode:
Alles andere ist einfach zuviel und überflüssig.
procedure TfrmKey.lblMouseEnter(Sender: TObject);
var Rechteck : TRect; begin with Sender as TLabel do begin Color := clSkyBlue; Font.Color := clBlack; end; //showmessage ('KJHJK'); Canvas.Pen.Width := 12; Canvas.Pen.Color :=clBlue; Canvas.Rectangle ((Sender as TLabel).Left,(Sender as TLabel).Top, (Sender as TLabel).Left + (Sender as TLabel).Width, (Sender as TLabel).Top+(Sender as TLabel).Height); end; |
Re: Rahmen um Label
Zitat:
Erst erklärst du, dass du nur eine halbwegs brauchbare Ausgabe hinbekommst, wenn du ein Krücken-ShowMessage einbaust ... Zitat:
Dabei ignorierst du alle Fakten, Gedanken und Lösungsansätze, die Andere hier bei der Besprechung deines Problems angebracht haben und präsentierst eine "Lösung", die nichts besser funktioniert, als was du davor auch zustande gebracht hattest. Und mittendrin stelltest du Fragen, aufgrund derer ich ernsthaft befürchtete, deine Online-Hilfe sei völlig ausgefallen. Naja, es ist schade, aber ich bekomme immer öfter das Gefühl, bei dir einfach nur für die Tonne zu schreiben. :? Aber gut, das ist mein Problem. Da du Delphi ja so sehr gut folgen kannst ;-), erkläre doch mal, was passiert, wenn du bei deinem Code zum zweiten mal die Maus über das Label fährst. Bei D7 unter XP sieht man nur noch Schrott. :twisted: |
Re: Rahmen um Label
mach mal etwas halblang. Was soll das hier denn :
Zitat:
Zitat:
P.S.: das ganze läuft jetzt unter D7 und XP ohne Schrott auf 100 ??? (eher mehr) Forms. :zwinker: Edit : ist das hier nicht klar ? Zitat:
Delphi-Quellcode:
procedure TfrmKey.lblMouseLeave(Sender: TObject); // falls Maus nicht über Label : zurücksetzen
begin with Sender as TLabel do begin Color := clInfoBk; Font.Color := clBlack; end; Canvas.Pen.Width := PinselBreite; Canvas.Pen.Color := Color; Canvas.Rectangle ((Sender as TLabel).Left+1,(Sender as TLabel).Top+1, (Sender as TLabel).Left + (Sender as TLabel).Width, (Sender as TLabel).Top+(Sender as TLabel).Height); end; |
Re: Rahmen um Label
@Hansa: Es wäre dennoch sehr freundlich, wenn DU einmal meine Frage beantworten würdest, statt mir an den Kopf zu werfen, ich könne Delphi nicht folgen.
Auch ich gehöre zu denjenigen, die Ihr Geld damit verdienen, mit Delphi Lösungen zu erarbeiten. Könnte ich Delphi nicht folgen, so müßte ich schlichtweg verhungern. Gruß Thomas |
Re: Rahmen um Label
Das hier ist die einzige Frage, die ich sehe :
Zitat:
|
Re: Rahmen um Label
Zitat:
Brush gibt es weder direkt in TLabel noch in TForm, sondern ist Bestandteil des Canvas, den nun wieder beide Komponenten haben. Ich finde es sehr schade, daß Du Dir nicht einmal in von Dir selbst erstellten Threads die Mühe machst, die Antworten die man Dir gibt richtig durchzuarbeiten. Spätestens ![]() Ich verabschiede mich jetzt einigermaßen gefrustet aus Diesem Thread und hoffe, dass er nicht wie viele andere Threads, in denen Du mitgewirkt hast in einen unsachlichen Krieg mündet. Gruß Thomas |
Re: Rahmen um Label
Zitat:
Zitat:
Schon vorher wurde dir gesagt, dass man das Rectangel durchsichtig machen kann per Canvas.Brush.Style:=bsClear. Anstatt das zu überprüfen, kam eine unbrauchbare Vermutungsäußerung von dir. Auf die darauffolgende Frage, was du meinst, kam gar nichts. Daraufhin hatte ich nochmal geschrieben, dass das ein sehr guter Vorschlag sei. Dein abschließender Kommentar: "Alles überflüssig." Zitat:
Zitat:
Okay, deine MouseLeave-Methode reisst das raus. Aber auch nur halbherzig. Eine MouseEnter-Methode mit durchsichtigem Rectangel (Canvas.Brush.Style:=bsClear) und herumgelegtem Rahmen würde auch dann funktionieren (also das Label immer korrekt anzeigen, auch bei mehrfachem Überfahren mit der Maus), wenn es gar kein MouseLeave gäbe. Das Problem einer eventuellen Überdeckung von anderen visuellen Sachen auf der Form hast du auch nicht gelöst. Es wurde angesprochen. Es interessiert dich aber gar nicht. Wer mit deinem Code noch etwas direkt neben den Rahmen-Labeln liegen hat, der wird diese Nachbarn mit dem Rahmen zerstören. Warum? Weil du ein simples Self.Refresh am Ende deiner MouseLeave-Methode für überflüssig hälst ... |
Re: Rahmen um Label
Hallo,
ich hatte das Problem mal so gelöst:
Delphi-Quellcode:
MFG Christian18
Label1.Canvas.Rectangle(0, 0, Label1.Width, Label1.Height);
|
Re: Rahmen um Label
Zitat:
Was soll das Jetzt ? So ein unschöner Thread kommt daher denke Ich, das man seine Frage von Anfang an nicht Richtig stellt. Da ging es um einen Rahmen der um ein Label gezeichnet werden sollte. Und somit hätte Christian18 seine Lösung schon geholfen. |
Re: Rahmen um Label
Was soll denn das jetzt ? :shock: Nun gut, dann fangen wir mal überflüssigerweise an.
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
comprende ? -> Google :mrgreen: |
Re: Rahmen um Label
Hallo
Delphi-Quellcode:
wenn du das jetzt noch in die paint Routine des Labels setzt ist alles OK.
label1.Canvas.Rectangle(0,0,label1.width,label1.height);
Rainer |
Re: Rahmen um Label
Hallo,
hier ein komplettes Beispiel. Für den enstrechenden Labeltext musst du noch ein property einführen und den Text leer im paint dadurch ersetzen. Hab ich mir hier erspart. Soll ja auch nur eine Demo sein, wie man soetwas macht. Zu guterletzt kann das eine eigene Komponente werden.
Delphi-Quellcode:
Gruss Rainer
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type Tlabel_new=class (Tlabel) procedure paint;override; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } t:tlabel_new; end; var Form1: TForm1; implementation {$R *.dfm} procedure Tlabel_new.paint; var r:trect; begin inherited; r.Left:=1; r.Top:=1; r.Bottom:=height; r.Right:=width; Canvas.rectangle(r); Caption:='leer'; end; procedure TForm1.FormCreate(Sender: TObject); begin t:=tlabel_new.Create(self); t.parent:=self; end; end. |
Re: Rahmen um Label
Hallo,
hier nochmal mit property. Warum die Routine das alte caption nicht zeichnet ist mir unklar. Aus diesem Grund habe ich das neue property utext_label eingeführt. Vielleicht kann hier jemand helfen.
Delphi-Quellcode:
Gruss Rainer
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type Tlabel_new=class (Tlabel) procedure paint;override; private { Private-Deklarationen } utext_label:string; procedure Settext_label(const Value: string); public { Public-Deklarationen } published { Published-Deklarationen } property Text_label : string read utext_label write Settext_label; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } t:tlabel_new; end; var Form1: TForm1; implementation {$R *.dfm} procedure Tlabel_new.Settext_label(const Value: string); begin utext_label:=value; paint; end; procedure Tlabel_new.paint; var r:trect; begin inherited; r.Left:=1; r.Top:=1; r.Bottom:=height; r.Right:=width; Canvas.rectangle(r); Caption:=utext_label; end; procedure TForm1.FormCreate(Sender: TObject); begin t:=tlabel_new.Create(self); t.parent:=self; t.utext_label:='Hallo' end; end. |
Re: Rahmen um Label
Guten Morgen,
weil ich nicht allen VCL-Komponenten nachträglich eine Funktionalität "vererben" kann und die Methode aus Beitrag #22 mir selbst nicht gefallen hat, hier noch ein Ansatz:
Delphi-Quellcode:
So können nicht nur Label mit einem visual clue ausgestattet werden. Auch die Einbettung (Parent) darf belieb sein.
procedure Decorate(hdc: HDC; r: TRect; penColor: TColor);
const PENWIDTH = 2; begin with TCanvas.Create do try Handle := hdc; Pen.Width := PENWIDTH; Pen.Color := penColor; InflateRect(r, PENWIDTH, PENWIDTH); Brush.Style := bsClear; Rectangle(r); finally Free; end; end; Nach Auslotung der verschiedenen Möglichkeiten hat mir der Ansatz (bsClear) von Thomas in Beitrag #19 am besten gefallen. Der Hinweis von Ingo in Beitrag #24 ist richtig, aber bei Einhaltung der gängigen Style Guides sollen Controls mit mindestens vier Pixeln freigestellt werden, so dass ein zwei Pixel dicker Rahmen keine Überdeckungen verursacht. Wird der Rahmen auf die jeweilige visuelle Komponente selbst gezeichnet, dann fehlt mir der punmping effect. Und FrameRect() zeichnet leider nur den dünnst-möglichen Rahmen (ein Pixel), was mir zu mager ist. Getestet habe ich so:
Delphi-Quellcode:
Freundliche Grüße
procedure TDemoForm.LabelEnter(Sender: TObject);
begin with Sender as TLabel do Decorate(GetDC(Handle), BoundsRect, clHighlight); end; procedure TDemoForm.LabelLeave(Sender: TObject); begin with Sender as TLabel do Decorate(GetDC(Handle), BoundsRect, self.Color); end; |
Re: Rahmen um Label
Zitat:
Du schreibst in #17 sogar noch selber: Zitat:
Zitat:
onlinekater schrieb in #19 Zitat:
Rectangle zeichnet mit dem Pen einen Rahmen rundum und füllt dann mit dem brush aus. Versuch brush.style auf bsClear zu setzen und evtl auch Brush.Color auf clClear. Hansa schrieb in #20 Ne, Brush bezieht sich auf die Form. Das hier liefert etwas wie im Anhang. Aber nur, solange die showmessage da ist. Da hattest du weder verstanden, was onlinekater meinte (das ist nicht schlimm), noch hast du versucht es nachzuvollziehen und zu verstehen (das ist schlimm). Zitat:
Zitat:
Zitat:
Du huscht von Codeschnipsel zu Codeschnipsel, postest zwischendurch Zwischenergebnisse mit Anmerkungen, was immer noch nicht geht, und wenn man darauf eingeht, bist du schon lange beim nächsten Schnipsel und interessierst dich für das "Geschwätz von gestern" überhaupt nicht mehr. Irgendwann erscheint dein "Ergebnis" so, wie du es sehen möchtest, und du bist begeistert. Du könntest weder erklären, warum es jetzt so aussieht, noch warum andere Lösungsversuche oder -ratschläge (von uns) angeblich nicht funktionieren. Dabei rede ich noch gar nicht von den kosmetischen Unfeinheiten, wie z.B. die Angabe einer 12-er Pen-Stärke, wenn man einen 6 Pixel dicken Rand zeichnen möchte. :roll: Amen! :angel2: Zitat:
Aber gut, der eine ist so, der andere ist anders. Es ist nur schade, dass so viel gut gemeintes Gedankengut oftmals einfach im Gulli versickert. Aber dein Avatar ist trotzdem schön. :cheers: |
Re: Rahmen um Label
@Ingo : vielen Dank für den unnützen langen Beitrag. :mrgreen:
Habe das ganze nochmals überprüft. Es geht nur so, bzw. am einfachsten :
Delphi-Quellcode:
Wie man sieht, wird da kein ReFresh, Repaint, bsclear usw. gebraucht und ich lasse mich auch nicht überreden, das weshalb auch immer einzubauen. Das korrespondierende OnMouseLeave setzt die Farben zurück und zeichnet den Rahmen in der Hintergrundfarbe wieder neu, der ist dann eben nicht mehr zu sehen. That's it. Gibt es kein MouseLeave, dann wird der Rahmen schon richtig gezeichnet, er bleibt dann eben da wo er ist und verschwindet nicht.
procedure TfrmKey.lblMouseEnter(Sender: TObject);
begin with Sender as TLabel do begin Color := clSkyBlue; Font.Color := clBlack; end; Canvas.Pen.Width := PinselBreite; Canvas.Pen.Color := clNavy; Canvas.Rectangle ((Sender as TLabel).Left+1,(Sender as TLabel).Top+1, (Sender as TLabel).Left + (Sender as TLabel).Width, (Sender as TLabel).Top+(Sender as TLabel).Height); end; Lustig ist noch das hier : Zitat:
Delphi-Quellcode:
Krempel im Rectangle weg haben. Geht aber nicht. Auch ein zweites, vom ersten with getrenntes
Sender as TLabel
Delphi-Quellcode:
oder so was ähnliches geht nicht. Irgendwie haben die Form-Koordinaten trotz "with" Vorrang. Also musste ich das Rectangle mit explizit angegeben Label-Koordinaten machen.
with (Sender as TLabel).Canvas do begin
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz