状况
我正在为客户创建一个应用程序,我的老板告诉我添加一个操作栏,其中包含一个显示其他内容的按钮。此屏幕截图将阐明:
上面的深绿色条(和白色文本)是一个TLayout,在顶部与ColorBox对齐。在右边你可以看到我有一个按钮,当你点击它时,你会看到一个带有一些选项的TListBox。当用户点击它们时,会执行一个操作。
问题
表单创建时,TListBox不可见。当您单击按钮时,由于以下代码,该框出现:
procedure TForm1.ButtonMenuClick(Sender: TObject);
begin
//oflowmen is the TListBox
oflowmen.Visible := not oflowmen.Visible;
if oflowmen.Visible then
begin
oflowmen.ApplyStyleLookup;
oflowmen.RealignContent;
end;
end;
此代码工作正常,因为当您单击按钮时,TListBox会出现/消失,但这还不够。我想让我的盒子以两种方式消失:
如何实施第二种情况?
注意:我在我的Android测试设备上放了一个32位exe的截图,而不是截图,但它也是一样的。
答案 0 :(得分:2)
是的,FMX组件的行为在不同平台上有所不同,这不是秘密。
替代解决方案:使用TComboBox - 它已经具有您需要的行为(click somewhere in the screen
)。见屏幕样本:
回答你的问题:对于TListBox和表单上的所有其他控件,将HitTest属性更改为False,并控制MouseDown。不太好主意(万圣节解决方案)。
代码示例:
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts, FMX.ListBox, FMX.StdCtrls,
FMX.Controls.Presentation, FMX.TabControl;
type
TForm1 = class(TForm)
ToolBar1: TToolBar;
ToolBar2: TToolBar;
Button1: TButton;
ComboBox1: TComboBox;
ListBox1: TListBox;
Button2: TButton;
TabControl1: TTabControl;
TabItem1: TTabItem;
TabItem2: TTabItem;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
private
FLIstBoxVisible: Boolean;
procedure SetListBoxVisible(const Value: Boolean);
public
property ListBoxVisible: Boolean read FLIstBoxVisible write SetListBoxVisible;
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
ComboBox1.DropDown;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ListBoxVisible := True;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
if ListBoxVisible then
ListBoxVisible := False;
end;
procedure TForm1.SetListBoxVisible(const Value: Boolean);
var
I: Integer;
begin
for I := 1 to Form1.ComponentCount - 1 do
begin
if Form1.Components[I] = ListBox1 then
Continue;
(Form1.Components[I] as TControl).HitTest := not Value;
if Value then
(Form1.Components[I] as TControl).OnMouseDown := FormMouseDown
else
(Form1.Components[I] as TControl).OnMouseDown := nil;
end;
if Value then
ListBox1.RealignContent;
FLIstBoxVisible := Value;
ListBox1.Visible := Value;
end;
end.
并形成:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 480
ClientWidth = 640
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
OnMouseDown = FormMouseDown
DesignerMasterStyle = 0
object ToolBar1: TToolBar
Size.Width = 640.000000000000000000
Size.Height = 40.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object ToolBar2: TToolBar
Size.Width = 640.000000000000000000
Size.Height = 40.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object Button1: TButton
Align = Left
Size.Width = 80.000000000000000000
Size.Height = 40.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
Text = 'ComboBox'
OnClick = Button1Click
end
object Button2: TButton
Align = Right
Position.X = 560.000000000000000000
Size.Width = 80.000000000000000000
Size.Height = 40.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
Text = 'ListBox'
OnClick = Button2Click
end
end
object ComboBox1: TComboBox
Align = Left
Items.Strings = (
'item 1'
'item 2'
'item 3'
'item 4'
'item 5')
Position.Y = 40.000000000000000000
Size.Width = 640.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
end
end
object ListBox1: TListBox
HitTest = False
Position.X = 224.000000000000000000
Position.Y = 128.000000000000000000
TabOrder = 1
Visible = False
DisableFocusEffect = True
Items.Strings = (
'Item 1'
'Item 2'
'Item 3'
'Item 4')
DefaultItemStyles.ItemStyle = ''
DefaultItemStyles.GroupHeaderStyle = ''
DefaultItemStyles.GroupFooterStyle = ''
Viewport.Width = 196.000000000000000000
Viewport.Height = 196.000000000000000000
end
object TabControl1: TTabControl
Align = Client
Size.Width = 640.000000000000000000
Size.Height = 440.000000000000000000
Size.PlatformDefault = False
TabIndex = 0
TabOrder = 2
TabPosition = PlatformDefault
object TabItem1: TTabItem
CustomIcon = <
item
end>
IsSelected = True
Size.Width = 70.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
StyleLookup = ''
TabOrder = 0
Text = 'TabItem1'
OnMouseDown = FormMouseDown
end
object TabItem2: TTabItem
CustomIcon = <
item
end>
IsSelected = False
Size.Width = 70.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
StyleLookup = ''
TabOrder = 0
Text = 'TabItem2'
OnMouseDown = FormMouseDown
end
end
end
在DX10(没有更新1)和Android 5.1.1
上测试