Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   edit + listbox (https://www.clubdelphi.com/foros/showthread.php?t=74198)

fedee 04-06-2011 20:28:08

edit + listbox
 
Alguien sabes como hacer para ir escribiendo un articulo en un edit y se vaya filtrando en un listbox dependiendo de la palabra ingresada?

Ejemplo:

Si pongo "A" en el edit me aparecen : ALFOMBRAS, ARANDELAS, AURICULARES, AUTOS..

y si pongo "AU" me aparezcan AURICULARES, AUTOS..

desde ya muchas gracias!

ecfisa 04-06-2011 22:04:39

Hola fedee.

Se me ocurre que podés aprovechar el evento OnChange del Edit:
Código:

void __fastcall TForm1::Edit1Change(TObject *Sender)
{
  int i = 0;
  boolean Found = FALSE;
  while(i < ListBox1->Count && !Found) {
    Found = ListBox1->Items->Strings[i].SubString(1,Edit1->Text.Length()) == Edit1->Text;
    i++;
  }
  if(Found)ListBox1->ItemIndex = i-1;
}

Saludos.

fedee 05-06-2011 02:36:23

ecfisa: Antes q nada te remil agradezco por tu ayuda.. pero copie tal cual eso en el OnChange pero no sale nada.. q sera?

edit: ahi medio q supe resolverlo pero yo queria q se vayan filtrando.. osea q vayan desapareciendo los q no cumplen con las letras ingresadas.. me explico?

ecfisa 05-06-2011 21:59:42

Hola fedee.
Cita:

osea q vayan desapareciendo los q no cumplen con las letras ingresadas
Código:

void __fastcall TForm1::Edit1Change(TObject *Sender)
{
 int i;
  boolean Found= FALSE;
  /* Eliminar no coincidentes */
  for(i=0;i<ListBox1->Count;i++)
    if(ListBox1->Items->Strings[i].SubString(1,Edit1->Text.Length()) !=
            Edit1->Text) ListBox1->Items->Delete(i);
  /* Posicionarse */
  for(i=0;i< ListBox1->Count && !Found; i++){
    Found = ListBox1->Items->Strings[i].SubString(1,Edit1->Text.Length()) ==
            Edit1->Text;
}

Pero el problema que veo con eso es que si el usuario se arrepiente, luego de haber tipeado algunos caracteres,
ya no tendrá disponible los otros items.

Saludos

fedee 06-06-2011 01:16:57

si, ahi vi.. creo q me quedo con el anterior! si llegas a resolverlo te lo remil agradeceria!! :D

ecfisa 06-06-2011 02:41:11

Hola fedee.

Fijate si de este modo hace lo que estas buscando:
Código:

...
TStrings *TS = new TStringList;

void __fastcall TForm1::FormShow(TObject *Sender)
{
 int i;
 for(i=0;i < ListBox1->Count; i++)
  TS->Add(ListBox1->Items->Strings[i]);
}

void __fastcall TForm1::Edit1Change(TObject *Sender)
{
  int i;
  boolean Found= FALSE;
  for(i=0;i<ListBox1->Items->Count;i++)
    if(ListBox1->Items->Strings[i].SubString(1,Edit1->Text.Length()) !=
            Edit1->Text) ListBox1->Items->Delete(i);

  for(i=0;i< ListBox1->Items->Count && !Found; i++)
    Found = ListBox1->Items->Strings[i].SubString(1,Edit1->Text.Length()) ==
            Edit1->Text;
  if (Found) 
    ListBox1->ItemIndex = i-1;
  else {     
    for(i=0; i< TS->Count; i++)
      ListBox1->Items->Strings[i] = TS->Strings[i];
    ListBox1->ItemIndex  = -1;
  }
}
...

Al comenzar en el evento OnShow se almacenan los valores del TListBox en un TStringList.
En el evento OnChange del TEdit si al finalizar la búsqueda incremental no se encontro ninguna coincidencia, se restaura la lista inicial en el TListBox desde el TStringList.

Saludos.

fedee 06-06-2011 03:08:09

ecfisa:

Hice todo y anda bien.. el tema es q cuando borro no se vuelven a todos los items del listbox.. solo cuando se hace el formshow..

ecfisa 06-06-2011 03:22:31

Hola.

Si de ese modo, la restaura cuando después de escribir no encuentra más coincidencias.
Para que lo haga cuando el Edit esté vacío, reemplaza estas líneas:
Código:

if (Found) 
    ListBox1->ItemIndex = i-1;
  else {     
    for(i=0; i< TS->Count; i++)
      ListBox1->Items->Strings[i] = TS->Strings[i];
    ListBox1->ItemIndex  = -1;
  }

Por estas:
Código:

if (Found)
    ListBox1->ItemIndex = i-1;
  if(Edit1->Text.Length() == 0){
    for(i=0; i< TS->Count; i++)
      ListBox1->Items->Strings[i] = TS->Strings[i];
    ListBox1->ItemIndex  = -1;
  }

En realidad el código que restaura los items es sólo este:
Código:

for(int i=0; i< TS->Count; i++)
      ListBox1->Items->Strings[i] = TS->Strings[i];

Lo podés ubicar en el evento OnClick de un TButton, luego de evaluar alguna condición o en donde quieras que sea restaurado.

Saludos.


La franja horaria es GMT +2. Ahora son las 05:22:51.

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