Einzelnen Beitrag anzeigen

Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#1

Formular hervorheben durch Rahmen

  Alt 19. Jul 2010, 08:28
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
Frank Reim

Geändert von mkinzler (19. Jul 2010 um 10:10 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat