PDA

Ver la Versión Completa : Cambiar foco desde otro form


Sandy656
24-08-2006, 01:59:15
Hola:

Bueno, ante todo agradecer a todos los foreros por la ayuda desinteresada que aportan y de la que tanto nos beneficiamos muchas personas como yo.

El problema que tengo es el siguiente:
Tengo un Form principal desde el que se abre otros forms secundarios, se realizan modificaciones y vuelve al form principal. Desde estos forms secundarios hay muchos edits con un botón de búsqueda a la derecha que despliega listas (clientes,proveedores.etc.). Mi intención es que cuando el cursor se encuentre en uno de estos edits, al pulsar la tecla 'flecha arriba', simule como si se hubiera hecho clic en el botón de búsqueda y se despliegue la lista. Sin usar el ratón.

Esto se hacerlo con la función FindNextControl desde el propio Form, pero para no repetir tanto la función en cada form, me gustaría hacer una función en el Form principal que sirva para todas. Pero siempre me busca el siguiente control de el Form principal y no de la Form desde el que se hace la llamada, aunque si me detecta el form y el componente. Este es el código que tengo.




procedure TP_Principal.EditConLista;
Var Forma:Tform;
Component,Component2:TwinControl;
begin
forma:=Screen.ActiveForm;
Component:=Screen.ActiveControl;
if component is TEdit then
begin
With Screen.Activeform do
begin
Component2:= FindNextControl(Screen.ActiveControl,True,True,False);
if (component2.ClassType=TSpeedButton)
and (Copy(Component2.Name,1,11)='BotonBuscar')Then MostrarListaAsociada;
end;
end;
end;





Gracias y un saludo.

Sandy656
24-08-2006, 04:19:18
Hola de nuevo.

He comprobado que el componente TSpeedButton no tiene la propiedad TabOrder y me es imposible localizarlo desde otro form con la función findNextControl. Sin embargo he conseguido lo que pretendía de esta otra forma que pongo aquí por si le sirve a alguien.

He puesto al componente TEdit el mismo Tag que al TSpeedButton que quiero enlazar. Todos los SpeedButton deben comenzar con el texto 'BotonBuscar'. Después hago las comprobaciones desde el TForm principal para evitar errores.

Para activar el botón y desplegar la lista se deben capturar todos los eventos desde el form principal, así cada vez que se pulse la tecla 'flecha arriba' desde cualquier form, si el cursor se encuentra dentro de un Edit y el tag del edit coincide con el tag de algún TSpeedButton del form donde está situado el edit, se lanza el evento OnClick del botón.

Seguro que hay formas más elegantes de hacerlo, pero bueno, esta es la que he encontrado.



procedure TP_Principal.EditConLista;
Var
a:Integer;
begin
if Screen.Activecontrol.ClassType=TEdit then
begin
For a:=0 to Screen.ActiveForm.ComponentCount-1 do
begin
if (Screen.ActiveForm.Components[a].Tag <>0)
and (Screen.ActiveForm.Components[a].ClassType=TSpeedButton)
and (Screen.Activecontrol.Tag=Screen.ActiveForm.Components[a].Tag)
and (Copy(Screen.ActiveForm.Components[a].name,1,11)='BotonBuscar') then
begin
(Screen.ActiveForm.Components[a] as TspeedButton).OnClick(Self);
exit;
end;
end;
end;
end;
















Un Saludo foreros.

roman
24-08-2006, 07:16:28
¿Nunca has usado Frames? Un Frame es similar a un Panel en cuanto a que contiene varios controles, pero a diferencia del panel, se puede diseñar independientemente de un formulario y- lo más importante -se puede reusar cuantas veces quieras y en donde sea. Esto es lo que yo utilizaría aquí, un frame que enmarque al botón y al edit.

Para crearlo vas al menú Archivo|New|Frame. Ta aparecerá una ventana muy similar a un formulario. Ahí colocas un Edit y un SpeedButton. En el evento OnKeyDown del botón pones:


if Key = VK_UP then
Self.BotonBuscar.Click;


Dale un nombre apropiado al frame, por ejemplo, FrameBusqueda. Ahora FrameBusqueda es muy similar a cualquier otro control y puedes colocar uno o más de ellos seleccionando la componente Frames en la pestaña Standard de la paleta de componentes.

Si tienes más de un frame diseñado, te aparecerá una lista para que escojas cuál deseas.

En el formulario aparecerá entonces una copia del frame que puedes programar como cualquier otro control. Así como actualmente has programado el eventoOnClick de cada SpeedButton, ahora haces lo mismo pero con el SpeedButton de cada FrameBusqueda que coloques. Hasta aquí no hay ganancia, pero todos los frames que pongas ya tendràn programado lo del KeyUp así que ya no hay nada más que hacer.

// Saludos

Sandy656
25-08-2006, 14:29:41
Hola:

La verdad que no conocía lo de los frames, investigaré porque tiene muy buena pinta y muchas posibilidades. Muchas gracias por tu respuesta.

Saludos.