gpt4 book ai didi

delphi - 我应该重写什么来管理 Delphi 复合组件中的组件布局?

转载 作者:行者123 更新时间:2023-12-03 18:14:30 27 4
gpt4 key购买 nike

我正在开发一个 Delphi 组件,它由一个带有一些标签和按钮的面板组成。它可能看起来像这样:

enter image description here

或者像这样:

enter image description here

取决于属性的设置。此外,标签的布局会根据第一个标签的长度而变化。

我一直在用 TFrame 对此进行原型(prototype)设计,并在框架的 OnPaint 方法中进行布局计算。在基于 TPanel 的组件中执行此操作的正确位置是什么?或者,更准确地说,在 TCustomAdvPanel 中,这是我从中得出的。它是否像这样在 Paint 方法的重写中工作?

procedure TDateRangePicker.Paint;
const
hSpacing = 5;
begin
if FShowRefresh then
begin
btnRefresh.Visible := true;
btnRefresh.Left := Width - hSpacing - btnRefresh.Width;
btnClearDates.Left := btnRefresh.Left - hSpacing - btnClearDates.Width;
btnChooseDates.Left := btnClearDates.Left - hSpacing - btnChooseDates.Width;
end
else begin
btnRefresh.Visible := false;
btnClearDates.Left := Width - hSpacing - btnClearDates.Width;
btnChooseDates.Left := btnClearDates.Left - hSpacing - btnChooseDates.Width;
end;
lblRangeCaption.Left := hSpacing;
lblDateRange.Left := lblRangeCaption.Left + lblRangeCaption.Width + hSpacing;
inherited Paint;
end;

最佳答案

绝对不要使用Paint 方法重新定位控件。在最坏的情况下,这会一次又一次地触发 Paint 方法......因为,好吧:由于替换控件,面板需要重新绘制。 Paint 和所有等价物仅用于绘制您自己。

关于何时实现您的代码:这应该在 ShowRefresh 属性的 setter 中完成。

关于如何实现您的 ShowRefresh 属性:当然,您可以像现在一样移动控件。您也可以考虑使用 Margins (Delphi XE) 并对齐按钮和标签。然后属性 setter 将变得相当简单:

type
TDateRangePicker = class(TCustomPanel)
private
FChooseButton: TButton;
FClearButton: TButton;
FRefreshButton: TButton;
FLabel1: TLabel;
FLabel2: TLabel;
function GetLabel1Caption: String;
function GetRefreshButtonVisible: Boolean;
procedure SetLabel1Caption(const Value: String);
procedure SetRefreshButtonVisible(Value: Boolean);
public
constructor Create(AOwner: TComponent); override;
published
property RefreshButtonVisible: Boolean read GetRefreshButtonVisible
write SetRefreshButtonVisible default True;
property Label1Caption: String read GetLabel1Caption
write SetLabel1Caption;
end;

...

constructor TDateRangePicker.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FChooseButton := TButton.Create(Self);
FChooseButton.Caption := 'Choose';
FChooseButton.Align := alRight;
FChooseButton.AlignWithMargins := True;
FChooseButton.Margins.Left := 10;
FChooseButton.Parent := Self;
FClearButton := TButton.Create(Self);
FClearButton.Caption := 'Clear';
FClearButton.Align := alRight;
FClearButton.AlignWithMargins := True;
FClearButton.Margins.Left := 10;
FClearButton.Parent := Self;
FRefreshButton := TButton.Create(Self);
FRefreshButton.Caption := 'Refresh';
FRefreshButton.Align := alRight;
FRefreshButton.AlignWithMargins := True;
FRefreshButton.Margins.Left := 10;
FRefreshButton.Parent := Self;
FLabel1 := TLabel.Create(Self);
FLabel1.Caption := 'Foo caption: ';
FLabel1.Align := alLeft;
FLabel1.Layout := tlCenter;
FLabel1.Parent := Self;
FLabel2 := TLabel.Create(Self);
FLabel2.Caption := 'From 03/08/2012 to 06/06/2012';
FLabel2.Align := alLeft;
FLabel2.Layout := tlCenter;
FLabel2.Parent := Self;
end;

function TDateRangePicker.GetLabel1Caption: String;
begin
Result := FLabel1.Caption;
end;

function TDateRangePicker.GetRefreshButtonVisible: Boolean;
begin
Result := FRefreshButton.Visible;
end;

procedure TDateRangePicker.SetLabel1Caption(const Value: String);
begin
FLabel1.Caption := Value;
end;

procedure TDateRangePicker.SetRefreshButtonVisible(Value: Boolean);
begin
FRefreshButton.Visible := Value;
FRefreshButton.Left := Width;
end;

和测试例程:

procedure TMainForm.TestButtonClick(Sender: TObject);
begin
DateRangePicker1.Label1Caption := 'Test: ';
DateRangePicker1.RefreshButtonVisible := not DateRangePicker1.RefreshButtonVisible;
end;

关于delphi - 我应该重写什么来管理 Delphi 复合组件中的组件布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10919652/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com