PDA

Ver la Versión Completa : ¿Se puede dejar fija o bloquear la fila seleccionada en un dbgrid?


Angel Fernández
25-07-2008, 16:55:53
Saludos al foro.

Quisiera preguntar una cosilla que no sé si es posible. Como digo en el título, ¿se puede bloquear o dejar fija la fila seleccionada en un DBGrid? Es decir, yo tengo una fila seleccionada y cuando muevo la rueda del ratón encima del dbgrid, la fila seleccionada (el registro activo) se mueve con el movimiento del ratón.
Lo que quiero es que la fila seleccionada quede fija o bloqueada aunque mueva la rueda del ratón o mueva la barra de desplazamiento vertical y sólo cambie la fila seleccionada cuando haga click en otra fila (como funciona un listview o un listbox por ejemplo).
¿Se puede hacer?

Gracias de antemano.

yugi789
21-07-2011, 22:56:16
Perdon por revivir pero tengo el mismo problema. Por favor ayuda.

ecfisa
22-07-2011, 00:56:53
Hola yugi789.

Probá de este modo:

type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
...
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
procedure MouseEvent(var Msg: TMsg; var Handled: Boolean);
public
end;

...

implementation

(* CAPTURAR MENSAJE EVENTO MOUSE *)
procedure TForm1.MouseEvent(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.Message = WM_MOUSEWHEEL then
Handled:= True;
end;

(* DESACTIVAR MOUSEWHEEL Y SCROLLBAR VERTICAL *)
procedure TForm1.FormShow(Sender: TObject);
begin
Application.OnMessage:= MouseEvent;
EnableScrollBar(DBGrid1.Handle,SB_VERT,ESB_DISABLE_BOTH); // Scrollbar desactivado
end;

...

(* ACTIVAR MOUSEWHEEL Y SCROLLBAR VERTICAL *)
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
EnableScrollBar(DBGrid1.Handle,SB_VERT,ESB_ENABLE_BOTH); // ScrollBar activado
Application.OnMessage:= nil;
end;


Edito: Si querés que también ignore las teclas arriba/abajo deberías evaluarlas en el evento OnKeyDown del DBGrid.

Saludos.

yugi789
23-07-2011, 01:50:59
Muchas gracias por responder. Lamentablemente,que deshabilite la barra no me sirve. Necesito que el registro seleccionado(Rowselect) permanesca fijo mientras me desplazo con la barra. Saludos.

ecfisa
23-07-2011, 03:53:16
Hola yugi789.

Había entendido que la selección debería quedar fija hasta que se hiciera click sobre otra fila como dice el mensaje:

Lo que quiero es que la fila seleccionada quede fija o bloqueada aunque mueva la rueda del ratón o mueva la barra de desplazamiento vertical y sólo cambie la fila seleccionada cuando haga click en otra fila


Pero a ver si entiendo el nuevo planteo. ¿ Querés que el DBGrid desplace sus líneas (registros) y que no cambie la selección realizada con el Click ?

Saludos.

yugi789
23-07-2011, 04:07:35
Hola yugi789.

Pero a ver si entiendo el nuevo planteo. ¿ Querés que el DBGrid desplace sus líneas (registros) y que no cambie la selección realizada con el Click ?

Saludos.
Si eso exactamente. (Para desplazarme quiero utilizar la barra o teclas o la rueda del mouse). Saludos.

ecfisa
23-07-2011, 04:35:31
Hola yugi789.

El TDBGrid contiene el número de registros que son visibles. Cuando se hace un desplazamiento y necesita mostrar otros datos los obtiene del TDataSet solicitándolos a el TDataSource asociado y por supuesto perdíendose la selección actual.

La única manera que se me ocurre es agregando al DataSet un campo bivalente que funcione como bandera y mediante el click tome los valores de seleccionado o no.
Luego valerse del evento OnDrawColumnCell para pintar la fila si el valor figura como seleccionado.

Un saludo.