PDA

Ver la Versión Completa : Enviar teclas al teclado


albeiro_ospina
01-07-2003, 23:17:24
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


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
Posteado originalmente por roman
¿Y qué tal algo como


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
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
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/archivo/viewtopic.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:
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:
// 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: