Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Crear un hueco en blanco en el DBLookupcombobox (https://www.clubdelphi.com/foros/showthread.php?t=2267)

fortran 16-07-2003 12:00:55

Crear un hueco en blanco en el DBLookupcombobox
 
Hola a todos:

Trabajo con WXP y D5. he hecho una aplicación en la que se dan citas a los distintos clientes de una tabla (TablaClientes), estas citas se almacenan en una tabla (TablaCitas), para ello utilizo un DBLookupCombobox. El problema surge cuando quiero cancelar una cita, en el combobox no me aparece ningún hueco en blanco ni me permite borrar el contenido que hay ya asignado ¿como lo puedo solucionar?. Espero que se entienda lo que pregunto :confused: y gracias de antemano por vuestra atención.

delphi.com.ar 16-07-2003 16:21:03

Puedes utilizar el de las RxLibs (TRxDBLookupCombo), que tiene una propiedad DisplayEmpty que hace lo que tu quieres, o puedes cargar tu combo desde un query que sea un union con un query de un registro sin datos, o puedes hacer que cuando el foco está en el combo y presionan Escape se limpie.....

Espero que algo de todo esto te sirva.
Saludos!

fortran 16-07-2003 16:52:17

Hola Gracias por la respuesta:

Lo que yo había pensado hacer es en el evento onKeypress comprobar si esa tecla era la tecla de supr (o delete), primer problema (no se como identificar esa tecla por código).

Si era esa tecla borrar el registro. Segundo problema tampoco tengo muy claro como hacerlo.

¿Me podríais indicar un poco?

Gracias por adelantado.

delphi.com.ar 16-07-2003 16:59:03

Si haces Combo.FieldValue := ''; ???

fortran 16-07-2003 17:43:17

He hecho la prueba con la letra 'b' (de borrar), con fieldvalue no me servía (me decía que fieldvalue era un undefined identificador), he tratado de hacer lo siguiente:

dblookupcita.datafield := '';

y aunque en un principio parece que funciona, resulta que realmente no lo ha borrado de la tabla, solamente me ha dejado ese control en blanco permanentemente.

roman 16-07-2003 17:54:49

Una forma de hacerlo:

Código:

Combo.DataSource.DataSet.Edit;
Combo.DataSource.DataSet.FieldByName(Combo.DataField).Clear;
Combo.DataSource.DataSet.Post;

Para lo de interceptar la tecla usa el evento OnKeyDown.

Por otra parte, no sé desde que versión de Delphi viene pero en la 7 el dblookupcombobox tiene la propiedad NullValueKey a la que le asignas la tecla que deseas de manera que al oprimirla hace exactamente lo que deseas sin necesidad de más código.

// Saludos

delphi.com.ar 16-07-2003 18:02:30

Disculpa pero lo he escrito de memoria, y a veces me equivoco :D !!

Lo que comenta Román no existe en Delphi 5, que es la versión en que yo trabajo.

Prueba esto:
Código:

procedure TForm1.DBLookupComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #27 Then
    DBLookupComboBox1.KeyValue := Null;
end;


Saludos!

roman 16-07-2003 18:26:11

Cita:

Posteado originalmente por delphi.com.ar
Prueba esto:
Código:

procedure TForm1.DBLookupComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #27 Then
    DBLookupComboBox1.KeyValue := Null;
end;


Mmm.. Yo probé esto y aunque pone en blanco el Combo no borra el campo correspondiente en la tabla.

// Saludos

delphi.com.ar 16-07-2003 18:35:44

Cita:

Posteado originalmente por roman
Yo probé esto y aunque pone en blanco el Combo no borra el campo correspondiente en la tabla.
Para mi es una novedad, lo utilizo habitualmente pero lo que no hago es utilizar la propiedad DataSet del LookUp para que me actualice automáticamente los valores en la tabla, por consiguiente nunca lo he probado.

Saludos!

fortran 16-07-2003 19:05:21

Creo que me estoy volviendo loco:

Con respecto a la solución de delphi.com.arg me ha pasado lo mismo que a Roman.

Con la de Roman me ha pasado lo siguiente:

He puesto
Código:

procedure TFormularioPrincipal.DBLookupCita04KeyPress(Sender: TObject;
  var Key: Char);
begin
if key = #27 then
Begin
  modulodedatos.DataSourceClientes.Edit;
  modulodedatos.DataSourceClientes.FieldbyName(dblookupcita04).clear;
  modulodedatos.DataSourceClientes.Post;
end;

End;

y me dice undeclared identifier FieldbyName.

roman 16-07-2003 19:11:33

Es que estás confundiendo componentes. Un TDBLookupComboBox tiene una propiedad DataSource que a su vez tiene la propiedad DataSet que sí tiene el método FieldByName. Yo lo puse así de largo porque no sé que componentes estás usando además del combo. Si tienes un dataset (TTable por ejemplo) con la tabla de clientes entonces simplemente usa los métodos Edit, Post, FieldByName de ese dataset.

// Saludos

guillotmarc 16-07-2003 21:13:30

Hola

¿ Los TDbLookupComboBox de Delphi 5 no tienen la propiedad NullValueKey ?. Esa es la propiedad en Delphi 6 para indicar la combinación de teclado que asigna un Null a Value.

Saludos.

delphi.com.ar 16-07-2003 21:24:19

Cita:

Posteado originalmente por guillotmarc
¿ Los TDbLookupComboBox de Delphi 5 no tienen la propiedad NullValueKey ?.
¡¡Os lo aseguro!!.. Por eso he recomendado lo que he recomendado, de todas maneras prefiero la solución que proponen las RxLib, creo que queda mas claro para el usuario.

Saludos!

guillotmarc 16-07-2003 22:00:29

Hola.

A mi también me gusta más la combo de las Rx, y es la que utilizo normalmente. Aunque citaba esa propiedad porqué en caso de existir también en Delphi 5 le hubiese solucionado el problema más rapidamente.

Un saludo.

roman 16-07-2003 22:08:44

Personalmente lo que yo haría ya en la práctica sería agregar un registro 'blanco' en la tabla citas con clave, digamos, cero. De esta manera aparecería el renglón en blanco en el combo o bien lo que nosostro quisiéramos poner en ese registro 'blanco', por ejemplo, 'NO TIENE CITA'.

En la tabla Clientes, los registros con el campo cita=0 serán aquellos que no tengan cita.

Lo haría así porque prefiero en la medida de lo posible evitar el uso de valores null en las tablas.

// Saludos

ramiretor 16-07-2003 23:45:15

Hola:

Yo digamos tenía un problema similar. Lo que hice fue seguir algo similar a lo que te dice Roman, inmediatamente despues abrir la consulta del DBLookupComboBox, la poniamos en insercion y luego insertamos un registro en donde el keyvalue era un valor que no existia en la tabla. Ojala te pueda servir

Salu2 foro
:)

delphi.com.ar 16-07-2003 23:51:21

Me parece que lo que tu dices no es lo que propone Román, a mi entender Román quiere que siempre se cumpla la Entidad-Relación y evitar campos con valores nulos. Esto lo logra agregando en las entidades un registro con el texto "No Aplica" o "Blanco" como el dice.

Saludos!

roman 17-07-2003 01:41:05

// Saludos

fortran 17-07-2003 10:19:33

Bueno, por fin:

Tenías razón Román, estaba liando los componentes, ahora funciona, estoy pensando seriamente hacer lo que decías insertar un registro en blanco en la tabla de clientes y cuando no quiera eliminar una cita se la asigno a ese registro. Otra pregunta, ¿porque son mejores los rxdblookupcombo que los dblookupcombo?, si es algo convincente aun estoy a tiempo de volver atrás y cambiarlo.

Un saludo y muchas gracias por vuestra atención. :)


La franja horaria es GMT +2. Ahora son las 01:34:57.

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