【问题标题】:Show notification numbers on tab items在选项卡项目上显示通知编号
【发布时间】:2014-12-20 06:09:43
【问题描述】:
我有一个面向标签的 Firemonkey 多平台应用程序。我有一些标签可能有单独的通知。我知道移动应用程序的通知中心,但在我自己的应用程序内部,我不确定如何在标签项上执行类似的指示。
例如,我有一个带有 4 个标签的 TTabControl。每个选项卡都有一个自定义图标。在图标旁边的每个选项卡上,我想显示一个通知指示器,类似于使用通知时应用程序图标上显示的那个。
类似这样的:
如何在 iOS 和 Android 的选项卡上显示这样的指示器?
我尝试在其上放置标签,但无法知道如何在针对不同平台调整大小/重新缩放/重新排列表单时以编程方式定位该标签。如果TTabItem 有Position 和Size 属性,我可以一起放置这样的标签。但是没有它,我如何定位与此选项卡相关的任何内容?
PS - 请原谅我可怕的图形:-)
【问题讨论】:
标签:
delphi
notifications
icons
firemonkey
delphi-xe7
【解决方案1】:
我想出了如何在标签项上放置标签。这有点草率,但它确实有效。首先,TTabControl.TabPosition 不能是PlatformDefault。它必须是 Top 或 Bottom。其次,标签必须与TTabControl 位于同一父控件中。然后,像这样实现一个函数:
procedure TfrmMain.PositionNotifyLabel(ALabel: TLabel; ATabItem: TTabItem);
var
TabLeft, TabTop: Single;
X: Integer;
T: TTabItem;
TabControl: TTabControl;
begin
TabControl:= ATabItem.TabControl;
//Calculate left position of tab
TabLeft:= 0;
for X := 0 to TabControl.TabCount-1 do begin
T:= TabControl.Tabs[X];
if T = ATabItem then Break;
TabLeft:= TabLeft + T.Width;
end;
case TabControl.TabPosition of
TTabPosition.Top: begin
TabTop:= 0;
end;
TTabPosition.Bottom: begin
TabTop:= TabControl.Height - TabControl.TabHeight;
end;
else begin
//Not Supported
TabTop:= 0;
end;
end;
//Calculate label width based on tab width
ALabel.Width:= ATabItem.Width / 3;
//Position label to calculated Left/Top positions
ALabel.Position.X:= TabLeft + ATabItem.Width - ALabel.Width;
ALabel.Position.Y:= TabTop;
ALabel.BringToFront;
end;
在表单显示和表单调整大小时调用此函数,如下所示:
PositionNotifyLabel(lblCartNotify, tabCart);