AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rahmen um Label

Ein Thema von Hansa · begonnen am 29. Jan 2007 · letzter Beitrag vom 5. Mär 2009
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
IngoD7

Registriert seit: 16. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#31

Re: Rahmen um Label

  Alt 30. Jan 2007, 21:38
Zitat von Hansa:
mach mal etwas halblang. Was soll das hier denn :

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 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 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 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 ...
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#32

Re: Rahmen um Label

  Alt 30. Jan 2007, 21:46
Hallo,

ich hatte das Problem mal so gelöst:
  Label1.Canvas.Rectangle(0, 0, Label1.Width, Label1.Height); MFG Christian18
  Mit Zitat antworten Zitat
Blackheart

Registriert seit: 4. Mai 2005
846 Beiträge
 
Delphi 7 Enterprise
 
#33

Re: Rahmen um Label

  Alt 30. Jan 2007, 22:06
Zitat von Christian18:
Hallo,

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


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.
Blackheart
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#34

Re: Rahmen um Label

  Alt 30. Jan 2007, 23:14
Was soll denn das jetzt ? Nun gut, dann fangen wir mal überflüssigerweise an.
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. Völlig Sinnlos.

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 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 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 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
Gruß
Hansa
  Mit Zitat antworten Zitat
runger
(Gast)

n/a Beiträge
 
#35

Re: Rahmen um Label

  Alt 31. Jan 2007, 05:29
Hallo
   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
  Mit Zitat antworten Zitat
runger
(Gast)

n/a Beiträge
 
#36

Re: Rahmen um Label

  Alt 31. Jan 2007, 05:50
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
  Mit Zitat antworten Zitat
runger
(Gast)

n/a Beiträge
 
#37

Re: Rahmen um Label

  Alt 31. Jan 2007, 06:00
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#38

Re: Rahmen um Label

  Alt 31. Jan 2007, 06:38
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
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 16. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#39

Re: Rahmen um Label

  Alt 31. Jan 2007, 09:07
Zitat von Hansa:
Was soll denn das jetzt ? Nun gut, dann fangen wir mal überflüssigerweise an.
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. 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 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 von Hansa:
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 von Hansa:
Ich denke das Rectangle zeichnet nur Linien ? Habe doch kein FillRect etc. verwendet.
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 von Hansa:
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 von Hansa:
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 !!
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 von Hansa:
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.

Amen!

Zitat von Hansa:
[comprende ? -> Google
Letzte Frage, die ich nicht einmal beantwortet haben möchte: Nennst du das programmieren? -> Google

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.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#40

Re: Rahmen um Label

  Alt 31. Jan 2007, 11:19
@Ingo : vielen Dank für den unnützen langen Beitrag.

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 von hsg:
Vielleicht nimmst du nun auch noch die Koordinaten des Labels (hast ja aus deinem With rausgeschmissen
hsg, wer zuletzt lacht, lacht am besten. Der Witz ist nämlich das WITH. Wollte den ganzen Sender as TLabel Krempel im Rectangle weg haben. Geht aber nicht. Auch ein zweites, vom ersten with getrenntes 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


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 08:54 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