![]() |
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 23:52 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