Pregunta

Estoy utilizando Delpho 2006. El Escenario:

En el módulo de datos tengo una ActionList. Una de las acciones tiene un acceso directo Ctrl + F4 y quiero tener un acceso directo secundaria Ctrl + W. He intentado todo lo siguiente:

Adición Ctrl + W a la lista de las acciones SecondaryShortcut en el IDE.

Adición de que en el procedimiento de DataModuleCreate utilizando

ActFileCloseFile.SecondaryShortCuts.Add('Ctrl+W');

o

ActFileCloseFile.SecondaryShortCuts.AddObject('Ctrl+W',
  TObject(Menus.ShortCut(87, [ssCtrl])));

El uso de ambos de estos métodos en el procedimiento Crear o FormShow de la forma en que se va a utilizar.

El acceso directo primario siempre funciona, pero no el secundario.

Cuando pongo la ActionList en el formulario principal en lugar del módulo de datos, funciona con sólo añadir Ctrl + W en el IDE. ¿Qué hago mal?

¿Fue útil?

Solución

La solución más elegante encontrado hasta ahora es la siguiente:

En el formulario que desea manejar la SecondaryShortCut, agregar esto al caso OnShortCut:

procedure TMyForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  Handled := dmDataModule.ActionList1.IsShortCut(Msg);
end;

Alternativa:

(Esto no es una solución real, pero una solución.)

Ponga una lista de acciones en el formulario que tiene una acción idéntica a la del módulo de datos. En sus ejecutar y actualizar eventos sólo reenvía los eventos a la acción módulo de datos. Los menús de la forma de uso de la acción local.

En este caso es suficiente añadir Ctrl + W para la propiedad SecondaryShortCuts utilizando el IDE.

Es evidente que, cuando la acción sobre los cambios del módulo de datos, tengo que cambiar todas las acciones locales también.

Otros consejos

No es una solución real, pero si crea el módulo de datos desde dentro del formulario principal funciona:

procedure TMainForm.FormCreate(Sender: TObject);
begin
  FDataModule := TMyDataModule.Create(self);
  TMyButton.Action := FDataModule.TheAction;
end;


procedure TMyDataModule.DataModuleCreate(Sender: TObject);
begin
  TheAction.SecondaryShortCuts.Add('Ctrl+W');
end;

Creo que los atajos son manejados por la forma que tiene el foco actual. Así que yo probablemente obtendrá los mismos problemas si está utilizando en otra forma.

Respuesta corta:. Acciones atajos no hacer automáticamente fuego a través de formularios y datos de módulos

Si usted sigue las instrucciones de la pregunta, usted encontrará que ni siquiera los fuegos de atajos primarios. Esto se debe a un paso clave se ha quedado fuera de las instrucciones. Que servirá para explicar por qué OP experimentó el disparo atajo primario y no el secundario.

Si incluye los pasos adicionales:

  • Añadir un menú al formulario.
  • y vincular un elemento de menú a la acción.

A continuación, el principal de acceso directo será capaz de disparar la acción. Esto se debe a que el componente de acción empuja su configuración para el elemento de menú (incluyendo el ShortCut propiedad). Sin embargo, TMenuItem no implementa el concepto de secundarias atajos. Razón por la cual se trabaja y no al contrario.


pausa para considerar una aplicación con muchas formas y de datos-módulos; y la implicación de acción si atajos pudiera disparar a través de todos ellos. Debe ser bastante obvio que no debería ser capaz de automáticamente fuego sin código explícito para permitirlo. Usted no quiere una forma de fondo haciendo un montón de cosas porque su configurado teclas de acceso directo pasar a ser presionado en el contexto de otros trabajos relacionados.

La documentación rel="nofollow"> href="http://docwiki.embarcadero.com/Libraries/en/Vcl.ActnList.TActionList" señala el beneficio de poner listas de acciones en los datos -modules. Sin embargo, no parece ofrecer ninguna explicación de cómo utilizar las acciones con atajos en un módulo de datos en correctamente . Ciertamente, no se menciona nada en los lugares previstos, a saber: método abreviado y SecondaryShortcuts . (Que estaría decepcionado, pero mis expectativas de la documentación decente han sido arrastrados bastante bajo.)

Así que ...

¿Qué debe que hacer para conseguirlos acciones con atajos de trabajo a través de formularios y datos de los módulos?

He hecho un poco de investigación y encontró algunas opciones. Como siempre, evaluar la relación de equilibrio a lo que está tratando de lograr.

  • Cuando se le cae una lista de acciones en un formulario (no principal), todos los atajos funcionan como se esperaba. Este es el escenario más común y se aplica cuando las acciones son locales y la forma específica.

  • Cuando se le cae una lista de acciones en el formulario principal, todos los atajos serán capaces de disparar desde cualquier otra forma. Esto es grande para toda la aplicación atajos como la apertura de otras formas.

Nota: Hay una secuencia de prioridades en cuanto a donde un atajo se prueba primero. Así que si la forma activa tiene un atajo a juego uno en el formulario principal, el atajo será procesada localmente. Y la principal forma comprensible que no lo obtendrá.

  • Cuando una forma se prueba para ver si se maneja un atajo, todos los componentes de propiedad se ha comprobado también. (Esto es, de hecho, ¿por qué los dos primeros por encima de trabajo.) Esto significa que el simple ajuste de la Owner de los datos del módulo de manera apropiada permitirá a sus atajos que se aplican a su forma elegida.

es decir. En lugar de:

Application.CreateForm(TDataModule1, DataModule1);

Puede utilizar lo siguiente:

DataModule1 := TDataModule1.Create(LocalForm);

Sin embargo, puesto que cada instancia de un módulo de datos puede tener un solo propietario: habría que crear varias instancias para permitir que varias formas comparten los atajos. Si se trata de una opción depende de sus circunstancias. Sin embargo, también se puede hacer la forma principal el dueño de su técnica de módulo que sería algo equivalente a la segunda opción anterior.

  • La última opción que proporciona el máximo control es la propia respuesta de OP. Es decir. Cualquier forma que se necesita para apoyar "atajos externos" puede controlar el evento OnShortCut con el siguiente código:

Como puede verse en el ejemplo de código se puede delegara múltiples listas de acciones en diferentes lugares de acuerdo con la prioridad que elija.

procedure TMyForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  Handled := DataModule1.ActionList3.IsShortCut(Msg);
  Handled := Handled or DataModule2.ActionList1.IsShortCut(Msg);
  Handled := Handled or DataModule1.ActionList1.IsShortCut(Msg);
end;

La acción se está tragado por la forma ... Si quieres una forma secundaria / marco / módulo de datos para manejar la acción ... Hay que desactivar el ActionList de la primera primaria ...

Form1.ActionList1.State: = asSuspended;

DataModule1.ActionList1.State: = asNormal;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top