Ir al contenido


Foto

Crear un buscador


  • Por favor identifícate para responder
8 respuestas en este tema

#1 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 260 mensajes

Escrito 17 octubre 2012 - 05:15

Buenas chicos yo aquí de nuevo con una pequeña consultita.....

Resulta que estoy pensando crear una pequeña aplicación q pueda buscar texto o parte de este, de toda una lista, por ejemplo tener un listado de nombres y en la parte de encima tenga un TEDIT en el cual cuando ni bien comienze a escribir se vaya filtrando los resultados......

Estuve pensando en usar el componente TStringGrid pero no se si será la mejor opción.....

Espero sus consejos de como puedo comenzarlo, gracias.


PD: les adjunto una imagen de como pensaba hacerlo.  :)

Archivos adjuntos


  • 0

#2 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 17 octubre 2012 - 06:11

Hola
la informacion estara en una bd ?
Saludos
  • 0

#3 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 260 mensajes

Escrito 17 octubre 2012 - 06:58

Gracias por su pronta respuesta, con lo de BD supongo que se refieren a "Base de Datos"....
De momento quisiera comenzar con lo básico de lo básico por ejemplo escribir manualmente los datos o sino extraerlos de un archivito de texto....

:)



  • 0

#4 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 17 octubre 2012 - 07:27

Hola
Un buscador es esencialmente un filtro.
Lo mas facil es hacer una Bases de datos con una tabla y de ahi sacar los datos.
Un archivo texto no es tan sencillo ni practico.
Por ejemplo se podria usar una BD access.
Saludos
  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 17 octubre 2012 - 09:08

Aquí te pongo algo de código para empezar.  Puedes mirar como se asigna el contenido de un archivo de texto plano (.txt) a un memo. El procedimiento Buscar  limpia el Memo2, posteriormente recorre las líneas del Memo1, buscando si el contenido del TEdit1 se encuentra en alguna  línea, en caso afirmativo las líneas que contengan el texto del TEdit1 son agregadas al Memo2.



delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, ExtCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     Memo1: TMemo;
  13.     Memo2: TMemo;
  14.     Edit1: TEdit;
  15.     procedure Button1Click(Sender: TObject);
  16.     procedure Edit1Change(Sender: TObject);
  17.   private
  18.     procedure buscar;
  19.   public
  20.     { Public declarations }
  21.   end;
  22.  
  23. var
  24.   Form1: TForm1;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. procedure TForm1.Button1Click(Sender: TObject);
  31. var
  32.   sFileName: string;
  33. begin
  34.   sFileName := ExtractFilePath(Application.EXEName) + 'Texto.txt';
  35.   if FileExists(sFileName) then
  36.     Memo1.Lines.LoadFromFile(sFileName);
  37. end;
  38.  
  39. procedure TForm1.buscar;
  40. var
  41.   k: integer;
  42. begin
  43.   Memo2.Clear;
  44.   for k := 0 to Memo1.Lines.Count - 1 do
  45.     if pos(trim(Edit1.Text), Memo1.Lines[k]) > 0 then
  46.       Memo2.Lines.Add(Memo1.Lines[k]);
  47. end;
  48.  
  49. procedure TForm1.Edit1Change(Sender: TObject);
  50. begin
  51.   Buscar
  52. end;
  53.  
  54. end.



Es obvio que se puede optimizar de muchas formas, como por ejemplo, poner un Timer para no hacer el proceso con cada letra digitada, sino cada lapso de tiempo.

Saludos
  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 18 octubre 2012 - 08:21

Aqui te pongo algo de código para hacerlo con un StringGrid, lo probé y funciona perfectamente.



