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 TPaintBox dauerhaft vor andere PaintBox setzen (https://www.delphipraxis.net/3270-tpaintbox-dauerhaft-vor-andere-paintbox-setzen.html)

janjan 4. Mär 2003 09:35


TPaintBox dauerhaft vor andere PaintBox setzen
 
Ich hab mal wieder ein kleines Problem mit meinen selbstgeschriebenen Komponente:

Ich hab in meinem Programm eine große Anzeige auf der die meisten Daten angezeigt werden. Abgeleitet ist dieses Control von TPaintBox. Bisher hab ich zur Anzeige der restlichen Daten TStaticTexts benutzt, da diese immer vor der PaintBox angezeigt werden.

Da mit die StaticTexts grafisch aber nich so gut gefallen ahebn, hab ich eigene geschrieben, die aber nicht von TStaticText sondern auch von TPaintBox abgeleitet sind.

Das Problem ist jetzt, das bei überlagerung der beiden Komponenten meine LabelKomponenten unter dem großen Anzeige verschwinden.

Kann ich das irgendwie verhindern oder muss ich das Label von einer anderen Komponente ableiten? Ich habs mit TStaticText probiert, das bietet aber leider keine Paint Routine.

Mein Favorit wäre eine Komponente von TStaticText abgeleitet, die irgenwie auf WM_Paint reagiert und da einen farbigen Rahmen von 1 pixel Breite um das Label malt.

Hier noch der Code für meine Labels:
Delphi-Quellcode:
unit milLabel;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls, inifiles, ExtCtrls;

type
  TTestlabel = class(TPaintBox)
  protected
    FCaption:   String;
    FInnerColor: TColor;
    FOuterColor: TColor;
    FFont:      TFont;
    procedure FSetCaption(S: string);
    procedure FSetInnerColor(C: TColor);
    procedure FSetOuterColor(C: TColor);

  public
    { Public-Deklarationen }
    procedure   Paint;  override;
    constructor Create(AOwner: TComponent); override;
  published
   { Published-Deklarationen }
    property Caption:   String read FCaption   write FSetCaption;
    property InnerColor: TColor read FInnerColor write FSetInnerColor;
    property OuterColor: TColor read FOuterColor write FSetOuterColor;
  end;

procedure Register;

implementation

procedure TTestLabel.FSetCaption(s: String);
begin
  FCaption:=S;
  Paint;
end;

procedure TTestLabel.FSetInnerColor(c: TColor);
begin
  FInnerColor:=C;
  Paint;
end;

procedure TTestLabel.FSetOuterColor(c: TColor);
begin
  FOuterColor:=C;
  Paint;
end;

constructor TTestLabel.Create(AOwner: TComponent);
begin
  FInnerColor:=clBlack;
  FOuterColor:=clBlue;
  FCaption:='TestLabel';
  inherited Create(AOwner);
  Height:=23;
  Width:= 73;
  Font.Name:='Tahoma';
  Font.Height:=-14;
  Font.Style:=[fsBold];
end;

procedure TTestLabel.Paint;
begin
  Canvas.Font:=Font;
  with Canvas do
    begin
      Pen.Color:=FOuterColor;
      Brush.Color:=FInnerColor;
      Rectangle(0,0,Width,Height);
      Font.Color:=clWhite;
      TextOut( 4,(Height div 2)-(TextHeight('#+*%/') div 2),FCaption);
    end;
end;

procedure Register;
begin
  RegisterComponents('Beispiele', [TTestLabel]);
end;

end.

jbg 4. Mär 2003 10:27

Du musst zuerst die große Fläche erzeugen und danach die PaintBox-Labels. Oder du nutzt die Methode BringToFront für jedes PaintBox-Label.

janjan 4. Mär 2003 10:29

Auf die Idee bin ich auch schon gekommen, aber das klappt nicht :(

jbg 4. Mär 2003 10:45

Du könntest die Komponente von TCustomControl ableiten. Diese Klasse besitzt eine Cannvas und ist von TWinControl abgeleitet.

janjan 4. Mär 2003 10:56

Vieln Dank, das scheint zu klappen.


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