DELPHI MANIA
www.delphimania.com.ar
 
 
 
  Delphi Mania  >> Trucos >> Base de Datos
 
   
   
   
   
 
   
   
   
   
   
     
     
     
     
     
     
     
 
Pregunta: ¿Cómo se puede ir reduciendo la lista de un TdbLookUpComboBox, a
                medida que se presionan teclas?
Grupo: Base de Datos Versiones    : D3 D4 D5
Fecha: 30/11/01 Enviado por : Delphimania

Respuesta:

     Para hacer esto se pueden utilizar las propiedades Filter, Filtered y FilterOptions del componente TTable asociado al TDBLookUpComboBox. La Propiedad Filter permite a través de un string dar una condición, de manera que solo estarán disponibles los registros de la tabla que la cumplan. Puede utilizarse el caracter '*' como comodín. La propiedad Filtered indica si se está utilizando el filtro. La propiedad Filter Options es un conjunto que indica las condiciones de filtrado, inculyendo foCaseInsensitive si el filtrado es insensibles (no hay diferencias entre mayúsculas y minúsculas), y foNoPartialCompare si el filtrado debe ser exacto (además de conicidir debe tener la misma longitud).
     Ahora si podemos comenzar con el ejemplo. En un form vamos a pegar un componente TTable, un TDataSource, y un TDBLookUpComboBox, todos ellos asociados a una tabla, por ejemplo de clientes que tiene al menos dos campos: idCliente (Clave) y Nombre. Y además vamos a declarar un String Filtro en la parte privada del Form y modificar las siguientes propiedades:

...
Table1.Filtered := True;

Table1.Active := True;
...

 

     Para el procesamiento de las teclas escribimos el siguiente código en el evento onKeyPress:

procedure TForm1.DBLookupComboBox1KeyPress(Sender: TObject;                                            var Key: Char);
Const Nulo    = #00;
      BackSpc = #08;
      Escape  = #27;
      Enter   = #13;
Begin
 Case Key Of
   BackSpc : Filtro := Copy(Filtro, 1, Length(Filtro) -1);
   Enter : ;
   Escape : Filtro := '';
  Else Filtro := Filtro + Key;
 End; //Case
 If Filtro = ''
   Then Table1.Filter := ''
   Else Table1.Filter := 'Nombre = ''' + Filtro + '*''';
end;

 
      Al usar la propiedades de filtrado de la tabla no solo se modifica la cantidad de registros en el TBDLookUpComboBox, si no que esto sucede en todos los demás controles( como un TDBGrid, por ejemplo). Para devolver la vista normal luego de la selección debe sacarse el filtro, lo que proboca que se seleccione el primer registro de la tabla. Para solucionar todos estos inconvenientes puede utilizarse el siguiente código:
procedure TForm1.DBLookupComboBox1Exit(Sender: TObject);
Var Clave: Variant;
begin
  Filtro := ''; //Elimina para prox. seleccion
  Clave := DBLookupComboBox1.KeyValue; //Salvamos clave actual
  Table1.Filter:= ''; //Sacamos el filtro
  DBLookupComboBox1.KeyValue:= Clave;//reponemos reg. selec.
end;
 
     Para terminar podemos utilizar otro pequeño truco. Cuando nos desplazamos en una tabla en el TDBLookUpComboBox no se refleja el cambio (el registro seleccionado no aparece en el editor). Esto se arregla escribiendo el siguiente código en el evento OnAfterScroll de la tabla en cuestión:

procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
begin
  With DBLookupComboBox1 do
      KeyValue := Table1.FieldValues[KeyField];
end;

 
 
 
 
   
DELPHI MANIA  
 
Las marcas que aparecen en esta pagina pertenecen a sus respectivas empresas
Todos los derechos reservados - Copyrigth 2001 ©