PDA

Ver la Versión Completa : Duda con Shortcut


Sonic
16-12-2004, 14:57:24
Hola a todos!!

Tengo una duda-problema con una TAction, vereis:

A dicha TAction le tengo asociado un Shortcut de manera que la acción se realice cada vez que se pulsa el cursor hacia izquierda (por ejemplo). Y funciona a la perfección, el problema es que dentro de mi aplicación la pulsación de la tecla izquierda ya siempre hace saltar la funcion de la TAction, y no puedo usar el cursor para moverme por los campos de un TStringGrid que tengo.

Se me ocurrió añadir al final de la función que responde al cursor un SendMessage, que enviara dicha pulsación al Handle del TStringGrid correspondiente, pero lo que hace es cambiar de Campo en lugar de mover el cursor.

Si alguien pudiera proponerme una solución que no pasara por sustituir la TAction por otro método (OnKeyPress o usando Hooks, esta última creo que es buena opción pero conlleva mucho cambio en el código) le estaría muy agradecido.

Muchas Gracias!

Sonic
16-12-2004, 16:54:29
He encontrado por ahí en internet código en delhpi que creo que me serviría de saber adaptarlo a C++, pero la verdad es que hay algunas cosas que no entiendo.

Lo del SendMessage no funciona pq se lo mando al StringGrid, mi primera idea fue intentar mandárselo al TEdit que incluye dicho componente pero no encontré el modo. Resulta que TStringGrid hereda de TCustomGrid que tiene una propiedad llamada ImplaceEditor que es un puntero al TEdit. Problema....ImplaceEditor es una propiedad protegida y no puedo acceder a ella. Sin embargo en Internet he econtrado cierto código que según parece es capaz de acceder a dicha propiedad. Os lo pongo aquí a ver si alguién consigue explicármelo.


{
The following code allows you to position the caret
in a cell (InplaceEditor) of a StringGrid.
We need a Cracker class to access the InplaceEditor.
}

type
TGridCracker = class(TStringGrid);

{...}

implementation

{...}

procedure SetCaretPosition(Grid: TStringGrid; col, row, x_pos: Integer);
begin
Grid.Col := Col;
Grid.Row := Row;
with TGridCracker(Grid) do
InplaceEditor.SelStart := x_pos;
end;

// Get the Caret position from the focussed cell
function GetCaretPosition(Grid: TStringGrid): Integer;
begin
with TGridCracker(Grid) do
Result := InplaceEditor.SelStart;
end;

// Example:

// Set the focus on col 1, row 3 and position the caret at position 5


procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.SetFocus;
SetCaretPosition(StringGrid1, 1, 3, 5);
end;


¿Qué es TGridCracker? ¿Y como se usa en C++?

Muchas Gracias!

Sonic
16-12-2004, 18:13:43
Bueno aunque no he llegado a entender el código en Delphi. Ya he llegado a una solución. Al final (era lo más obvio y cupongo que es lo se hace en el código delphi anterior). He creado una clase que hereda de TStringGrid y le he añadido un método que me devuelva la propiedad que necesito usar. ¿Sencillo no?

Sin embargo nunca creo ninguna instancia de la nueva clase sino que le hago un overcast al puntero del StringGrid original y así puedo usar el método que he creado.

Bueno, muchas gracias a todos aquellos que hayais pensado en ayudarme!

Sonic
16-12-2004, 18:14:29
QUE GUAY!!! UN HILO PARA MI SOLO
JAJAJAJA:D:D:D

Saludos a todos!!!