Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Rahmen um Label (https://www.delphipraxis.net/85366-rahmen-um-label.html)

Hansa 29. Jan 2007 21:06


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:

mkinzler 29. Jan 2007 21:09

Re: Rahmen um Label
 
Ein Label hat doch schon ein Rahmen oder nicht?

Daniel G 29. Jan 2007 21:14

Re: Rahmen um Label
 
Zitat:

Zitat von Hansa
kann man irgendwie mit möglichst einfachen Mitteln einen Rahmen um ein Label zeichnen ?

Du könntest TStaticText verwenden und dort den entsprechenden BorderStyle setzen.

Hawkeye219 29. Jan 2007 21:15

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

Daniel G 29. Jan 2007 21:17

Re: Rahmen um Label
 
Zitat:

Zitat von Hawkeye219
Bei TStaticText fehlt leider die Möglichkeit, den Text vertikal zu zentrieren.

Na ja... Er schrieb' ja nirgends, dass er das unbedingt brauch' :stupid:

IngoD7 29. Jan 2007 21:34

Re: Rahmen um Label
 
Es beantwortet zwar genau genommen nicht deine Frage, aber: Nimm ein Panel anstatt einem Label. :cyclops:

SaFu 29. Jan 2007 21:38

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

Hansa 29. Jan 2007 23:04

Re: Rahmen um Label
 
Zitat:

Zitat von mkinzler
Ein Label hat doch schon ein Rahmen oder nicht?

Ne, wo denn ? Borderstyle usw. fehlt da.

Sunlight7 30. Jan 2007 02:13

Re: Rahmen um Label
 
Möglichst einfach is im OnPaint einen Rahmen um das Label zu Zeichnen.

Blackheart 30. Jan 2007 06:38

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;

Hansa 30. Jan 2007 10:04

Re: Rahmen um Label
 
Canvas der Form ? :gruebel: Habe jetzt mal folgendes gemacht :

Delphi-Quellcode:
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;
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.

Hawkeye219 30. Jan 2007 10:29

Re: Rahmen um Label
 
Zitat:

Zitat von Hansa
Die Farben gehen so, der Rahmen noch nicht.

Der Grund dafür könnte sein, daß du auf dem Canvas des Labels zeichnest.

Gruß Hawkeye

Blackheart 30. Jan 2007 10:43

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;

Hansa 30. Jan 2007 10:51

Re: Rahmen um Label
 
Ich Idiot habe ja auch in der showmessage Height anzeigen lassen. :wall: Klar, dass das immer gleich blieb.

Delphi-Quellcode:
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;
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:

wg. roter Kasten : das ist so ähnlich. Bin aber hingegangen und habe den Code lieber aus dem with rausverlagert. Ergebnis : siehe oben.

Blackheart 30. Jan 2007 11:03

Re: Rahmen um Label
 
Siehe Eintrag 13.

hsg 30. Jan 2007 11:05

Re: Rahmen um Label
 
Zitat:

Zitat von Hansa
Ich Idiot habe ja auch in der showmessage Height anzeigen lassen. :wall: Klar, dass das immer gleich blieb.

Delphi-Quellcode:
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;
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:

wg. roter Kasten : das ist so ähnlich. Bin aber hingegangen und habe den Code lieber aus dem with rausverlagert. Ergebnis : siehe oben.

Vielleicht nimmst du nun auch noch die Koordinaten des Labels (hast ja aus deinem With rausgeschmissen :lol:

Hansa 30. Jan 2007 11:30

Re: Rahmen um Label
 
Mein Source darf nicht nur für "Form1" gelten. Das wird alles vererbt. Letzter Stand ist der hier :

Delphi-Quellcode:
  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);
Sofern die showmessage nicht auskommentiert ist, sieht man den Rahmen und zwar auch mit den richtigen Koordinaten. Repaint nützt da auch nichts.

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:

Hansa 30. Jan 2007 11:32

Re: Rahmen um Label
 
Zitat:

Zitat von hsg
..Vielleicht nimmst du nun auch noch die Koordinaten des Labels (hast ja aus deinem With rausgeschmissen :lol:

Die Koordinaten gehen doch jetzt. Was gibts da zu lachen ? :mrgreen:

TBx 30. Jan 2007 11:45

Re: Rahmen um Label
 
Zitat:

Zitat von Hansa
Ich denke das Rectangle zeichnet nur Linien ? Habe doch kein FillRect etc. verwendet. :shock:

Falsch gedacht.
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

Hansa 30. Jan 2007 12:13

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:
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;
Wichtig wäre jetzt erstmal zu wissen, wie das showmessage wegzubekommen ist. Das ist lästig und es könnte Quereffekte hervorrufen.

IngoD7 30. Jan 2007 13:01

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:
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;
Wie willst du bei diesem Konstrukt den Rahmen eigentlich wieder wegmachen, wenn die Maus das Label verlässt?

marabu 30. Jan 2007 13:42

Re: Rahmen um Label
 
Hallo,

ein Verbesserungsvorschlag:

Delphi-Quellcode:
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;
Grüße vom marabu

TBx 30. Jan 2007 14:24

Re: Rahmen um Label
 
Zitat:

Zitat von Hansa
Ne, Brush bezieht sich auf die Form.

???
Kann Dir hier nicht ganz folgen. Was meinst Du damit?


Gruß

Thomas

IngoD7 30. Jan 2007 16:01

Re: Rahmen um Label
 
Zitat:

Zitat von onlinekater
Zitat:

Zitat von Hansa
Ne, Brush bezieht sich auf die Form.

???
Kann Dir hier nicht ganz folgen. Was meinst Du damit?

Mach dir nichts draus - er kann sich manchmal selbst nicht ganz folgen. :tongue:

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:
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);
Letzteres wird von marabus Vorschlag möglicherweise auch schon berücksichtigt. Aber zur Verabschaulichung bleibe ich hier noch bei der "aufgelösten" Version. :-)

