2016-10-27 3 views
2

SITUATIONDelphi Androide Action Bar

Ich schaffe eine App für einen Kunden erstellen und mein Chef hat mir gesagt, eine Aktionsleiste mit einem Knopf hinzufügen, die ein paar andere Dinge anzeigt. Dieser Screenshot wird klären:

enter image description here

Die dunkelgrüne Balken oben mit (und der weiße Text) ist ein TLayout bei Top mit einem ColorBox ausgerichtet sind. Auf der rechten Seite können Sie sehen, dass ich eine Schaltfläche habe und wenn Sie darauf klicken, sehen Sie eine TListBox mit einigen Optionen. Wenn der Benutzer auf sie klickt, wird eine Aktion ausgeführt.


PROBLEM

Die TListBox nicht sichtbar ist, wenn das Formular erstellt. Wenn Sie auf die Schaltfläche klicken, erscheint die Box dank diesem Code:

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; 

Dieser Code funktioniert gut, weil, wenn Sie auf die Schaltfläche klicken, wird der TListBox erscheint/verschwindet, aber das ist nicht genug. Ich möchte, dass meine Box auf 2 Arten verschwinden:

  1. Wenn ich klicken Sie erneut auf die Schaltfläche (Lösung, die ich oben umgesetzt haben)
  2. Wenn ich irgendwo klicken Sie auf dem Bildschirm (mit Ausnahme der Taste natürlich)

Wie kann ich den zweiten Fall implementieren?

Hinweis: habe ich einen Screenshot von einem 32-Bit-exe statt einen Screenshot von meinem Android-Testgerät, aber es ist das gleiche.

Antwort

2

yep, Verhalten von FMX-Komponenten sind auf verschiedenen Plattformen unterschiedlich, das ist kein Geheimnis.

Alternative Lösung: Verwenden Sie TComboBox - es hat bereits Verhalten, das Sie benötigen (click somewhere in the screen). Siehe Bildschirm Beispiel:

enter image description here

Antwort auf Ihre Frage: ändern HitTest Eigenschaft auf False für TListBox und für alle anderen Steuerelemente auf dem Formular und tun Kontrolle über MouseDown-. Keine gute Idee (Halloween-Lösung).

Codebeispiel:

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. 

und Form:

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 

auf DX10 getestet (ohne Update 1) und Android 5.1.1