【发布时间】:2023-03-16 15:18:01
【问题描述】:
我正在开发一个 Delphi 组件,该组件由一个带有一些标签和按钮的面板组成。它可能看起来像这样:
或者像这样:
取决于属性的设置。此外,标签的布局会根据第一个标签的长度而变化。
我一直在用 TFrame 制作原型,并在框架的 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绝对是这样做的错误位置 - 它实际上是用于 绘图 控件,而不是用于定位它们。 (它们应该定位在 Windows 本身调用Paint之前。)但是,很难说你应该把它放在哪里,因为我没有TCustomAdvPanel,因此不知道它来自什么或它有什么可用的事件。 -
TCustomAdvPanel基本上是一个非常花哨的TCustomPanel,用于本次讨论。或者至少我对此非常确定。 -
为什么不使用
btnRefresh.Anchors := [akTop,akBottom,akRight];等?