Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cambiar foco desde otro form (https://www.clubdelphi.com/foros/showthread.php?t=34866)

Sandy656 24-08-2006 01:59:15

Cambiar foco desde otro form
 
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.



Código Delphi [-]
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

posible solución
 
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.


Código Delphi [-]
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:

Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 07:59:54.

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