Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   DBgrid sin el foco pero resaltando una fila (https://www.clubdelphi.com/foros/showthread.php?t=90848)

carlosCalle 17-09-2016 02:44:02

DBgrid sin el foco pero resaltando una fila
 
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

Según entiendo los requisitos que solicitas son:
  1. El Edit debe tener el foco en todo momento
  2. Cuando el Edit recibe datos estos deben añadirse a la tabla y el cursor quedar posicionado allí.
  3. Los usuarios deberán poder desplazarse por los registros con las teclas arriba/abajo.
Ejemplo de un modo en que podrías hacerlo:
Código Delphi [-]
...
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:
Código Delphi [-]
...
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!!!!


La franja horaria es GMT +2. Ahora son las 06:58:46.

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