PDA

Ver la Versión Completa : DBgrid sin el foco pero resaltando una fila


carlosCalle
17-09-2016, 02:44:02
hola a todos¡¡¡¡

espero que lean estas líneas........estoy tratando de hacer un Form que permita el ingreso de productos para hacer una venta.
la idea .. es .... usar un DBgrid enlazado a un dataset (uso Zeos con Mysql), mas abajo un TEdit, el cual debe tener el foco en todo momento, la idea es que este reciba los datos ingresados por un lector, pero en la grilla debe resaltar el ultimo registro ingresado y además al usar las teclas arriba y abajo se debe desplazar dentro de la grilla.... sin que pierda el foco el TEdit.

estoy usando Embarcadero® Delphi 10.1 Berlin (descarga gratuita) con win 7

ecfisa
17-09-2016, 06:11:29
Hola carlosCalle, bienvenido a los foros de Club Delphi :)

Como es costumbre, te invitamos a leer nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)

Según entiendo los requisitos que solicitas son:

El Edit debe tener el foco en todo momento
Cuando el Edit recibe datos estos deben añadirse a la tabla y el cursor quedar posicionado allí.
Los usuarios deberán poder desplazarse por los registros con las teclas arriba/abajo.

Ejemplo de un modo en que podrías hacerlo:

...
interface

procedure TForm1.FormCreate(Sender: TObject);
begin
el_Edit.TabOrder := 0;
// si hay otros controles, evitar el cambio de foco con Tab
// Ctrl1.TabStop := False;
// Ctrl2...
DBGrid1.Enabled := False;
end;

// no saldrán del edit con el mouse
procedure TForm1.FormActivate(Sender: TObject);
var
R : TRect;
begin
R := el_Edit.BoundsRect;
MapWindowPoints(Handle, 0, R, 2);
ClipCursor(@R);
end;

// controlar la teclas presionadas
procedure TForm1.el_EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
case Key of
VK_DOWN : DataSet.Next;
VK_UP : DataSet.Prior;
VK_RETURN : begin // se reciben datos
DataSet.Append;
DataSet.FieldByName('Campo-para-el_Edit').Value := el_Edit.Text; //(o la conversión correspondiente)
//DataSet.FieldByName...
//...
DataSet.Post;
end;
VK_ESCAPE : Close; // Salir
end;
end;

// restaurar área del mouse
procedure TForm1.FormDestroy(Sender: TObject);
begin
ClipCursor(nil);
end;

La situación no me quedó del todo clara, por lo que no voy a sugerirte algún método alternativo para la acción.

Saludos :)

carlosCalle
17-09-2016, 14:46:16
gracias por reponder y por la bienvenida.....voy hacer las pruebas¡¡¡¡

carlosCalle
17-09-2016, 23:48:43
gracias ECFISA ..en parte esta bien...es lo que se quiere hacer....pero por dos pequeñas obsevaciones.
al hacer next o prior al dataset atravez del las teclas ...se logra el objetivo... pero el registro el cual se mueve el indice (no se si es la palabra tecnica) dentro del datase.....no se resalta en el dbgrid.....(es cuando dbgrid tiene el foco y la opcion dgRowSelect esta true,, por defecto toda la fila esta resaltada en azul).
lo otro es cuando tedit contiene algun dato......el | se mueve dentro de la cadena de caracteres (no es tan importante).

chao y gracias ante mano !!!!!!

ecfisa
18-09-2016, 08:47:48
Hola carlosCalle.

A ver, fijate si te sirve con estos cambios:

...
interface

procedure TForm1.FormCreate(Sender: TObject);
begin
elEdit.TabOrder := 0;
// desactivar cambio de foco con Tab en otros controles.
// foo_Ctrl1.TabStop := False;
// ...
DBGrid1.Enabled := False;
end;

// no van a salir del edit con el mouse...
procedure TForm1.FormActivate(Sender: TObject);
var
R : TRect;
begin
R := elEdit.BoundsRect;
MapWindowPoints(Handle, 0, R, 2);
ClipCursor(@R);
end;

// OnDrawColumnCell
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
gr: TDBGrid;
begin
gr := TDBGrid(Sender);
if gdSelected in State then
begin
gr.Canvas.Brush.Color := clBlue;
gr.Canvas.Font.Color := clWhite;
gr.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;

// controlar que tecla se presionó
procedure TForm1.elEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
case Key of
VK_DOWN : begin
DataSet.Next;
Key := 0;
end;
VK_UP : begin
DataSet.Prior;
Key := 0;
end;
VK_RETURN : begin // recibe datos
DataSet.FieldByName('Campo-para-el_Edit').Value := el_Edit.Text; //(o la conversión correspondiente)
//DataSet.FieldByName...
//...
DataSet.Post;
end;
VK_ESCAPE : Close; // Salir
end;
end;

// restaurar área del mouse
procedure TForm1.FormDestroy(Sender: TObject);
begin
ClipCursor(nil);
end;

(recuerda que es un ejemplo y que seguramente tengas que adaptarlo)

Saludos :)

carlosCalle
20-09-2016, 14:16:21
genial resulto a la primera !!!!!!

te agradesco tu ayuda.......ahi te pido mas ayuda!!!!