gpt4 book ai didi

android - Delphi android 创建操作栏

转载 作者:搜寻专家 更新时间:2023-11-01 09:40:19 27 4
gpt4 key购买 nike

情况

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

enter image description here

上面的深绿色条(和白色文本)是一个在 顶部 与 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 测试设备的屏幕截图,但它们是一回事。

最佳答案

是的,FMX 组件的行为在不同的平台上是不同的,这不是 secret 。

替代解决方案:使用 TComboBox —— 它已经具有您需要的行为(单击屏幕中的某处)。查看屏幕示例:

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 上测试

关于android - Delphi android 创建操作栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40294907/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com