2008-11-11 19 views
7

He intentado lo mejor posible y no puedo entender lo que sucedió aquí. Funcionó bien en Delphi 4. Después de actualizar a Delphi 2009, no sé si esta es la manera en que se supone que funciona, o si es un problema:Teclas del acelerador de menús no aparecen (Delphi 2009)

Así es como se ve el menú de mi programa en el modo de diseño bajo Delphi 2009:

alt text http://www.beholdgenealogy.com/img/menu1.gif

en cuenta que cada palabra en el menú principal y el submenú de archivos tienen una letra subrayada. Se supone que es así. Esta letra subrayada se llama tecla de aceleración y es estándar en las aplicaciones de Windows para que pueda usar la tecla Alt y esa letra para seleccionar rápidamente el elemento del menú y luego submenú elemento con el teclado en lugar de con el mouse.

Usted los consigue de esta manera utilizando el carácter "&" como parte de la leyenda de la partida, por ejemplo: Guardar como ... &

Cuando ejecuto mi aplicación, y utilizar el ratón para abrir en el menú archivo, que se ve así:

alt text http://www.beholdgenealogy.com/img/menu2.gif

los caracteres están subrayados en el menú principal, pero no están subrayados en el menú archivo.

Si por el contrario, utilizo la tecla Alt-F para abrir el submenú Archivo, entonces parece correcta la siguiente manera:

alt text http://www.beholdgenealogy.com/img/menu3.gif

y todas las cartas clave Accelerator están subrayadas correctamente.

He jugado con la opción AutoHotKeys, pero ese no es el problema.

¿Alguien ha tenido este problema antes? ¿Es el ejemplo en la 2da imagen el comportamiento correcto que no conozco? ¿O hay alguna opción o error de codificación que podría haber pasado por alto?


nov 2009 (un año después): mghie parece haber llegado a la raíz de este y pensamos que el problema. Vea su respuesta aceptada a continuación.

Respuesta

7

Hay una configuración estándar de Windows (en propiedades de pantalla) para ocultar normalmente esos aceleradores a menos que se mantenga presionada la tecla Alt. Eso explicaría por qué abrir el menú con Alt + F10 los muestra por usted. Tal vez esa es la causa?

[EDITAR]: No, no lo es. Lo intenté, y un TForm simple con un elemento de menú muestra el acelerador, pero tan pronto como agregue un TImageList y establezca el ImageIndex del elemento del menú individual, o simplemente configure OwnerDraw en verdadero, el subrayado del acelerador desaparecerá. Supongo que realmente es un error en el VCL.

Por cierto, esto es en Windows XP.

Solución:

He depurado esto utilizando Delphi 2009 en Windows XP 64, y la causa principal de los aceleradores que faltan parece ser que Windows envía WM_DRAWITEM mensajes con el conjunto ODS_NOACCEL bandera, que se shouldn' t si el sistema está configurado para mostrar aceleradores en todo momento. Entonces, podría decirse que no es un error de VCL, sino un problema de Windows que el VCL no funciona.

Sin embargo, puede solucionarlo en su propio código, solo necesita restablecer el indicador antes de pasar el mensaje a la VCL. Anular el procedimiento de ventana

protected 
    procedure WndProc(var Message: TMessage); override; 

así:

procedure TYourForm.WndProc(var Message: TMessage); 
const 
    ODS_NOACCEL = $100; 
var 
    pDIS: PDrawItemStruct; 
    ShowAccel: BOOL; 
begin 
    if (Message.Msg = WM_DRAWITEM) then begin 
    pDIS := PDrawItemStruct(Message.LParam); 
    if (pDIS^.CtlType = ODT_MENU) 
     and SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, @ShowAccel, 0) 
    then begin 
     if ShowAccel then 
     pDIS^.itemState := pDIS^.itemState and not ODS_NOACCEL; 
    end; 
    end; 
    inherited; 
end; 

Esto es sólo el código de demostración, no debe llamar SystemParametersInfo() cada vez que se recibe un mensaje WM_DRAWITEM, pero una vez al inicio del programa, y ​​luego cada vez su programa recibe un mensaje WM_SETTINGCHANGE.

