![]() |
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. |
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.
|
Auf die Idee bin ich auch schon gekommen, aber das klappt nicht :(
|
Du könntest die Komponente von TCustomControl ableiten. Diese Klasse besitzt eine Cannvas und ist von TWinControl abgeleitet.
|
Vieln Dank, das scheint zu klappen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:50 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