Delphi 使用自定义TToolbar组件防止将TToolbutton流式传输到DFM
我正在尝试创建一个自定义的TToolbar组件,它显示与当前任务相关的按钮 然而,我发现在设计时添加到组件的按钮存储在DFM中。我不希望按钮被存储(或在设计时可访问),因为我希望动态创建它们 (我意识到,如果csDesigning未处于ComponentState,只需添加按钮就可以防止这种情况发生,但我希望显示工具栏的设计时预览) 以下是组件代码:Delphi 使用自定义TToolbar组件防止将TToolbutton流式传输到DFM,delphi,components,Delphi,Components,我正在尝试创建一个自定义的TToolbar组件,它显示与当前任务相关的按钮 然而,我发现在设计时添加到组件的按钮存储在DFM中。我不希望按钮被存储(或在设计时可访问),因为我希望动态创建它们 (我意识到,如果csDesigning未处于ComponentState,只需添加按钮就可以防止这种情况发生,但我希望显示工具栏的设计时预览) 以下是组件代码: type TTestToolbar = class(TToolbar) private fTestButton1: TToolBu
type
TTestToolbar = class(TToolbar)
private
fTestButton1: TToolButton;
fTestButton2: TToolButton;
fTestButton3: TToolButton;
fTestButton4: TToolButton;
protected
procedure SetParent(AParent: TWinControl); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure InitializeButtons();
published
end;
constructor TTestToolbar.Create(AOwner: TComponent);
begin
inherited;
end;
destructor TTestToolbar.Destroy;
begin
FreeAndNil( fTestButton1 );
FreeAndNil( fTestButton2 );
FreeAndNil( fTestButton3 );
FreeAndNil( fTestButton4 );
inherited;
end;
procedure TTestToolbar.SetParent(AParent: TWinControl);
var
changed: Boolean;
begin
changed := AParent <> Parent;
inherited;
if changed then
InitializeButtons();
end;
procedure TTestToolbar.InitializeButtons();
begin
if Parent = nil then
exit;
FreeAndNil( fTestButton1 );
FreeAndNil( fTestButton2 );
FreeAndNil( fTestButton3 );
FreeAndNil( fTestButton4 );
fTestButton1 := TToolButton.Create(Self);
fTestButton1.Parent := Self;
fTestButton1.Caption := 'Btn 1';
fTestButton1.Hint := 'Btn 1';
fTestButton2 := TToolButton.Create(Self);
fTestButton2.Parent := Self;
fTestButton2.Caption := 'Btn 2';
fTestButton2.Hint := 'Btn 2';
fTestButton3 := TToolButton.Create(Self);
fTestButton3.Parent := Self;
fTestButton3.Caption := 'Btn 3';
fTestButton3.Hint := 'Btn 3';
fTestButton4 := TToolButton.Create(Self);
fTestButton4.Parent := Self;
fTestButton4.Caption := 'Btn 4';
fTestButton4.Hint := 'Btn 4';
end;
您可以覆盖
TTestoolbar
中的GetChildren
,以排除内部创建的按钮(fTestButton1
,…,fTestButton4
)。根据实现情况,这些按钮将显示在外部创建的按钮之前。当用户在表单设计器中混淆了内部和外部按钮时,您应该处理这种情况。谢谢Peter。这就是解决办法!
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 411
ClientWidth = 852
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object TestToolbar1: TTestToolbar
Left = 0
Top = 0
Width = 852
Height = 29
Caption = 'TestToolbar1'
TabOrder = 0
object TToolButton
Left = 0
Top = 0
Hint = 'Btn 4'
Caption = 'Btn 4'
end
object TToolButton
Left = 23
Top = 0
Hint = 'Btn 3'
Caption = 'Btn 3'
end
object TToolButton
Left = 46
Top = 0
Hint = 'Btn 2'
Caption = 'Btn 2'
end
object TToolButton
Left = 69
Top = 0
Hint = 'Btn 1'
Caption = 'Btn 1'
end
end
end