[Lazarus-es] No cambiar de columna en dbgrid

Jesus R. jesusrmx en gmail.com
Jue Jul 13 16:49:39 CEST 2017


Hola Ismael, seguramente habrán un par de cosas que podrías hacer para
lograr lo que quieres de una forma mas directa, pero me parece
apropiado hacerte una sugerencia para esos casos como en que aquí nos
ocupa. En este punto te encuentras procesando un evento OnEditingDone,
sin un análisis muy detallado es difícil saber que ocurrió antes y que
ocurrirá después, solo sabemos que en algún punto el grid seleccionará
el campo siguiente. Entonces estamos en la situación en la que se
desea alterar el comportamiento pero no sabemos en medio de cuantas
capas de procesamiento estamos. En estos casos sería muy útil
simplemente dejar que las cosas sucedan y al primer momento disponible
tomar acción. Para ello hay dos formas, algunos usan Timers pero en
realidad no soy fan de esa técnica y por eso te sugiero una segunda
alternativa. Lazarus cuenta con un método de postergar una acción de
tal manera que se efectué cuando haya terminado de hacer lo que sea
que esté haciendo, ya sea una interacción con el usuario mediante el
ratón o el teclado, o alguna otra cosa. Para ello lo que se tiene que
hacer es usar el procedimiento Application.QueueAsyncCall, ésta toma
dos parámetros: un método y un dato cuyo valor puede ser a nuestra
conveniencia o 0. El método es el procedimiento que la aplicación
llamará justo cuando no tenga otra cosa mas que hacer. Se usa de la
siguiente forma:

// agregar RegresarAColumnaCantidad en la declaración de  Tfvsal
....
   procedure RegresarAColumnaCantidad(Data: PtrInt);
....

// poner en la fila de espera de métodos a procesar ....
....
Application.MessageBox('La cantidad a dar salida no puede ser mayor a
la existencia.' , pchar(Self.Caption), MB_ICONINFORMATION);
Application.QueueAsyncCall(@RegresarAColumnaCantidad,  0);
....

// luego o antes como quieras, la implementación de RegresarColumnaACantidad
procedute Tfvsal.RegresarAColumnaCantidad(Data: PtrInt);
begin
  dbg.SelectedIndex := NUMERODECOLUMNA;
end;

y eso teóricamente :), debería funcionar.

Como un tip extra, si colocas el cursor el algún punto de la palabra
@RegresarAColumnaCantidad y presionas SHIFT+CTRL+C, Lazarus no solo
declarará el método por ti, sino también introducirá una
implementación vacía lista para tu línea "dbg.SelectedIndex :=
NUMERODECOLUMNA;"

Saludos.

Jesus Reyes A.


Más información sobre la lista de distribución Lazarus-es