PDA

Ver la Versión Completa : Salto de Celdas y Filas con ENTER


Sóstrato
16-06-2003, 22:24:24
Hola,
quiero saber como salto de fila (row) en un dbgrid con ENTER al final de la fila. Salto de celdas con ENTER y tambien quiero hacerlo con las filas.

jhonny
16-06-2003, 22:35:01
Prueba este Trucomania:

begin
if Key = #13 then
if not (ActiveControl is TDBGrid) then begin
Key := #0;
Perform(WM_NEXTDLGCTL, 0, 0);
end
else if (ActiveControl is TDBGrid) then
with TDBGrid(ActiveControl) do
if selectedindex < (fieldcount -1) then
selectedindex := selectedindex +1
else
selectedindex := 0;
end;

recuerda poner la propiedad KeyPreview de la form a true.

marcoszorrilla
16-06-2003, 23:02:01
Prueba con este otro código a ver que te parece:


procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = vk_Return then
begin
if DBGrid1.SelectedIndex < Pred( DBGrid1.FieldCount ) then
begin
DBGrid1.SelectedIndex :=DBGrid1.FieldCount ;
end
else
begin
DBGrid1.SelectedIndex := 0;
//Flecha abajo es decir nuevo registro.
DBGrid1.Perform( wm_KeyDown, vk_Down, 0 );
end;
end;
end;


Un Saludo.

Roy
17-06-2003, 02:13:17
...tampoco tengo mucho tiempo en Delphi, pero me llama la atención la cantidad de líneas para algo que parece tan sencillo. En otro lenguaje que uso (cada vez menos....) existe una propiedad de sesión que permite asignarle al ENTER la propiedad del TAB, o algo así. Por el tiempo que uno desee, el ENTER funciona tal como lo haría el TAB. ¿ Alguien conoce algo parecido ? ¿ que el ENTER 'simule' un TAB cuando necesite ?

Roy

marcoszorrilla
17-06-2003, 08:03:33
Una cosa es que la tecla <Enter> actúe como Tab y otra lo que tu has preguntado que se refiere a una rejilla.

Si la tecla <Enter> simulara un <Tab> cuando pulses enter sobre un botón saltará al siguiente control y quedarían todos los botones inoperativos.

Fíjate en el código de Jhonny.

Bueno un saludo.

Diole cebada al mulo el buen cibulo........

"Sanmaniego"

Rox77
23-07-2003, 11:44:44
Hola.

Yo queria hacer algo parecido ha esto pero en un Edit, me esplico.

En el evento OnKeyPress del Edit tengo algo asi:

if Key = #13 then
begin
Key:=#0;
Perform(CM_Dialog,VK_TAB,0); -->(creo q es esto jeje ;) )
end;

Pero el caso que yo lo que quiero saber es: para detectar la tecla intro se usa #13 para escape #27 pero para las flechas de dirección???? cual es el codigo. Ademas veo que usais los nombres de las virtual keys como VK_TAB, VK_RETURN etc...pero yo he intentado esto

if Key = VK_DOWN y me dice que tarari q te vi .... alguien me hecha una mano.

Marcoszorrilla usa Key = vk_return y parece q le funciona pero a mi me da un error el compilador cuando he puesto el vk_down.

Ademas me he fijado q la Key de OnKeypress es tipo char y sin embargo en OnKeyDown es tipo Word.... puede ser esto???

Gracias...Salu2.

marcoszorrilla
23-07-2003, 18:12:13
The OnKeyDown handler can respond to all keyboard keys


procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key = VK_Down then
showMessage('Pulso flecha abajo');
end;



Un Saludo.

jachguate
23-07-2003, 18:36:56
Debes tener en cuenta que contas con tres mètodos relacionados con la pulsación de teclas:

OnKeyDown
OnKeyPress
OnKeyUp

OnKeyDown se ejecuta cuando el usuario pulsa una tecla (practicamente cualquiera de teclado, con excepción de las teclas alt, shift ctrl y la de windows creo yo).

OnKeyUp se lanza cuando el usuario suelta la tecla.

Estos eventos son muy útiles para programar juegos, por ejemplo, y además traen un conjunto llamado ShiftState donde podes ver si el usuario tiene presionado shift, alt o ctrl (o cualquier combinación de ellas).

No recuerdo exactamente si OnKeyPress se ejecuta en medio de estos otros dos o luego de OnKeyUp, pero lo hará solamente con las teclas que tienen un código ascii asociado.

Hasta luego.

;)

