【问题标题】:Delphi android create action barDelphi android 创建操作栏
【发布时间】:2016-10-27 22:00:52
【问题描述】:

情况

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

上面的深绿色条(和白色文本)是在 Top 与 ColorBox 对齐的 TLayout。在右边你可以看到我有一个按钮,当你点击它时,你会看到一个带有一些选项的 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. 当我点击屏幕上的某处时(当然不包括按钮)

如何实现第二种情况?

注意:我放的是 32 位 exe 的屏幕截图,而不是我的 android 测试设备的屏幕截图,但它是一样的。

【问题讨论】:

    标签: android delphi firemonkey


    【解决方案1】:

    是的,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 上测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      相关资源
      最近更新 更多