¿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?
- No detener la animación en listview
- Android: ¿Cómo detectar el doble toque?
- Tratando de establecer una fuente personalizada para cada botón ListAdapter individual
- ListView dentro de un ScrollView
- ArrayList Adapter (para ListView) sólo muestra el primer elemento agregado
- Causado por: java.lang.IllegalArgumentException: columna '_id' no existe
- android listview color de fila alternativo pero con selección de cursor predeterminada
- Android: colocar anuncio en la parte inferior de la pantalla
- Aplicar el selector android para un niño específico de listview y desactivar el selector en los otros niños en el mismo elemento de lista
- ListView muestra sólo un elemento
- Android: ¿Los elementos de las listas no se vuelven naranjas cuando se hace clic?
- Cómo cambiar el color de texto de un elemento ListView?
- ¿Cómo establecer alturas diferentes para cada fila en un ListView?
El SearchBox es un descendiente de TEdit y utiliza estilos de control FireMonkey.
Coloque un TEdit en su formulario y abra su Propiedad StyleLookup:
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.
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
:
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
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).
Su texto ahora se superpondrá con el icono.
Para solucionarlo, tienes que cambiar el margen izquierdo del contenido (que está configurado actualmente en 2px) a algo más alto como 20.
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
.
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.
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.
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
:
- 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 archivoyour_application.dpr
) - 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.
- Compilar y ejecutar la aplicación.
Estos cambios de código son válidos para todas las plataformas.
- Estados dibujables con colores (no dibujables)
- ¿Es posible pasar un argumento personalizado al mercado Android para que mi aplicación lo reciba en el primer lanzamiento?