Hi,
ich habe das Problem, dass ich Formulare optisch so kennzeichnen muss, dass man sie schnell zuordnen kann.
Nun wollte ich einen farbigen Rahmen zeichnen, es klappt aber nicht ganz.
Kleiner Versuch:
Delphi-Quellcode:
type
TForm1 =
class(TForm)
Panel1: TPanel;
private
FFrameColor: TColor;
FFrameSize: Integer;
procedure DrawFrame;
procedure SetFrameColor(Value: TColor);
procedure SetFrameSize(Value: Integer);
protected
function GetClientRect: TRect;
override;
procedure Paint;
override;
public
constructor Create(AOwner: TComponent);
override;
property FrameColor: TColor
read FFrameColor
write SetFrameColor
default
clGreen;
property FrameSize: Integer
read FFrameSize
write SetFrameSize
default 0;
end;
...
constructor TForm1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FrameSize := 2;
FrameColor := clRed;
end;
procedure TForm1.DrawFrame;
var
r: TRect;
i: Integer;
begin
r := Rect( 0, 0, ClientWidth + FrameSize, ClientHeight + FrameSize);
Canvas.Brush.Color := FFrameColor;
Canvas.FrameRect(r);
if FrameSize > 1
then
for I := 2
to FrameSize
do
begin
InflateRect(r, -1, -1);
with Canvas
do
FrameRect(r);
end;
end;
function TForm1.GetClientRect: TRect;
begin
Result :=
inherited GetClientRect;
if FFrameSize > 0
then
begin
//InflateRect(Result, -FrameSize, -FrameSize);
Inc(Result.Left, FFrameSize);
Inc(Result.Top, FFrameSize);
Dec(Result.Right, FFrameSize);
Dec(Result.Bottom, FFrameSize);
end;
end;
procedure TForm1.Paint;
begin
inherited;
DrawFrame;
end;
procedure TForm1.SetFrameColor(Value: TColor);
begin
if FFrameColor <> Value
then
begin
FFrameColor := Value;
Invalidate;
end;
end;
procedure TForm1.SetFrameSize(Value: Integer);
begin
if Value < 1
then
Value := 1
else
if Value > 4
then
Value := 4;
if FFrameSize <> Value
then
begin
FFrameSize := Value;
Invalidate;
end;
end;
Wenn ich jetzt ein Panel ins Formular setze, so wird der Rahmen Links und Oben vom Panel überdeckt.
Weiterhin ist ungünstig, dass beim Einblenden der Scrollbox auch die anderen Linien verschwinden, bis man halt ans Ende scrollt.
Wie kann ich jetzt einen Rahmen zeichnen, der immer an allen Seiten gezeigt wird.
Da ich das in ein Basisformular packen muss, nützen mir auch Lösungen mit einem zusätzlichen Panel etc. nichts.
Frank