Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Busquedad en un StringGrid (https://www.clubdelphi.com/foros/showthread.php?t=85541)

eennzzoo 29-03-2014 14:17:05

Busquedad en un StringGrid
 
Hola, tengo un StringGrid que se carga con un archivo. Con el siguiente codigo busco la palabra que quiero y me lo marca con color a la celda. Lo que yo quisiera es que a medida que voy escribiendo la palabra en el edit me vaya listando las palabras que empiezan con lo que estoy escribiendo. Si en el StringGrid tengo:
Lunes
Martes
Miercoles
Jueves

Y si yo en el edit escribo la M quiero que solo me muestre las palabras que empiezan con M y no las otras.

Código:

void __fastcall TfPeliculas::btnBuscarClick(TObject *Sender)
{
        for(int i = StringGrid1->FixedRows; i < StringGrid1->RowCount ; i++)
                if((StringGrid1->Cells[0][i] == editPelicula->Text)||(LowerCase(StringGrid1->Cells[0][i]) == editPelicula->Text)) {
                    TRect Casilla;
                    StringGrid1->Canvas->Brush->Color=static_cast<TColor>(RGB(252, 210, 147));
                    Casilla= StringGrid1->CellRect(0, i);
                    StringGrid1->Canvas->FillRect(Casilla);
                    StringGrid1->Canvas->TextOut(Casilla.Left+1,Casilla.top+1,StringGrid1->Cells[0][i]);
                }

}

Gracias

aguml 29-03-2014 23:08:14

para eso casi mejor usar algo como sqlite o mysql ya que estossi te permiten usar consultas, aplicar filtros y mucho mas. De todos modos podrias usar dos stringgrid e vez de uno y en el que creas como auxilar y que no será visible es en el que guardarás todo y en el que está visible lo rellenas usando los datos del que está oculto.

ecfisa 29-03-2014 23:10:14

Cita:

Empezado por eennzzoo (Mensaje 474525)
[b]..._
Lo que yo quisiera es que a medida que voy escribiendo la palabra en el edit me vaya listando las palabras que empiezan con lo que estoy escribiendo. Si en el StringGrid tengo:
Lunes
Martes
Miercoles
Jueves

Y si yo en el edit escribo la M quiero que solo me muestre las palabras que empiezan con M y no las otras.

Hola eennzzoo.

No existe una propiedad tal como Visible para las filas de un TStringGrid.
Lo único que se me ocurre en este momento para hacer lo que buscas, es usar la propiedad RowHeights[n] para darle alto cero a aquellas filas que no tienen coincidencia con lo que llevas ingresado en el TEdit. El filtro se anula si dejas la propiedad Text del Edit igual a cadena vacía.

Ejemplo:
Código:

...
#define INDEX_COL 0

int OldRowHeight;

// Cargar datos al StringGrid
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  TStrings *TS = new TStringList;

  // leer archivo de prueba
  TS->LoadFromFile(ExtractFilePath(Application->ExeName) + "archivo.txt");
  // Ajustar StringGrid
  StringGrid1->FixedRows= 1;
  StringGrid1->FixedCols= 0;
  // fijar número de filas
  StringGrid1->RowCount=TS->Count-1;
  // fijar número de columnas
  TStrings *aux = new TStringList;
  StringGrid1->ColCount= ExtractStrings(TSysCharSet()<< ',',
    TSysCharSet() << '\0', TS->Strings[0].c_str(),aux);
  delete aux;
  // obtener alto de celda predeterminado
  OldRowHeight = StringGrid1->DefaultRowHeight;
  // pasar a StringGrid
  for(int lin=0; lin<TS->Count; lin++)
    StringGrid1->Rows[StringGrid1->FixedRows+lin]->CommaText= TS->Strings[lin];

  delete TS;
}

// Mostrar sólo las filas cuya columna índice tenga los caracteres ingresados
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
  TStringGrid *SG = StringGrid1;

  for(int f=SG->FixedRows; f<SG->RowCount; f++)
    if(UpperCase(SG->Cells[INDEX_COL][f].SubString(1,Edit1->Text.Length()))
          == UpperCase(Edit1->Text))
      SG->RowHeights[f]= OldRowHeight;
    else 
      SG->RowHeights[f]= 0;
}

Toma en cuenta que es un ejemplo... El archivo "archivo.txt" que usé para el código, contiene datos separados por comas para simplificar la carga. Seguramente tengas que reformular esa parte del código para adecuarlo a la organización de tus datos.
INDEX_COL brinda el índice de la columna sobre la cuál se realizará la búsqueda.
Cualquier dificultad avisame y te adjunto el código fuente.

Como sugerencia, es muchísimo mas simple y eficiente realizar esta taréa (y muchas otras) sobre un TDBGrid usando una tabla de una base de datos.

Saludos :)

Pd: Una consulta, ¿ Tenes dificultad para visualizar los mensajes que los escribis todos en negrita ?

eennzzoo 31-03-2014 16:20:31

Gracias ahi lo probe y anda.


La franja horaria es GMT +2. Ahora son las 16:25:56.

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