|
|
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;
|
|
|