我尝试使用TShape在TEdit字段周围绘制彩色边框。我定义了以下组件:
type TGEdit = class(TEdit)
private
m_shape : TShape;
protected
procedure setBorderColor( brd_col : TColor );
procedure setBorderWidth( brd_wid : integer );
public
constructor create(AOwner : TComponent); override;
destructor destroy(); override;
published
property borderColor : TColor read m_border_color write setBorderColor default clBlack;
property borderWidth : integer read m_border_width write setBorderWidth default 1;
end;
在构造函数中定义TShape对象。
constructor TGEdit.create(AOwner : TComponent);
begin
inherited;
Self.BorderStyle:= bsNone;
m_border_color := clBlack;
m_border_width := 1;
m_shape := TShape.Create(AOwner);
m_shape.Parent := Self.Parent;
m_shape.Shape := stRectangle;
m_shape.Width := Self.Width+2*m_border_width;
m_shape.Height := Self.Height+2*m_border_width;
m_shape.Left := Self.Left-m_border_width;
m_shape.Top := self.Top-m_border_width;
m_shape.Brush.Style := bsClear;
m_shape.Pen.Color := m_border_color;
m_shape.Pen.Style := psSolid;
end;
destructor TGNumberEdit.destroy();
begin
m_shape.Free();
inherited;
end;
定义更改边框颜色和宽度的步骤
procedure TGEdit.setBorderColor( brd_col : TColor );
begin
if m_border_color = brd_col then
exit;
m_border_color := brd_col;
m_shape.Pen.Color := m_border_color;
end;
procedure TGEdit.setBorderWidth( brd_wid : integer );
begin
if (m_border_width = brd_wid) or (brd_wid < 0) then
exit;
m_border_width := brd_wid;
m_shape.Pen.Width := m_border_width;
end;
但是当我将组件放在窗体上时,Shape没有绘制。我的代码中的错误在哪里?
答案 0 :(得分:6)
TShape
是一个TGraphicControl
派生控件,因此永远不会出现在除TWinControl
以外的Parent
派生控件之上。
您的TGEdit
构造函数中包含错误。 Self.Parent
在构造函数中为零,因此您为Parent
分配了一个TShape
,因此它永远不可见。
如果您希望TShape
与Parent
具有相同的TGEdit
,则需要覆盖虚拟SetParent()
方法,该方法在构造完成后调用。您还必须覆盖虚拟SetBounds()
方法,以确保TShape
移动时TGEdit
移动,例如:
type
TGEdit = class(TEdit)
...
protected
...
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
procedure SetParent(AParent: TWinControl); override;
...
end;
procedure TGEdit.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
inherited;
if m_shape <> nil then
m_shape.SetBounds(Self.Left - m_border_width, Self.Top - m_border_width, Self.Width + (2*m_border_width), Self.Height + (2*m_border_width));
end;
procedure TGEdit.SetParent(AParent: TWinControl);
begin
inherited;
if m_shape <> nil then
m_shape.Parent := Self.Parent;
end;
现在,有了所有这些说法,还有另一种解决方案 - 从TCustomPanel
派生你的组件,让它在自己的基础上创建一个TEdit
。您可以根据需要设置面板的颜色,边框等。