如何删除listview搜索框中的清除按钮?

时间:2016-03-06 05:36:22

标签: android delphi listview firemonkey

我想在 ListView 搜索框中动态添加 TEditButton ,所以我这样做了:

ListView                         := TListView.Create(Self);    
ListView.Parent                  := Self;   
ListView.Name                    := 'hello'; 
ListView.Height                  := 369;  
ListView.Width                   := 369; 
ListView.Align                   := TAlignLayout.Bottom; 
ListView.SearchVisible           := True; 
ListView.BeginUpdate;    

for i := 0 to ListView.controls.Count - 1 do
begin   
  if ListView.controls[i].ClassType = TSearchBox then 
  begin    
    SearchBox := TSearchBox(ListView.controls[i]);
  end; 
end;  

OKbtn := TEditButton.Create(SearchBox);  
OKbtn.Parent := SearchBox;    
OKbtn.Text   := 'OK';  
OKbtn.Width  := 30;   

SearchBox.AddObject(OKbtn);
ListView.EndUpdate;    

但问题是clear button在编辑搜索框时也会出现。如何删除搜索框右侧的清除按钮(X)?

2 个答案:

答案 0 :(得分:11)

enter image description here

SearchBox是TEdit的后代,使用FireMonkey控件样式。

在表单上放置一个TEdit并打开它的StyleLookup属性:

enter image description here

您可以看到已有不同的stlyes可用。 所以我们想要改变SearchBox的StyleLookup。

由于SearchBox是ListView控件的私有成员(FSearchEdit),因此您无法直接访问它。

您可以创建自己的ListView控件,该控件是TListView(TListViewBase)的后代,也可以使用类助手。我选择后者。

TListViewHelper = class helper for TListViewBase
private
  function GetClearButton: Boolean;
  procedure SetClearButton(const Value: Boolean);
public
  property ShowSearchEditClearButton: Boolean read GetClearButton write SetClearButton;
end;

{ TListViewHelper }

function TListViewHelper.GetClearButton: Boolean;
begin
  Result := Self.FSearchEdit.StyleLookup = ''; // default style
end;

procedure TListViewHelper.SetClearButton(const Value: Boolean);
begin
  if Value then
    Self.FSearchEdit.StyleLookup := '' // default style
  else
    Self.FSearchEdit.StyleLookup := 'editstyle';
end;

在FormCreate中,我们可以调用ListView1.ShowSearchEditClearButton := False;并且清除按钮消失了。

enter image description here

然而放大镜玻璃图标也消失了,因为它不是我们设置为editstyle的{​​{1}}样式的一部分。

要获得图标,我们必须创建自己的Style,它有一个放大镜玻璃图标,但没有清晰的按钮。

在表格上放一个TEdit,右键单击它,然后选择StyleLookup

enter image description here

我们现在在StyleBook编辑器中,可以访问控件布局。

将TActiveStyleObject添加到结构中,将其重命名为edit customized style enter image description here

更改TActiveStyleObject的magnifierglass位图。

在BitmapLinks-Editor中找到放大镜玻璃图标并选择它(对于ActiveLink和SourceLink)。

enter image description here

现在,您的文字会与图标重叠。

enter image description here

要解决此问题,您必须将内容的左边距(目前设置为2px)更改为更高的20。

enter image description here

enter image description here

现在,您可以在创建样式时以及在表单“StyleBook”中删除表单上的编辑。

打开样书并将新样式的ActiveLink重命名为StyleName

enter image description here

保存并在您的classhelper函数更改

searcheditstylenoclearbtn

Self.FSearchEdit.StyleLookup := 'editstyle';

现在清除按钮消失了。

enter image description here

如果您不想轻松创建自己的searchitstylenoclearbtn,可以将以下代码保存为searchitstylenoclearbtn.style并将其加载到StyleBook编辑器中。

enter image description here

Self.FSearchEdit.StyleLookup := 'searcheditstylenoclearbtn';

答案 1 :(得分:5)

如果您不想在应用中的所有搜索框中看到Clearbutton,则可以修改FMX.Searchbox.Style.pas

  1. 在fmx文件夹中查找FMX.Searchbox.Style.pas(默认情况下,C:\Program Files (x86)\Embarcadero\Studio\{your_version, e.g.17.0}\source\fmx\FMX.SearchBox.Style.pas并将文件复制到项目文件夹(your_application.dpr文件附近)
  2. 在新文件中查找和评论下一行:
  3. 对于Delphi Seattle:

    procedure TStyledSearchBox.RealignButtons;
    begin
      if (LeftLayout <> nil) and (FMagGlass <> nil) then
        LeftLayout.Width := FMagGlass.Width;
      if (ButtonsLayout <> nil) and (FClearButton <> nil) then
        //if Model.Text.IsEmpty then
          ButtonsLayout.Width := 0
        //else
        //  ButtonsLayout.Width := FClearButton.Width;
    end;
    

    对于XE7:

    procedure TStyledSearchBox.DoChangeTracking;
    begin
      inherited;
      if (ButtonsLayout <> nil) and (FClearButton <> nil) then
        //if Model.Text.IsEmpty then
          ButtonsLayout.Width := 0
        //else
        //  ButtonsLayout.Width := FClearButton.Width;
    end;
    

    正如您所看到的,代码根据Delphi版本没有太大差异,对于您自己可以找到的其他版本。

    1. 编译并启动应用程序。
    2. 这些代码更改对所有平台都有效。