Hansa 30. Jan 2007 18:10

Re: Rahmen um Label
 
Zitat:

Zitat von IngoD7
Zitat:

Zitat von onlinekater
Zitat:

Zitat von Hansa
Ne, Brush bezieht sich auf die Form.

???
Kann Dir hier nicht ganz folgen. Was meinst Du damit?

Mach dir nichts draus - er kann sich manchmal selbst nicht ganz folgen. :tongue:

Wenn ihr Delphi nicht folgen könnt, dann kann ich auch nichts dafür. :mrgreen: So geht das :

Delphi-Quellcode:
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;
Alles andere ist einfach zuviel und überflüssig.

IngoD7 30. Jan 2007 20:35

Re: Rahmen um Label
 
Zitat:

Zitat von Hansa
Alles andere ist einfach zuviel und überflüssig.

Du bist der wahre Bastler vor dem Herrn. :|

Erst erklärst du, dass du nur eine halbwegs brauchbare Ausgabe hinbekommst, wenn du ein Krücken-ShowMessage einbaust ...
Zitat:

Zitat von Hansa
Wichtig wäre jetzt erstmal zu wissen, wie das showmessage wegzubekommen ist. Das ist lästig und es könnte Quereffekte hervorrufen.

... und dann fällt dir nichts besseres ein, als deine Rahmendicke auf jenseits von Gut und Böse zu schrauben.

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:

Hansa 30. Jan 2007 20:57

Re: Rahmen um Label
 
mach mal etwas halblang. Was soll das hier denn :

Zitat:

Zitat von IngoD7
..Erst jammerst du rum, dass du nur eine halbwegs lesbare Ausgabe hinbekommst, wenn du ein Krücken-ShowMessage einbaust ...Dabei ignorierst du alle Fakten, Gedanken...deine Online-Hilfe sei völlig ausgefallen...Aber gut, das ist mein Problem...

