Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Como hacer que el cursor vaya a un campo de un grid (https://www.clubdelphi.com/foros/showthread.php?t=77629)

jafera 13-02-2012 20:07:29

Como hacer que el cursor vaya a un campo de un grid
 
Hola compañeros.

Necesito hacer un proceso que me parece es mas complicado de lo que inicialmente creia.
Tengo un DBGrid que me muestra los campos de un dataset. Este dataset tiene dos valores DIVENDRES y DIUMENGE que solo adminten un caracter, quiero que sea S o N, así en mayusculas, en el dataset hago lo siguiente yme lo cambia:

Código Delphi [-]
 
procedure TF_ModulDades.ParticipacioDIVENDRESChange(Sender: TField);
begin
        if ParticipacioDIVENDRES.Value = 's' then
        begin
                ParticipacioDIVENDRES.Value:='S';
        end;
        if ParticipacioDIVENDRES.Value = 'n' then
        begin
                ParticipacioDIVENDRES.Value:='N';
        end;
        if (ParticipacioDIVENDRES.Value <> 'N') and (ParticipacioDIVENDRES.Value <> 'S') and
             (ParticipacioDIVENDRES.Value <> 'n') and (ParticipacioDIVENDRES.Value <> 's') then
        begin
                ShowMessage('Valor no vàlid, sols S o N');
        end;
end;

Pero cuando le coloco un valor que no sea s, n, S, N, me lanza el mensaje de valor no válido, pero y aquí viene el kit de la cuestión, no consigo borrar este valor y que el foco vuelva al campo erroneo.

He probado con un bookmark y no me guarda la linea, he probado con focuscontrol y pasa de mí.

Alguien sabe como puedo solucionarlo?
Tambien me gustaría que si me dejo el campo vacio, me obligara a llenarlo con un valor S o N, moviendo el foco a este campo.

Buenas tardes/noches.

Josep

roman 13-02-2012 20:24:36

¿Has probado hacer la validación en el evento OnValidate del TField?

// Saludos

jafera 13-02-2012 21:32:41

Gracias omán.

Si, fue lo primero que intente.

Lo que no consgo es volver el foco al campo erroneo para poder cambiarlo.

Saludos

roman 13-02-2012 21:49:39

Si lees la ayuda del evento OnValidate, verás que para rechazar un valor debes lanzar una excepción. Al hacer esto, el foco no debería perderse puesto que, de hecho, la validación se hace antes de que se abandone el control.

En tu caso, podrías hacer así el evento OnValidate de tu campo:

Código Delphi [-]
procedure TF_ModulDades.ParticipacioDIVENDRESValidate(Sender: TField);
begin
  ParticipacioDIVENDRES.Value := UpperCase(ParticipacioDIVENDRES.Value);
  if (ParticipacioDIVENDRES.Value <> 'S') and (ParticipacioDIVENDRES.Value <> 'N') then
    raise Exception.Create('Valor no vàlid, sols S o N');
end;

O sea, en lugar de un simple ShowMessage, lanzas una excepción.

// Saludos

jafera 13-02-2012 22:12:09

Gracias de nuevo.

Tampoco me funciona, ahora me lanza un error stack overflow desde el ide y me cierra la aplicacion desde el exe

Saludos

roman 13-02-2012 22:25:45

Mmmm. Sí, supongo. Es una tontería mía por querer optimizar sin pensarlo bien.

Intenta así:

Código Delphi [-]
procedure TF_ModulDades.ParticipacioDIVENDRESValidate(Sender: TField);
begin
  if (UpperCase(ParticipacioDIVENDRES.Value) <> 'S') and (UpperCase(ParticipacioDIVENDRES.Value) <> 'N') then
    raise Exception.Create('Valor no vàlid, sols S o N');
end;

En el evento OnValidate, no en el OnChange.

// Saludos

ecfisa 13-02-2012 22:32:10

Hola jafera.

Y si querés convertir a mayúsculas el valor antes de guardarlo, podés usar la línea (que copio del código de roman) en el evento BeforePost del TDataSet.
Código Delphi [-]
procedure TF_ModulDades.DataSetBeforePost(DataSet: TDataSet);
begin
  ParticipacioDIVENDRES.Value := UpperCase(ParticipacioDIVENDRES.Value);
end;

Saludos.

jafera 13-02-2012 23:06:17

Gracias de nuevo

Ahora ya no lanza el error stack overflow, me avisa de que el valor no es valido, pero si pongo un valor por ejemplo 'a' no e lo borra, se queda el cursor en el campo pero con el valor no válido.

Si pongo el valor 's' no hace el uppercase para convertirlo a 'S'

Saludos

ecfisa 13-02-2012 23:35:37

Cita:

Empezado por jafera (Mensaje 425088)
...si pongo un valor por ejemplo 'a' no e lo borra, se queda el cursor en el campo pero con el valor no válido.
Si pongo el valor 's' no hace el uppercase para convertirlo a 'S'

Si, por que si no te desplazas en el DBGrid para que guarde los cambios no se dispara el evento BeforePost. Para lo que buscas tendrías que usar el evento OnKeyPress del TDBGrid.

Código Delphi [-]
procedure TF_ModulDades.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if ((Sender as TDBGrid).SelectedField.FieldName = 'Nombre_del_Campo') and (UpCase(Key) in ['N','S']) then
    Key:= UpCase(Key)
  else
    Key:= #0;
end;

Saludos.

jafera 14-02-2012 02:59:46

Cita:

Empezado por ecfisa (Mensaje 425089)
Si, por que si no te desplazas en el DBGrid para que guarde los cambios no se dispara el evento BeforePost. Para lo que buscas tendrías que usar el evento OnKeyPress del TDBGrid.

Código Delphi [-]
procedure TF_ModulDades.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if ((Sender as TDBGrid).SelectedField.FieldName = 'Nombre_del_Campo') and (UpCase(Key) in ['N','S']) then
Key:= UpCase(Key)
else
Key:= #0;
end;

Saludos.

Con este código ahora no me deja escribir nada en el dbgrid, creo la nueva linea y cuando intento escribir en cualquiera de los campos se queda igual, es como si no estuviera en edición

Saludos

ecfisa 14-02-2012 20:09:06

Hola jafera.

Parece que yo también optimicé sin pensar mucho... :o:)

Debería haber sido:
Código Delphi [-]
procedure TF_ModulDades.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if ((Sender as TDBGrid).SelectedField.FieldName = 'Nombre_del_Campo') then
    if(UpCase(Key) in ['N','S']) then
      Key:= UpCase(Key)
    else
      Key:= #0;
end;

Saludos.

jafera 15-02-2012 00:41:29

Este si funciona.

Problema solucionado.

Gracias mil

Josep


La franja horaria es GMT +2. Ahora son las 04:35:55.

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