¿Cómo puedo quitar el botón de borrar en searchbox de listview?

Quiero poner un TEditButton dinámicamente en searchbox de ListView así que hice esto:

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; 

Pero el problema es que el clear button está llegando demasiado mientras se edita el cuadro de búsqueda . ¿Cómo puedo eliminar ese botón de borrado (X) en el lado derecho del cuadro de búsqueda?

Introduzca aquí la descripción de la imagen

El SearchBox es un descendiente de TEdit y utiliza estilos de control FireMonkey.

Coloque un TEdit en su formulario y abra su Propiedad StyleLookup:

Introduzca aquí la descripción de la imagen

Usted puede ver que hay stlyes diferentes ya disponibles. Por lo tanto, queremos cambiar el StyleLookup de nuestro SearchBox.

Como SearchBox es un miembro privado (FSearchEdit) del control ListView, no tiene forma directa de acceder a él.

Puede crear su propio control ListView que es un descendiente de TListView (TListViewBase) o utilizar un ayudante de clase. Opto por este último.

 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; 

En FormCreate podemos llamar a ListView1.ShowSearchEditClearButton := False; Y el botón de borrado se ha ido.

Introduzca aquí la descripción de la imagen

Sin embargo, el icono de cristal de la lupa también desapareció porque no forma parte del editstyle estilo de editstyle que establecemos como StyleLookup .

Para obtener el icono de vuelta, tendríamos que crear nuestro propio estilo que tiene un icono de lupa de vidrio, pero no un botón claro.

Soltar un TEdit en el formulario, haga clic derecho sobre él y luego elija edit customized style :

Introduzca aquí la descripción de la imagen

Ahora estamos en el Editor de StyleBook y tenemos acceso al diseño de control.

Agregue un TActiveStyleObject a la estructura, cambie el nombre a magnifierglass Introduzca aquí la descripción de la imagen

Cambie los mapas de bits ActiveLink del ActiveLink .

En el editor BitmapLinks, busque el icono de la lupa y selecciónelo (para ActiveLink y SourceLink).

Introduzca aquí la descripción de la imagen

Su texto ahora se superpondrá con el icono.

Introduzca aquí la descripción de la imagen

Para solucionarlo, tienes que cambiar el margen izquierdo del contenido (que está configurado actualmente en 2px) a algo más alto como 20.

Introduzca aquí la descripción de la imagen

Introduzca aquí la descripción de la imagen

Ahora puede eliminar la edición de su formulario a medida que se crea el estilo y en el StyleBook de sus formularios.

Abra el StyleBook y cambie el nombre StyleName de su nuevo estilo a StyleName .

Introduzca aquí la descripción de la imagen

Guárdelo y en sus funciones de classhelper cambie

 Self.FSearchEdit.StyleLookup := 'editstyle'; 

a

 Self.FSearchEdit.StyleLookup := 'searcheditstylenoclearbtn'; 

Ahora el botón de borrado se ha ido.

Introduzca aquí la descripción de la imagen

Si no quiere pasar por la molestia de crear su propio buscado, puede guardar el siguiente código como searchitstylenoclearbtn.style y cargarlo en el editor StyleBook.

Introduzca aquí la descripción de la imagen

 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 

Si no quieres ver Clearbutton en todos los Searchbox de tu aplicación, puedes modificar FMX.Searchbox.Style.pas :

  1. Busque FMX.Searchbox.Style.pas en la carpeta fmx (por defecto, C:\Program Files (x86)\Embarcadero\Studio\{your_version, eg17.0}\source\fmx\FMX.SearchBox.Style.pas y copie el archivo A la carpeta del proyecto (cerca del archivo your_application.dpr )
  2. En el nuevo archivo encontrar y comentar las siguientes líneas:

Para 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; 

Para 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; 

Como puedes ver, el código no es muy diferente dependiendo de la versión de Delphi, para otras versiones puedes encontrarlo tú mismo.

  1. Compilar y ejecutar la aplicación.

Estos cambios de código son válidos para todas las plataformas.

  • El tipo de escala ImageView no funciona en la actividad de la lista
  • Mantenimiento de los estados de la casilla de verificación en listview con CursorAdapter
  • Android Handler Message y ListView
  • Artículos de Android ListView que no llenan el ancho
  • Android: EfficientAdapter con dos vistas diferentes
  • Los datos del adaptador RecycleView aparecen erróneos al desplazarse demasiado rápido
  • Android ListView onTouchEvent no siempre da ACTION_DOWN
  • Horizontal RecyclerView dentro de ListView sin desplazamiento muy suave
  • Android: ¿Por qué un clic largo también activa un clic normal?
  • Adaptador de ListView personalizado lanza UnsupportedOperationException
  • Cómo actualizar lista personalizada usando baseadapter en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.