delphi
  1. procedure TForm1.Button2Click(Sender: TObject);  {llena el StrigGrid a partir de
  2. un archivo .txt}
  3. var
  4.   sFileName: string;
  5.   Lista: TStringList;
  6.   K: integer;
  7. begin
  8.   StringGrid1.Cells[1, 0] := 'Nombres';
  9.   sFileName := ExtractFilePath(Application.EXEName) + 'Texto.txt';
  10.   Lista := TStringList.Create;
  11.   try
  12.     if FileExists(sFileName) then
  13.     begin
  14.       Lista.LoadFromFile(sFileName);
  15.       StringGrid1.rowcount := Lista.Count + 1;
  16.       for K := 1 to Lista.Count do
  17.         StringGrid1.Cells[1, K] := Lista[K - 1];
  18.     end;
  19.   finally
  20.     Lista.Free;
  21.   end;
  22. end;
  23.  
  24.  
  25.  
  26. procedure TForm1.Edit2Change(Sender: TObject); //filtra  el stringGrid
  27. var
  28.   sFileName: string;
  29.   Lista: TStringList;
  30.   K, h: integer;
  31. begin
  32.   sFileName := ExtractFilePath(Application.EXEName) + 'Texto.txt';
  33.   Lista := TStringList.Create;
  34.   try
  35.     if FileExists(sFileName) then
  36.     begin
  37.       Lista.LoadFromFile(sFileName);
  38.       StringGrid1.rowcount := Lista.Count + 1;
  39.       if trim(Edit2.Text) = '' then // No hay filtro
  40.       begin // Carga completo
  41.         for K := 1 to Lista.Count do
  42.           StringGrid1.Cells[1, K] := Lista[K - 1];
  43.       end // fin de carga completo
  44.       else // hay filtro
  45.       begin
  46.         for K := 1 to Lista.Count do
  47.           StringGrid1.Cells[1, K] := ''; // limpia  todo
  48.         h := 1; // Para evitar huecos en el grid
  49.         for K := 1 to Lista.Count do // carga lineas filtradas
  50.           if pos(trim(Edit2.Text), Lista[K - 1]) > 0 then
  51.           begin
  52.             StringGrid1.Cells[1, h] := Lista[K - 1];
  53.             Inc(h);
  54.           end;
  55.       end;
  56.     end;
  57.   finally
  58.     Lista.Free;
  59.   end;
  60. end;



Saludos
  • 0

#7 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 18 octubre 2012 - 08:28

Que tal monchito_elroro; si hablamos de Lazarus hay una buena alternativa, donde se trata a los archivos planos como si fuera una tabla de una base de datos y hacer consultas tipo LIKE de SQL. Con esto se evita bombardear la base de datos.


ZMSQL is an open source, TBufDataset SQL enhanced in-memory database for FreePascal (FPC), operating with semicolon-separated values flat text tables as a persistence store.
This means you can use files to store your data but get the speed of in-memory processing. Completely written in Pascal, it has no dependencies on external libraries.
It offers:

Loading from and saving to flat text tables
Use of SQL to query the data
Copy data and schema from other datasets
Option to predefine fielddefs or create it on-the fly
Master/detail filtering
Referential integrity
Parameterized queries


ZMSQL : http://wiki.freepascal.org/ZMSQL


Si encuentras bugs reportalos por favor, para mi es una alternativa tipo LINQ en .Net; pues LINQ precisamente lo uso para realizar filtros complejos sin volver a ejecutar SP's complejos y hacer dar cierta rapidez al programa.

Creo uno de estos días haré algo similar como lo que buscas pero en Lazarus, es muy aplicable.

También lo puedes usar con base de datos además pudieras encriptar este archivo plano si la seguridad se ve comprometida en el equipo cliente si es que es necesario mantenerlo mucho tiempo.

Saludos


  • 0

#8 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 260 mensajes

Escrito 18 octubre 2012 - 09:06

Gracias los probaré y les comentaré mis avances.......... :) :)
  • 0

#9 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 18 octubre 2012 - 09:24

También podría interesarte: JCSV http://wiki.freepasc...CSV_Components)

Saludos
  • 0




IP.Board spam blocked by CleanTalk.