Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Retoceder Celdas en DbGrid (https://www.clubdelphi.com/foros/showthread.php?t=14072)

AGAG4 08-09-2004 21:48:53

Retroceder Celdas en DbGrid
 
Estoy usando un dbGrid, el problema que tengo es que al salir de una celda, cuando el valor de dicha celda es incorrecto y quiero que el enfoque se devuelva a esta misma celda en vez de que pase a la siguiente, no me obedece el dbGrid ó bien no se con cual otra instrucción se podrá hacer para mandar un enfoque por celdas, lo hago en el evento "OnColExit" con esta instrucción:

gridFac.SelectedIndex:=<Numero de Celda>;
Gracias...!!!!

roman 08-09-2004 21:53:32

Puedes más bien usar el evento OnValidate del campo. Si en dicho evento usas abort o lanzas una excepción el foco no se moverá de celda.

// Saludos

AGAG4 09-09-2004 01:11:56

oki
 
Muchas Gracias Sr. Roman.... Me funciono. le debo otra :)

AGAG4 09-09-2004 01:38:00

????
 
Sr. Roman, ahora tengo este problema, quiero convertir el campo "Clave" a mayusculas y al quererlo hacer en el evento OnValidate me marca Error de desbordamiento de pila, hace llamadas recursivas si asigno valores al mismo campo en ese evento, por lo que no encuentro en donde hacer esa conversión, que me sugiere que haga????

__cadetill 09-09-2004 01:43:34

Para validaciones, comprobaciones y demás, yo te aconsejo usar el evento BeforePost del Dataset

Edito:
Eso sí, hasta que no se valida el registro, no se hacen comprovaciones, por lo que a lo mejor no te sirve la idea para lo que tu querías :rolleyes:

AGAG4 09-09-2004 01:50:27

????
 
Gracias por su respuesta, pero no es a lo que me refiero, lo que pasa es que en las celdas del DbGrid ó bien en las propiedades del Campo de un dataset, no tienen alguna propiedad para convertir de minusculas a mayusculas conforme se este escribiendo algo ó bien cuando se termine de escribir, quiero encontrar en don de puedo hacer eso para que antes de que la aplicación mande activar el evento OnValidate del campo ya vaya con el Dato en MAYUSCULAS, me explico????, de antemano Gracias.....

__cadetill 09-09-2004 02:06:17

Sí, te explicas, pero sigo pensando que puedes usar el BeforePost e, incluso, el OnValidate de la siguiente manera:

Sabemos que cada vez que se produce un cambio en el contenido del Field, se dispara ese evento, no? Pues bien, hacemos que sólo se nos dispare 1 vez

Código Delphi [-]
procedure TForm1.FieldValidate(Sender: TField);
begin
  if Sender.AsString <> UpperCase(Sender.AsString) then
    Sender.AsString := UpperCase(Sender.AsString);
end;

Con esto, la primera vez que entre se hará el UpperCase del contenido del campo, lo que hará disparar de nuevo el evento. Pero la segunda vez que entra, al ser el contenido igual, ya no se modificará su contenido por lo que no volverá a disparar el evento y se desharán las llamadas recursivas creadas


Espero te sirva

jachguate 09-09-2004 02:49:44

Creo que el evento adecuado para este tipo de manipulaciones es OnSetText del TField.

El OnValidate es adecuado para hacer validaciones, de manera que pueda producirse un error si el valor no es adecuado, pero no para hacer una Re-asignación del field.

Saludos.

;)

AGAG4 09-09-2004 03:21:49

???
 
También servirá cuando surja un Error ó cuando quiera que no cambie de celdas el dbGrid ????
Como por ejemplo cuando el Articulo no exista, hacer que no avance de celda, así como se hace en el OnValidate al mandar un "Abort", será la misma instrucción para el evento que usted me dice????

roman 09-09-2004 03:26:19

De acuerdo con jachguate. El evento más adecuado es OnSetText que está precisamente para eso, para hacer conversiones del dato que se guardará en la tabla.

Claro que lo ideal es que el DBGrid tuviera la propiedad CharCase al igual que los Edits de manera que el texto aparezca en mayúsculas al momento de irlo escribiendo.

Pero podemos lograrlo con un par de trucos sucios:

Código Delphi [-]
interface

type
  (* Declarar esto antes de la declaración del formulario *)
  TDBGrid = class(DBGrids.TDBGrid)
  protected
    function CreateEditor: TInplaceEdit; override;
  end;

  TForm1 = class(TForm)
    ...
  end;

  THackEdit = class(TCustomEdit);

implementation

function TDBGrid.CreateEditor: TInplaceEdit;
begin
  Result := inherited CreateEditor;
  THackEdit(Result).CharCase := ecUpperCase;
end;

// Saludos

jachguate 09-09-2004 17:17:54

Hola Agag.

Claro que el OnSetText no te servira para esto. Pero.... estas mezclando la lógica. Un asunto es mantener todo en mayúsculas, y otro muy diferente validar que un artículo (o cualquier otro dato relacionado) dado exista en la base de datos.

Para ello si has de valerte del OnValidate.

Hasta luego.

;)

AGAG4 10-09-2004 16:50:09

okii
 
Muchas Gracias a los dos por sus respuestas.... Lo voy a probar.

AGAG4 10-09-2004 16:56:18

oki
 
Gracias Sr. Roman, Sr. Cadeti, me funcionaron sus "trucos", y Gracias Sr. Jachguate por sus comentarios del OnValidate.... Les debo otra.


La franja horaria es GMT +2. Ahora son las 13:10:36.

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