+0

También estoy en Windows XP. Después de estas respuestas y mi pensamiento sobre esto, y su ayuda, estoy de acuerdo que puede ser un error en el VCL. Lo reportaré. – lkessler

+0

Reportado como un error en Embarcadero: http://qc.codegear.com/wc/qcmain.aspx?d=68816 – lkessler

+0

Por cierto, tengo el mismo comportamiento con Delphi 2007. – mghie

1

No creo que sea un error generado por Delphi ya que tiene el mismo comportamiento con el Bloc de notas en Vista. También en Delphi en sí mismo BTW ...
Debo confesar que no presté atención antes de su pregunta. Gracias por mencionarlo.

+0

No. En Delphi 2009, todos los elementos del submenú muestran la tecla del acelerador, incluso cuando selecciono el menú con el mouse. Es por eso que pensé que era una configuración que tenía, en lugar de Delphi o el sistema operativo. Definitivamente es un stramge, he pasado aproximadamente 4 horas tratando de arreglarlo. – lkessler

6

Es una "característica" introducido con Windows 2000:

La Vieja Nueva cosa: Parecería Why does Windows hide keyboard accelerators and focus rectangles by default?

que Delphi 4 no soporta esta característica de Windows.

Para que los menús 2000 y XP muestren las teclas aceleradoras, haga clic con el botón derecho en un lugar vacío en el escritorio, elija Propiedades, haga clic en la pestaña Aspecto y en Efectos, desmarque Ocultar letras subrayadas para la navegación del teclado hasta que presione la tecla Alt. Haga clic en Aceptar dos veces.

No estoy seguro de cómo hacerlo en Vista.

+0

Pensé que tenías la respuesta. Pero, desafortunadamente, cuando miré la opción "Ocultar letras subrayadas" (nunca antes lo había sabido), descubrí que estaba desmarcada. – lkessler

+0

¿Qué sistema operativo? Sus capturas de pantalla se ven como XP. Acabo de probarlo en XP y funciona (desmarque la opción y se muestra la tecla del acelerador). Tal vez necesite reiniciar. –

0

Como Jim McKeeth señaló anteriormente (correctamente), esto es un comportamiento "por diseño". Si los menús se activan a través de la acción del teclado, se deben mostrar los aceleradores, pero si se activan con el mouse, los aceleradores no se muestran intencionalmente.

Tengo mi XP configurado para mostrar aceleradores en todo momento, pero una prueba rápida con esa opción modificada confirma que los menús tampoco deberían mostrar subrayados tampoco (Visual Studio respondió como esperaba, no subraya cuando usa el mouse). Sin embargo, Microsoft Office ignora esta configuración y siempre muestra los subrayados. Por lo tanto, parece un error sobre cómo se dibujan los menús en Delphi (no tengo ninguna experiencia con Delphi).

me encontré con la opción de Vista, así: http://www.vistax64.com/vista-general/42125-always-show-menu-underline-keyboard-accelerators.html

Puede activar esta opción en el nuevo Centro de accesibilidad (Vaya a Control de panel, haga clic en Facilidad de acceso y haga clic en Centro de accesibilidad) En el Centro de facilidad de acceso, haga clic en Hacer que el teclado sea más fácil de usar, y en la parte inferior seleccione los atajos de teclado Subrayar y acceda a la casilla de verificación .

Mientras se hace más investigación me encontré con este error relacionado en los foros de Delphi: http://qc.codegear.com/wc/qcmain.aspx?d=37403

Parece que en su caso, las ventanas hijas (los menús elaborados) no están recibiendo o no están manejando mensaje de WM_UIUPDATESTATE su ventana primaria, que es lo que causa el redibujado con aceleradores.

+0

"Parece que en su caso las ventanas secundarias (los menús dibujados) no reciben o no están manejando el mensaje WM_UIUPDATESTATE desde su ventana principal, que es lo que causa el redibujado con aceleradores" - ¡Exactamente! ¡Ese es el error! – lkessler

Cuestiones relacionadas