Zu letzterem : so ist es. :mrgreen: Zu dem davor : das Krücken-showmessage hat mich gestört und keiner hat etwas gesagt, was zu tun ist, um es überflüsig zu machen. Ich habe refresh, repaint, und die anderen Vorschläge sehr wohl ausprobiert. In der OH habe ich sogar das mir bisher nicht bekannte FrameRect entdeckt und auch das getestet. Und mit den dicken Rahmen, da habe ich das so gemacht wie es wohl jeder machen würde. Es muss notfalls ein gewisser Effekt provoziert werden und zwar deutlich sichtbar !

Zitat:

Zitat von IngoD7
..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:

Ja, kann der Delphi-Logik schon folgen, aber laut Dir angeblich nicht. 8)

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:

Zitat von IngoD7
..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:

Das wird umgekehrt rum im OnMouseLeave erledigt !! Für die Nachwelt :
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;

TBx 30. Jan 2007 21:05

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

Hansa 30. Jan 2007 21:14

Re: Rahmen um Label
 
Das hier ist die einzige Frage, die ich sehe :

Zitat:

Zitat von onlinekater
Zitat:

Zitat von Hansa
Ne, Brush bezieht sich auf die Form.

???
Kann Dir hier nicht ganz folgen. Was meinst Du damit?

Was soll ich darauf antworten ? Kann nur sagen, dass ein TLabel kein Brush kennt. Insofern konnte ich Dir nicht folgen. :P

TBx 30. Jan 2007 21:23

Re: Rahmen um Label
 
Zitat:

Zitat von Hansa
Kann nur sagen, dass ein TLabel kein Brush kennt.

Dann möchte ich doch mal gerne wissen, wie Du zu der tollen Aussage kommst, daß Brush zur Form gehört.
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 Delphi-Referenz durchsuchenTCanvas.Rectangle hätte Dir nach meinem Einwand die Erklärung gebracht.

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

IngoD7 30. Jan 2007 21:38

Re: Rahmen um Label
 
Zitat:

Zitat von Hansa
mach mal etwas halblang. Was soll das hier denn :

Zitat:

Zitat von IngoD7
..Erst jammerst du rum, dass du nur eine halbwegs lesbare Ausgabe hinbekommst, wenn du ein Krücken-ShowMessage einbaust ...Dabei ignorierst du alle Fakten, Gedanken...deine Online-Hilfe sei völlig ausgefallen...Aber gut, das ist mein Problem...


Sorry für das "Jammern". Das hatte ich aber schon (vorher) editiert. Ich war etwas erregt über deine an den Tag gelegte Ignoranz.

Zitat:

Zitat von Hansa
[...]und keiner hat etwas gesagt, was zu tun ist, um es überflüsig zu machen.

Genau das meine ich! Ich habe dir in Posting #21 genau das geliefert. Die Zauberformel lautete: Rand um das Label herum legen und Label.Refresh. Letzteres, damit das Label immer vor dem Rectangel angezeigt wird.

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 von Hansa
Und mit den dicken Rahmen, da habe ich das so gemacht wie es wohl jeder machen würde. Es muss notfalls ein gewisser Effekt provoziert werden und zwar deutlich sichtbar !

Ich weiß ja, was du meinst. Aber klares Nein - das würde eben nicht jeder so machen. Bei seriöser Verfolgung der dir gemachten Vorschläge wärst du zu einer weit "unprovozierenderen" Lösung gekommen.

Zitat:

Zitat von Hansa
Edit : ist das hier nicht klar ?[...]Das wird umgekehrt rum im OnMouseLeave erledigt !!

Natürlich war das nicht klar. Du hattest bis dahin gar nicht gesagt, dass der Rahmen auch wieder verschwinden soll. Denkbar wäre ja auch gewesen, dass alle Rahmen bestehen bleiben sollen. Angenommen das wäre so, dann wäre dein Code Murks, weil du kein zweites Mal auf ein Label fahren kannst, ohne dessen Anzeige zu versauen.

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 ...

Christian18 30. Jan 2007 21:46

Re: Rahmen um Label
 
Hallo,

ich hatte das Problem mal so gelöst:
Delphi-Quellcode:
  Label1.Canvas.Rectangle(0, 0, Label1.Width, Label1.Height);