Rox77
24-07-2003, 12:14:46
Gracias... lo solucione con el OnKeyDown
poniendo

if key =vk_down then Table1.next;
if key= vk_up then table1.prior;

y me funciona a las mil maravillas era el evento... en onKeypress no se puede hacer esto no reconoce las constantes vk_ por la diferencia de tipos.

De nuevo Gracias a todos.

Por cierto esto lo uso en un Edit para recuperar el codigo de una tabla y debajo del edit tengo un grid q va listando el registro que se esta buscando en el edit si coincide o el mas parecido pero me gustaria hacerlo al estilo de las listas de Access en las qu vas tecleando y te sugiere (seleccionando solo el resto del texto) el campo que empieza por las letras q tu vas pulsando: no se si me entendeis->

si yo tengo en una tabla los codigos-> PATO PANTALON PATATA

y escribo en mi edit P en el edit automaticamente me aparece tras mi "P" ANTALON seleccionado y si pulso "R" me desaparece porque no hay ningun codigo que empieze con PR....

Esto como porras se hace??? ;)

Si alguien lo sabe que lo diga y no se lo guarde para el...jeje

Salu2.

marcoszorrilla
24-07-2003, 15:39:11
En el evento OnChange del Tedit:

MiTabla.FindNearest([Edit1.Text]);


Es necesario que la tabla esté indexada por el campo que queremos hacer la búsqueda incremental.

Supongo que es esto lo que quieres.

Un Saludo.

Rox77
25-07-2003, 16:42:46
Eso ya lo hago marcos a ver me explico .... tengo unos cuantos edit q uso para insertar lineas a una tabla

En el primer edit en el evento Onchange hago una busqueda en la tabla de articulos tal que asi

Table.FindKey[(Edit1.Text)] si esta busqueda encuentra lo que escribe el usuario en el edit lo muestra en los demas edit automaticamente y a la vez tengo debajo un grid q se va posicionando en el registro del edit...si la busqueda exacta falla el evento Onchange realiza una aproximada Table.FindNearest[(Edit1.Text)] lo cual posiciona el cursor en el registro mas parecido al que teclea el usuario en el edit.

Si el usuario pulsa intro (en el evento OnKeyPress ) simulo un Tab y ademas compruebo si la busqueda ha sido exacta y cargo los datos de la tabla a los edit esperando que introduzca que cantidad se quiere del articulo y si no es exacta cargo los datos de la busqueda aproximada.

Ademas en el evento OnKeyDown controlo que si el usuario pulsa las flechas de arriba o abajo es porq ha visto en el grid el articulo y lo selecciona del grib mientras cargo en los edit los datos de los articulos por los q se desplaza si pulsa intro pues ... le paso el control al edit de la cantidad.

Hasta aqui lo que hace mi aplicacion...y ahora lo que quiero que haga:

->>quiero que el edit se autocomplete con el codigo del articulo si existe mientras lo va tecleando (tipo access o el cuadro de busqueda del internet explorer o muchos otros...pero en un edit no en un lookupcombobox ni nada de eso) si el pulsa PA y el primer articulo de la base que coincide con PA es PATATA quiero que despues de PA le salga TATA seleccionado en el edit...y si sigue escribiendo y pulsa PAR y no hay ningun articulo que empieze por esas letras no muestre nada y cuando pulse intro solicite crearlo...no como hago ahora que cargo el mas parecido ..pero esq el mas parecido puede ser POTITOS....jeje.)


Creo que ahora esta mas claro...pufff...lo q pido.

Bueno lo he visto en aplicaciones comerciales asiq no puede ser imposible (p.ej: el TPV de IslaSoft hace lo que yo pido... como lo hace??? aaaaaaa....no se lo voy a preguntar a ellos no ;) )

Salud2.

marcoszorrilla
25-07-2003, 19:29:57
Prueba con este código, no lo termino porque hoy es fiesta y estoy un poco vago pero creo que básicamente te puede servir:

private
{ Private declarations }
MyBuffer:String;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key in['A'..'z','Ñ','ñ']then
MyBuffer:=MyBuffer + Key;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = Vk_Back then
MyBuffer:=Copy(MyBuffer,1,Length(MyBuffer) -1);
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
if Table1.FindKey([MyBuffer]) then
Edit1.Text:=Table1Nombre.AsString
else
begin
Table1.FindNearest([MyBuffer]);
Edit1.Text:=Table1Nombre.AsString;
Edit1.SelStart:=Length(MyBuffer);
Edit1.SelLength:=Length(Edit1.text);
end;
end;



Un Saludo.