unit CsPanels;
interface
uses
SysUtils, Classes, Controls, ExtCtrls, Graphics, Forms, Types;
type
TCsBorderPosition = (cbpTop, cbpBottom, cbpLeft, cbpRight);
{ Forward-Deklarationen }
TCsCustomPanel =
class;
TCsPanel =
class;
TCsBorderStyle =
class;
TCsCustomPanel =
class(TCustomPanel)
private
FBorderLeft: TCsBorderStyle;
FBorderRight: TCsBorderStyle;
FBorderTop: TCsBorderStyle;
FBorderBottom: TCsBorderStyle;
protected
procedure SetBorderLeft(Value: TCsBorderStyle);
procedure SetBorderRight(Value: TCsBorderStyle);
procedure SetBorderBottom(Value: TCsBorderStyle);
procedure SetBorderTop(Value: TCsBorderStyle);
procedure DrawBorder(Style: TCsBorderStyle; Position: TCsBorderPosition);
function GetBorderStartPosition(Position: TCsBorderPosition): TPoint;
function GetBorderEndPosition(Position: TCsBorderPosition): TPoint;
property BorderLeft: TCsBorderStyle
read FBorderLeft
write SetBorderLeft;
property BorderRight: TCsBorderStyle
read FBorderRight
write SetBorderRight;
property BorderTop: TCsBorderStyle
read FBorderTop
write SetBorderTop;
property BorderBottom: TCsBorderStyle
read FBorderBottom
write SetBorderBottom;
public
constructor Create(AOwner: TComponent);
override;
destructor Destroy;
override;
procedure Loaded;
override;
procedure Paint;
override;
published
{ Published-Deklarationen }
end;
TCsPanel =
class(TCsCustomPanel)
published
property BorderLeft;
property BorderRight;
property BorderTop;
property BorderBottom;
property Color;
property Align;
property ParentBackground;
property Font;
end;
TCsBorderStyle =
class(TPersistent)
private
FColor: TColor;
FWidth: Byte;
FVisible: Boolean;
FOwner: TCsCustomPanel;
protected
procedure SetColor(Value: TColor);
procedure SetWidth(Value: Byte);
procedure SetVisible(Value: Boolean);
public
constructor Create(AOwner: TCsCustomPanel);
overload;
procedure Assign(Source: TPersistent);
override;
procedure AssignTo(Dest: TPersistent);
override;
published
property Color: TColor
read FColor
write FColor;
property Width: Byte
read FWidth
write FWidth;
property Visible: Boolean
read FVisible
write FVisible;
end;
implementation
{ TCsCustomPanel ------------------------------------------------------------- }
constructor TCsCustomPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
BevelInner := bvNone;
BevelOuter := bvNone;
BorderStyle := bsNone;
ShowCaption := False;
FBorderLeft := TCsBorderStyle.Create(Self);
FBorderRight := TCsBorderStyle.Create(Self);
FBorderTop := TCsBorderStyle.Create(Self);
FBorderBottom := TCsBorderStyle.Create(Self);
end;
destructor TCsCustomPanel.Destroy;
begin
FreeAndNil(FBorderLeft);
FreeAndNil(FBorderRight);
FreeAndNil(FBorderTop);
FreeAndNil(FBorderBottom);
inherited Destroy;
end;
procedure TCsCustomPanel.SetBorderLeft(Value: TCsBorderStyle);
begin
FBorderLeft.Assign(Value);
Invalidate;
end;
procedure TCsCustomPanel.SetBorderRight(Value: TCsBorderStyle);
begin
FBorderRight.Assign(Value);
Invalidate;
end;
procedure TCsCustomPanel.SetBorderBottom(Value: TCsBorderStyle);
begin
FBorderBottom.Assign(Value);
Invalidate;
end;
procedure TCsCustomPanel.SetBorderTop(Value: TCsBorderStyle);
begin
FBorderTop.Assign(Value);
Invalidate;
end;
procedure TCsCustomPanel.Loaded;
begin
inherited Loaded;
//Repaint;
end;
procedure TCsCustomPanel.DrawBorder(Style: TCsBorderStyle;
Position: TCsBorderPosition);
var
Coord: TPoint;
begin
if Style.Visible
then
begin
Canvas.Pen.Color := Style.Color;
Canvas.Pen.Width := Style.Width;
Canvas.PenPos := GetBorderStartPosition(Position);
Coord := GetBorderEndPosition(Position);
Canvas.LineTo(Coord.X, Coord.Y);
end;
end;
function TCsCustomPanel.GetBorderStartPosition(Position: TCsBorderPosition): TPoint;
begin
case Position
of
cbpTop:
begin
Result.X := 0;
Result.Y := 0;
end;
cbpBottom:
begin
Result.X := 0;
Result.Y := Height;
end;
cbpLeft:
begin
Result.X := 0;
Result.Y := 0;
end;
cbpRight:
begin
Result.X := Width;
Result.Y := 0;
end;
end;
end;
function TCsCustomPanel.GetBorderEndPosition(Position: TCsBorderPosition): TPoint;
begin
case Position
of
cbpTop:
begin
Result.X := Width;
Result.Y := 0;
end;
cbpBottom:
begin
Result.X := Width;
Result.Y := Height;
end;
cbpLeft:
begin
Result.X := 0;
Result.Y := Height;
end;
cbpRight:
begin
Result.X := Width;
Result.Y := Height;
end;
end;
end;
procedure TCsCustomPanel.Paint;
begin
inherited Paint;
DrawBorder(FBorderLeft, cbpLeft);
DrawBorder(FBorderRight, cbpRight);
DrawBorder(FBorderTop, cbpTop);
DrawBorder(FBorderBottom, cbpBottom);
end;
{ TCsBorderStyle ------------------------------------------------------------- }
constructor TCsBorderStyle.Create(AOwner: TCsCustomPanel);
begin
//inherited Create;
FOwner := AOwner;
end;
procedure TCsBorderStyle.Assign(Source: TPersistent);
begin
if Source
is TCsBorderStyle
then
begin
FColor := TCsBorderStyle(Source).Color;
FWidth := TCsBorderStyle(Source).Width;
FVisible := TCsBorderStyle(Source).Visible;
end
else
inherited Assign(Source);
end;
procedure TCsBorderStyle.AssignTo(Dest: TPersistent);
begin
if Dest
is TCsBorderStyle
then
begin
TCsBorderStyle(Dest).Color := FColor;
TCsBorderStyle(Dest).Width := FWidth;
TCsBorderStyle(Dest).Visible := FVisible;
end
else
inherited AssignTo(Dest);
end;
procedure TCsBorderStyle.SetColor(Value: TColor);
begin
FColor := Value;
if Assigned(FOwner)
then
FOwner.Invalidate;
end;
procedure TCsBorderStyle.SetWidth(Value: Byte);
begin
FWidth := Value;
if Assigned(FOwner)
then
FOwner.Invalidate;
end;
procedure TCsBorderStyle.SetVisible(Value: Boolean);
begin
FVisible := Value;
if Assigned(FOwner)
then
FOwner.Invalidate;
end;
end.