MFG Christian18

Blackheart 30. Jan 2007 22:06

Re: Rahmen um Label
 
Zitat:

Zitat von Christian18
Hallo,

ich hatte das Problem mal so gelöst:
Delphi-Quellcode:
  Label1.Canvas.Rectangle(0, 0, Label1.Width, Label1.Height);
MFG Christian18

:thumb:

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.

Hansa 30. Jan 2007 23:14

Re: Rahmen um Label
 
Was soll denn das jetzt ? :shock: Nun gut, dann fangen wir mal überflüssigerweise an.
Zitat:

Zitat von IngoD7
Genau das meine ich! Ich habe dir in Posting #21 genau das geliefert. Die Zauberformel lautete: Rand um das Label herum legen und Label.Refresh. Letzteres, damit das Label immer vor dem Rectangel angezeigt wird.

Refresh war ein Schuss in den Ofen. :mrgreen: Völlig Sinnlos.

Zitat:

Zitat von IngoD7
..Schon vorher wurde dir gesagt.. Anstatt das zu überprüfen, kam eine unbrauchbare
Vermutungsäußerung von dir.

K.A. was damit gemeint ist.

Zitat:

Zitat von IngoD7
Natürlich war das nicht klar. Du hattest bis dahin gar nicht gesagt, dass der Rahmen auch wieder verschwinden soll. Denkbar wäre ja auch gewesen, dass alle Rahmen bestehen bleiben sollen. Angenommen das wäre so, dann wäre dein Code Murks, weil du kein zweites Mal auf ein Label fahren kannst, ohne dessen Anzeige zu versauen.

Es ging darum, erst einmal überhaupt einen Rahmen hinzukriegen.

Zitat:

Zitat von IngoD7
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.

bsClear nützt überhaupt nichts !!

Zitat:

Zitat von IngoD7
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...

Interessant ist lediglich, dass alles so geht wie erwartet. Die Farben/Koordinaten stimmen.

comprende ? -> Google :mrgreen:

runger 31. Jan 2007 05:29

Re: Rahmen um Label
 
Hallo
Delphi-Quellcode:
   label1.Canvas.Rectangle(0,0,label1.width,label1.height);
wenn du das jetzt noch in die paint Routine des Labels setzt ist alles OK.

Rainer

runger 31. Jan 2007 05:50

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:
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.
Gruss Rainer

runger 31. Jan 2007 06:00

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:
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.
Gruss Rainer

marabu 31. Jan 2007 06:38

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:
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;
So können nicht nur Label mit einem visual clue ausgestattet werden. Auch die Einbettung (Parent) darf belieb sein.

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:
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;
Freundliche Grüße

IngoD7 31. Jan 2007 09:07

Re: Rahmen um Label
 
Zitat:

Zitat von Hansa
Was soll denn das jetzt ? :shock: Nun gut, dann fangen wir mal überflüssigerweise an.
Zitat:

Zitat von IngoD7
Genau das meine ich! Ich habe dir in Posting #21 genau das geliefert. Die Zauberformel lautete: Rand um das Label herum legen und Label.Refresh. Letzteres, damit das Label immer vor dem Rectangel angezeigt wird.

Refresh war ein Schuss in den Ofen. :mrgreen: Völlig Sinnlos.

Dann hast du nicht richtig gelesen/getestet/verstanden. Du schreibst selber, dass es anfangs erst darum ging überhautpt einen Rahmen zu sehen. Dein Code aus Posting #20 zeichnete den Rahmen ja, du hast ihn nur kaum sehen können, weil er unter dem Label lag und du da die Rahmendicke noch nicht so dick hattest, dass der Rahmen untendrunter weit hervorquoll (so wie in deiner jetzigen Lösung). Daraufhin habe ich dir Code gepostet, der den Rahmen 5 Pixel entfernt um das Label zieht und der per Refresh das Label nach vorne holt, damit es nicht vom Rectangel verborgen wird. Das passiert nämlich bei deinem Code aus #20 und denen davor, wenn man ein zweites mal mit der Maus auf das Label fährt. Wohlgemerkt - das alles ohne irgendeine MouseLeave-Methode. Die war da noch gar kein Thema.
Du schreibst in #17 sogar noch selber:
Zitat:

Zitat von Hansa
Noch ein Effekt : ist der Rahmen zu sehen, dann ist die Label.Caption weg oder wohl eher überdeckt.

Die Lösung dagegen war zu dem Zeitpunkt Label.Refresh! Erst die spätere MouseLeave-Methode macht das Refresh überflüssig, weil sie die Geschichte eh nochmal neu zeichnet.

Zitat:

Zitat von Hansa
Zitat:

Zitat von IngoD7
..Schon vorher wurde dir gesagt.. Anstatt das zu überprüfen, kam eine unbrauchbare
Vermutungsäußerung von dir.

K.A. was damit gemeint ist.

Das hier ist gemeint:
onlinekater schrieb in #19
Zitat:

Zitat von Hansa
Ich denke das Rectangle zeichnet nur Linien ? Habe doch kein FillRect etc. verwendet. :shock:

Falsch gedacht.
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 von Hansa
Zitat:

Zitat von IngoD7
Natürlich war das nicht klar. Du hattest bis dahin gar nicht gesagt, dass der Rahmen auch wieder verschwinden soll. Denkbar wäre ja auch gewesen, dass alle Rahmen bestehen bleiben sollen. Angenommen das wäre so, dann wäre dein Code Murks, weil du kein zweites Mal auf ein Label fahren kannst, ohne dessen Anzeige zu versauen.

Es ging darum, erst einmal überhaupt einen Rahmen hinzukriegen.

Der Rahmen war immer da. Es gibt kein Fitzel Code in diesem Thread, der nicht einen Rahmen irgendwo gezeichnet hat! Du hast lediglich jeden Hinweis ignoriert (und/oder nicht begriffen), der den Rahmen auch wie gewünscht hätte erscheinen lassen.

Zitat:

Zitat von Hansa
Zitat:

Zitat von IngoD7
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.

bsClear nützt überhaupt nichts !!

:evil: Das erkläre ich dir jetzt nicht nochmal. Du weigerst dich, selbst nach der x-ten Erklärung des Ansatzes, dich damit seriös zu befassen. Okay, das ist deine Sache, aber dann sei wenigstens so fair und höre auf, zu provozieren mit deinen schon lange widerlegten Fehlschlüssen.

Zitat:

Zitat von Hansa
Zitat:

Zitat von IngoD7
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...

Interessant ist lediglich, dass alles so geht wie erwartet. Die Farben/Koordinaten stimmen.

So eine Aussage akzeptiere ich ja. Ich weiß dann, dass dich das eh alles nicht interessiert, sondern du eigentlich nur solange herumprobierst, bis eine Lösung halbwegs so aussieht, wie du sie sehen möchtest. Aber das hättest du auch vorher sagen können, denn schon mit Posting #10 hast du den Ansatz per Canvas.Rectangel mitgeteilt bekommen. Das hast du (un)dankend angenommen und danach ... naja, ich fange an, mich zu wiederholen.

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:

Zitat von Hansa
[comprende ? -> Google :mrgreen:

Letzte Frage, die ich nicht einmal beantwortet haben möchte: Nennst du das programmieren? -> Google :cyclops:

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:

Hansa 31. Jan 2007 11:19

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:
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;
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.

Lustig ist noch das hier :

Zitat:

Zitat von hsg
Vielleicht nimmst du nun auch noch die Koordinaten des Labels (hast ja aus deinem With rausgeschmissen :lol:

hsg, wer zuletzt lacht, lacht am besten. :lol: Der Witz ist nämlich das WITH. Wollte den ganzen
Delphi-Quellcode:
Sender as TLabel
Krempel im Rectangle weg haben. Geht aber nicht. Auch ein zweites, vom ersten with getrenntes
Delphi-Quellcode:
with (Sender as TLabel).Canvas do begin
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 Uhr.
Seite 1 von 2  1 2      

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