Delphi android创建操作栏

时间:2016-10-27 22:00:52

标签: android delphi firemonkey

状况

我正在为客户创建一个应用程序,我的老板告诉我添加一个操作栏,其中包含一个显示其他内容的按钮。此屏幕截图将阐明:

enter image description here

上面的深绿色条(和白色文本)是一个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会出现/消失,但这还不够。我想让我的盒子以两种方式消失:

  1. 当我再次点击按钮(我已在上面实施的解决方案)
  2. 当我点击屏幕中的某个位置时(当然不包括按钮)
  3. 如何实施第二种情况?

    注意:我在我的Android测试设备上放了一个32位exe的截图,而不是截图,但它也是一样的。

1 个答案:

答案 0 :(得分:2)

是的,FMX组件的行为在不同平台上有所不同,这不是秘密。

替代解决方案:使用TComboBox - 它已经具有您需要的行为(click somewhere in the screen)。见屏幕样本:

enter image description here

回答你的问题:对于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

上测试