Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   ComboBox filtrado y asignacion de indexs (https://www.clubdelphi.com/foros/showthread.php?t=92581)

aguml 01-12-2017 14:22:43

ComboBox filtrado y asignacion de indexs
 
Hola amigos, tengo un combo box con una serie de nombres y a los cuales al seleccionar uno muestro una imagen en concreto en un TImage.
Ahora lo que quiero es que, conforme el usuario escriba en el combobox, solo aparezcan los items que contengan esa cadena en cualquier parte del string y, claro está, que sigan estando las imagenes enlazadas correctamente a los items que se filtran. ¿como puedo hacer eso?

Neftali [Germán.Estévez] 05-12-2017 10:17:11

Se me ocurren muchas maneras de implementarlo y depende un poco de lo que tengas ahora.
Filtrar lo elementos del combobox no es compicado hacerlo, pero deberás hacerlo manualmente.
Mantén un TStringList (por ejemplo) con la lista de elementos originales y recorre la lista para añadir en ejecución al combo sólo los que cumplan la condición.

aguml 05-12-2017 13:23:26

Eso sí se como hacerlo, el problema es que tengo un array de valores y cada valor corresponde a una opción del combobox, o sea que los índices son los mismos y puedo hacer algo como "valor=array[micombobox->Itemindex];" y en el momento que aplique un filtro esa relación se va al garete y no se me ocurre como arreglarlo. Lo único que se me ocurre es tener otro array auxiliar el cual filtre a la vez que el combo para que tanto el combo como el array auxiliar coincidan pero no veo bien como implementarlo todo eso.

aguml 05-12-2017 15:42:23

He estado probando con esto pero funciona regular y hace cosas raras como desaparecer el puntero en el form o que al poner una letra se autocompleta aunque la tengo esa opcion en false en el ComboBox1, o que al pulsar una letra primero va a una coincidencia en el combo y luego filtra:
Código PHP:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TStringListMiLista;
unsigned int *valor,*aux;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponentOwner)
    : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBox1KeyUp(TObject *SenderWORD &Key,
      
TShiftState Shift)
{
    
int Index;

    
TStringListSalida = new TStringList();
    
int pos,contador=0;

    try{
        if(
ComboBox1->Text==""){
            
ComboBox1->Items->Assign(MiLista);
        }else{
            for(
int i=0;i<MiLista->Count;i++){
                
pos=UpperCase(MiLista->operator [](i)).Pos(UpperCase(ComboBox1->Text));
                if(
pos>0)
                {
                    
Salida->Add(MiLista->operator [](i));
                    
aux[contador]=valor[i];
                    
contador++;

                }
            }
            
ComboBox1->Items->Assign(Salida);
            
ComboBox1->SelStart ComboBox1->Text.Length();
            
ComboBox1->SelLength 0;
        }
        
        
ComboBox1->DroppedDown true;
    }
    
__finally
    
{
        
delete Salida;
    }
    
ComboBox2->Items->Clear(); //Este es para probar si funciona
    
for(int i=0;i<ComboBox1->Items->Count;i++)
        
ComboBox2->Items->Add(aux[i]);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    
MiLista = new TStringList();
    
MiLista->Assign(ComboBox1->Items);

    
valor=new unsigned int[ComboBox1->Items->Count];
    for(
int i=0;i<ComboBox1->Items->Count;i++)
        
valor[i]=i;
    
aux=new unsigned int[ComboBox1->Items->Count];
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *SenderTCloseAction &Action)
{
    
delete MiLista;
    
delete valor;
    
delete aux;
}
//--------------------------------------------------------------------------- 

A ver si podeis probarlo y me ayudais a dejarlo mejor y que sea mas agradable.


La franja horaria es GMT +2. Ahora son las 07:04:51.

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