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

Nan*_*Bag 9 delphi android listview firemonkey

我想动态地将一个TEditButton放在ListView的搜索框中,所以我这样做了:

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;    
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*isB 11

在此输入图像描述

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

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

在此输入图像描述

您可以看到已有不同的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;
Run Code Online (Sandbox Code Playgroud)

 

{ 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;
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

然而放大镜玻璃图标也消失了,因为它不是editstyle我们设定的Style的一部分StyleLookup.

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

在表单上放一个TEdit,右键单击它,然后选择edit customized style:

在此输入图像描述

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

将TActiveStyleObject添加到结构中,将其重命名为 magnifierglass 在此输入图像描述

更改TActiveStyleObject的ActiveLink位图.

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

在此输入图像描述

您的文字现在将与图标重叠.

在此输入图像描述

要修复它,你必须将内容的左边距(目前设置为2px)更改为更高的20.

在此输入图像描述

在此输入图像描述

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

打开样书并将StyleName新样式重命名为searcheditstylenoclearbtn.

在此输入图像描述

保存它并在您的classhelper函数更改

Self.FSearchEdit.StyleLookup := 'editstyle';
Run Code Online (Sandbox Code Playgroud)

Self.FSearchEdit.StyleLookup := 'searcheditstylenoclearbtn';
Run Code Online (Sandbox Code Playgroud)

现在清除按钮消失了.

在此输入图像描述

如果您不想经历创建自己的搜索风格的问题,可以将以下代码保存为searchitstylenoclearbtn.style并将其加载到StyleBook编辑器中.

在此输入图像描述

object TStyleContainer
  object TLayout
    StyleName = 'searcheditstylenoclearbtn'
    Position.X = 530.000000000000000000
    Position.Y = 399.000000000000000000
    Size.Width = 100.000000000000000000
    Size.Height = 22.000000000000000000
    Size.PlatformDefault = False
    Visible = False
    TabOrder = 0
    object TActiveStyleObject
      StyleName = 'background'
      Align = Contents
      SourceLookup = 'Windows 10 Desktopstyle.png'
      Size.Width = 100.000000000000000000
      Size.Height = 22.000000000000000000
      Size.PlatformDefault = False
      ActiveTrigger = Focused
      ActiveLink = <
        item
          CapInsets.Left = 7.000000000000000000
          CapInsets.Top = 7.000000000000000000
          CapInsets.Right = 7.000000000000000000
          CapInsets.Bottom = 7.000000000000000000
          SourceRect.Left = 266.000000000000000000
          SourceRect.Top = 81.000000000000000000
          SourceRect.Right = 305.000000000000000000
          SourceRect.Bottom = 110.000000000000000000
        end>
      SourceLink = <
        item
          CapInsets.Left = 7.000000000000000000
          CapInsets.Top = 7.000000000000000000
          CapInsets.Right = 7.000000000000000000
          CapInsets.Bottom = 7.000000000000000000
          SourceRect.Left = 225.000000000000000000
          SourceRect.Top = 81.000000000000000000
          SourceRect.Right = 264.000000000000000000
          SourceRect.Bottom = 110.000000000000000000
        end>
      TouchAnimation.Link = <>
    end
    object TLayout
      StyleName = 'content'
      Align = Client
      Locked = True
      Margins.Left = 20.000000000000000000
      Margins.Top = 2.000000000000000000
      Margins.Right = 2.000000000000000000
      Margins.Bottom = 2.000000000000000000
      Size.Width = 6.000000000000000000
      Size.Height = 18.000000000000000000
      Size.PlatformDefault = False
    end
    object TLayout
      StyleName = 'buttons'
      Align = Right
      Locked = True
      Margins.Top = 2.000000000000000000
      Margins.Right = 2.000000000000000000
      Margins.Bottom = 2.000000000000000000
      Position.X = 48.000000000000000000
      Position.Y = 2.000000000000000000
      Size.Width = 50.000000000000000000
      Size.Height = 18.000000000000000000
      Size.PlatformDefault = False
    end
    object TBrushObject
      StyleName = 'foreground'
      Brush.Color = claBlack
    end
    object TBrushObject
      StyleName = 'selection'
      Brush.Color = x7F2A96FF
    end
    object TFontObject
      StyleName = 'font'
    end
    object TLabel
      StyleName = 'prompt'
      Locked = True
      Opacity = 0.500000000000000000
      Visible = False
    end
    object TActiveStyleObject
      StyleName = 'magnifierglass'
      Align = Left
      CapMode = Tile
      Margins.Top = 1.000000000000000000
      SourceLookup = 'Windows 10 Desktopstyle.png'
      Position.Y = 1.000000000000000000
      Size.Width = 20.000000000000000000
      Size.Height = 21.000000000000000000
      Size.PlatformDefault = False
      WrapMode = Center
      ActiveTrigger = Pressed
      ActiveLink = <
        item
          SourceRect.Left = 4.000000000000000000
          SourceRect.Top = 358.000000000000000000
          SourceRect.Right = 20.000000000000000000
          SourceRect.Bottom = 374.000000000000000000
        end>
      SourceLink = <
        item
          SourceRect.Left = 4.000000000000000000
          SourceRect.Top = 358.000000000000000000
          SourceRect.Right = 20.000000000000000000
          SourceRect.Bottom = 374.000000000000000000
        end>
      TouchAnimation.Link = <>
    end
  end
end
Run Code Online (Sandbox Code Playgroud)


kam*_*ami 5

如果您不想在应用程序的所有 Searchbox中看到Clearbutton ,您可以修改FMX.Searchbox.Style.pas:

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

对于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;
Run Code Online (Sandbox Code Playgroud)

对于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;
Run Code Online (Sandbox Code Playgroud)

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

  1. 编译并启动应用程序.

这些代码更改对所有平台都有效.