jueves, 5 de julio de 2018

TListBox: buscar.


El siguiente código se ejecuta cuando se presiona el botón buscar, si la cadena de texto ingresada coincide con algún ítem de la lista, el mismo es seleccionado.

procedure TFCProv.BBuscarClick(Sender: TObject);
var
  nombre, item:String;
  i, cant:Integer;
begin
  nombre:=UpperCase(edBuscar.Text);
  cant:=Length(nombre);
  for i:=0 to lbProv.Count-1 do
  begin
    item:=UpperCase(lbProv.Items[i]);
    if nombre=LeftStr(item,cant) then
    begin
      lbProv.ItemIndex:=i;
      Break;
    end;
  end;
end;


En este caso la lista contiene nombres de proveedores, está ordenada, convierte a mayúsculas la cadena a buscar y el elemento a comparar. La variable entera cant se utiliza para saber la cantidad de caracteres que ingresó el usuario y hacer la búsqueda parcial, es decir, si el usuario ingresa "Ac" y hay en la lista un elemento "ACME" se compara "AC" con "AC". Como lo que se quiere es solo marcar el elemento en la lista (lbProv.ItemIndex), se hace y se utiliza break para salir.

miércoles, 4 de julio de 2018

TDBLookupComboBox validar e impedir NULL.

Lo más simple es definir la propiedad Style en csDropDownList pero no siempre es lo que necesitamos. Por ejemplo cuando son muchos los registros que se cargan en el combo, le damos al usuario la posibilidad de que escriba las primeras letras y le traiga coincidencias, esto se logra estableciendo a True la propiedad AutoComplete. La contra es que el usuario puede abandonar el combo sin ninguna coincidencia, dejando el KeyValue (que es del tipo Variant) en Null. Esto a su vez lanzará un error si la validación la hacemos con números enteros, por ejemplo if combo.KeyValue<0 then...

Opción 1: no permitir que el usuario abandone el combo sin la correcta selección de un elemento.

Definir el evento OnExit.

procedure TFCProv.cmbLocalidadExit(Sender: TObject);
begin
  if cmbLocalidad.KeyValue=Null then
  begin
    ShowMessage('Seleccione una localidad.');
    cmbLocalidad.SetFocus;
  end;
end;


Opción 2: en algún caso en que se permite no seleccionar nada en el combo y debemos guardar 0 (cero) en la base de datos.


Por ejemplo, las actividades de 2 a 5 son opcionales y al crear el Form se les estable el valor de KeyValue en 0 para que no muestre nada. (La normalización y desnormalización de bases de datos está fuera del alcance de este ejemplo.).

if cmbActividad2.KeyValue=Null then
  DMProv.ZQProv.FieldByName('actividad2').AsInteger:=0
else
  DMProv.ZQProv.FieldByName('actividad2').AsInteger:=cmbActividad2.KeyValue;


Esta validación se hace al momento de guardar el registro y en todos los combos excepto el 1, si KeyValue es Null se guarda 0, caso contrario el valor de KeyValue.

TEdit solo números.

Para que una variable del tipo TEdit acepte solo números hay que definir el evento OnKeyPress de esta forma:

procedure TFCProv.edit1KeyPress(Sender: TObject; var Key: char);
begin
if not (Key in ['0'..'9',#8, #9]) then Key:=#0;
end;


De esta forma el usuario solo podrá ingresar números y borrar.

Si bien el tipo TEdit tiene una propiedad NumbersOnly, la misma no funciona si se utiliza el widget GTK-2 en sistemas operativos GNU con kernel Linux.

#8 es para permitir borrar y #9 la tecla de tabulación, cualquier otra tecla se anula con Key:=#0.