Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Delphi FMX: Busqueda con un campo de texto personalizado en un TListView (https://www.clubdelphi.com/foros/showthread.php?t=96676)

dani36652 18-04-2024 01:39:36

Delphi FMX: Busqueda con un campo de texto personalizado en un TListView
 
Hola a todos los colegas y entusiastas de Delphi!
El día de hoy les comparto este truco que si bien no es nuevo, nos puede ayudar a usar nuestros propios "buscadores" personalizados cuando tenemos datos en un TListView evitando así el buscador por defecto que viene en el componente que si bien es de gran ayuda... se mira algo feo con ese tono gris cuando quizás nuestra app maneja otras paletas de colores...

En primera debemos declarar un SearchBox de manera pública o privada según el uso de nuestra app como se muestra a continuación:

Código Delphi [-]
procedure TMainForm.FormCreate(Sender: TObject);
begin
   //Se crea en el evento OnCreate del form principal o donde les sea más conveniente
  SearchBox:= TSearchBox.Create(Self);
  SearchBox.Parent:= Self;
  SearchBox.Align:= TAlignLayout.None;
  SearchBox.Visible:= False;
  setSearchBox;
end;

Código Delphi [-]
procedure setSearchBox;
var
  i: integer;
begin
   // Asignar la referencia del SearchBox del TListView en uso al que acabamos de crear para manipularlo después
  //ListView SearchVBox is only available if ListView.SearchVisible is True
  ListView.SearchVisible:= True;
  for i:= 0 to ListView.ControlsCount - 1 do
  begin
    if ListView.Controls[i].ClassType = TSearchBox then
    begin
      SearchBox.Model.SearchResponder:=
      TSearchBox(ListView.Controls[i]).Model.SearchResponder;
      Break;
    end;
  end;
  ListView.SearchVisible:= False;
end;

Código Delphi [-]
procedure TMainForm.EdtSearchChangeTracking(Sender: TObject);
begin
  // y finalmente en el evento OnChangeTracking de nuestro TEdit de búsqueda le pasamos el texto que se escriba al SearchBox creado anteriormente
  if Assigned(SearchBox) then
  begin
    SearchBox.Text:= TEdit(Sender).Text;
  end;
end;

Al momento de mostrarle al usuario datos provenientes de una BD, un WebService, este truco nos ahorraría el trabajo de mostrarlos en otro componente y escribir el respectivo algoritmo de búsqueda... aprovechando también que el TListView está más optimizado que el TListBox!.

Aquí les dejo un Link a un repositorio en GitHub que muestra el funcionamiento del truco el cual está escrito en Delphi 11.3 y hace uso de Skia:
https://github.com/dani36652/Delphi-...earchResponder

Neftali [Germán.Estévez] 19-04-2024 08:54:22

Gracias.
^\||/^\||/^\||/^\||/


La franja horaria es GMT +2. Ahora son las 21:55:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi