Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Enviar teclas al teclado (https://www.clubdelphi.com/foros/showthread.php?t=1883)

albeiro_ospina 01-07-2003 23:17:24

Enviar teclas al teclado
 
Cordial saludo a todos,

Existe algún comando-función para enviar teclas al buffer del teclado???.

La idea es que cuando un control reciba el foco, en caso de que su contenido sea nulo, se envíen una serie de dígitos/letras a dicho control (por ejemplo un TEdit) y que el usuario complete dicho campo con el resto de información quedando preestablecido el inicio del campo y variable la parte final del mismo.


Gracias por su colaboracion.

roman 01-07-2003 23:31:28

¿Y no basta asignar los dígitos/teclas a la propiedad Text del TEdit?

// Saludos

delphi.com.ar 01-07-2003 23:42:31

Puedes usar keybd_event, o enviar un mensaje diciendo que la tecla está presionada.


Saludos!

albeiro_ospina 02-07-2003 00:38:27

Gracias por responder.

>>¿Y no basta asignar los dígitos/teclas a la propiedad Text del TEdit?


Básicamente, al hacer esto lo que obtengo es el campo con su contenido pero no puedo hacer que el usuario simplemente continúe digitando sobre el mismo campo. Quiero que el valor asignado quede al comienzo del campo y que el cursor quede ubicado enseguida del último caracter insertado para que continúe digitando el campo.


>>Puedes usar keybd_event, o enviar un mensaje diciendo que la tecla está presionada

Intenté usar keybd_event pero no sucedió nada. No sé que es lo que no funciona. Lo jice de la siguiente forma:

var caracter : Byte

begin
caracter := StrToInt('0');
keybd_event(caracter,0,0);
caracter := StrToInt('7');
keybd_event(caracter,0,0);
end;

El campo sigue vacío.

roman 02-07-2003 02:04:38

¿Y qué tal algo como

Código:

Edit1.Text := 'abc123';
Edit1.SelStart := Length(Edit1.Text);

Esto colocará el cursor al final del texto.

// Saludos

albeiro_ospina 02-07-2003 15:52:56

Al utilizar SelStart funciona pero el texto queda sombreado y si el usuario comienza a digitar sobreescribe el valor asignado y la idea es que se continúe con el contenido del campo. Para que no sobreescriba se obliga al usuario a presionar la tecla Flecha Derecha y entonces iniciar la digitación, y debido a que se requiere captura de alto número de formularios el impacto es alto.

Alguna sugerencia adicional??

Gracias

albeiro_ospina 02-07-2003 16:11:42

Cita:

Posteado originalmente por roman
¿Y qué tal algo como

Código:

Edit1.Text := 'abc123';
Edit1.SelStart := Length(Edit1.Text);

Esto colocará el cursor al final del texto.

// Saludos


Efectivamente funcionó y ahora hace lo que inicialmente deseaba. En este momento tengo una inquietud adicional:

Cómo hago para que esto mismo funcione no en TEdit sino en un DBGrid???

Gracias

jafl1965 02-07-2003 16:17:26

Pon la propiedad AutoSelect a false.

albeiro_ospina 02-07-2003 16:51:38

Cita:

Posteado originalmente por jafl1965
Pon la propiedad AutoSelect a false.
Estoy tratando de hacerlo pero no he encontrado dicha propiedad por ningún lado.

Al buscar en la ayuda, encuentro que AutoSelect es propiedad de aquellos objetos que heredan de TCustomEdit, y la grilla no pertenece a este grupo.

Alguna sugerencia???

delphi.com.ar 02-07-2003 17:06:16

Cita:

Posteado originalmente por albeiro_ospina
Intenté usar keybd_event pero no sucedió nada. No sé que es lo que no funciona.
Te recomiendo leer este Link http://www.clubdelphi.com/foros/arch...ic.php?t=20320

PD: Otra solución puede ser hacer un PASTE en un control!

Saludos!

jafl1965 02-07-2003 17:28:06

Perdón, lo del AutoSelect a false aplicaba para el Edit, es que coincidimos en la hora del post, y esa respuesta la puse para cuando decías no te funcionaba el SelStart.
Lo siento, para Grid, no sé cómo hacer.
Saludos....

andres1569 02-07-2003 19:38:39

Para conseguir que al entrar en cada celda de un DBGrid lo haga en modo edición, como si pulsaras la tecla F2, aparte de activar dgEditing y dgAlwaysShowEditor en Options, hay que recurrir al método EditorMode de la clase TCustomGrid, que logra que aparezca el cursor parpadeando al final, pero éste es protected. Así que una forma de solucionarlo es declarar una clase que haga de intermediaria:
Código:

TMyGrid = class(TCustomGrid)
  public
    property EditorMode;
  end;

El método debe aplicarse cada vez que se cambia de celda. Un problema de los DBGrids es que aunque permiten detectar cuándo se ha cabiado de columna, no así de fila. Debe haber otras soluciones pero se me ocurre que puedes situar un TDataSource ligado al mismo DataSet (o usar el mismo DataSource que el DBGrid si se encuentra en el mismo Form) e interceptar cuándo se ha cambiado de registro. Éste sería el código:
Código:

// interceptamos el OnColEnter del DBGrid
procedure TForm1.DBGrid1ColEnter(Sender: TObject);
var
  AField : TField;
begin
  TMyGrid(DBGrid1).EditorMode := TRUE;
  AField := DBGrid1.SelectedField;
  if (AField <> nil) AND (AField.FieldName = 'Poblacion') AND
    (AField.IsNull) then
  begin
    AField.DataSet.Edit;
    AField.AsString := 'Ciudad Real';
  end; 
end;

// interceptamos el evento OnDataChange del DataSource
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  if Field = nil then DBGrid1ColEnter(Sender);
end;


albeiro_ospina 03-07-2003 00:24:48

:) Gracias por responder.

La solución planteada por andres funciona perfectamente. Ya solucioné mi problema.

Quiero resaltar de esta respuesta, la claridad en su explicación y el hecho de insertar un ejemplo, datos con los cuales pude fácilmente dar solución a mi inquietud.


Nuevamente, mil gracias:cool:


La franja horaria es GMT +2. Ahora son las 07:24:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi