Pregunta

He hecho todo lo posible y no puedo entender qué pasó aquí. Funcionó bien en Delphi 4. Después de actualizar a Delphi 2009, no sé si es así como debería funcionar, o si es un problema:

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

 ingrese la descripción de la imagen aquí

Observe que cada palabra en el menú principal y el submenú Archivo tiene una letra subrayada. Se supone que es así. Esta letra subrayada se llama Accelerator Key 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 el elemento del submenú con el teclado en lugar de con el mouse.

Los obtienes de esta manera usando el " & amp; " carácter como parte de la leyenda del elemento, por ejemplo: Guardar & amp; Como ...

Cuando ejecuto mi aplicación y uso el mouse para abrir el menú Archivo, se ve así:

 ingrese la descripción de la imagen aquí

Los caracteres están subrayados en el menú principal, pero no están subrayados en el menú Archivo.

Si, en cambio, uso la tecla Alt-F para abrir el submenú Archivo, entonces se ve correcto así:

 ingrese la descripción de la imagen aquí

y todas las letras de la tecla del acelerador están correctamente subrayadas.

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

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


Noviembre de 2009 (un año después): parece que mghie llegó a la raíz de esto y descubrió el problema. Vea su respuesta aceptada a continuación.

¿Fue útil?

Solución

Existe una configuración estándar de Windows (debajo de las propiedades de visualización) 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. Acabo de intentarlo, y un TForm simple con un elemento de menú muestra el acelerador, pero tan pronto como agrego una TImageList y establezco el ImageIndex del elemento de menú único, o simplemente establezco OwnerDraw en verdadero, el subrayado del acelerador desaparece. Supongo que realmente es un error en el VCL.

Por cierto, esto está en Windows XP.

Solución temporal :

He depurado esto usando Delphi 2009 en Windows XP 64, y la causa raíz de los aceleradores que faltan parece ser que Windows envía mensajes WM_DRAWITEM con el conjunto de banderas ODS_NOACCEL , que no debería si el sistema está configurado para mostrar aceleradores en todo momento. Entonces, podría decir que no es un error de VCL, sino un problema de Windows con el cual el VCL no funciona.

Sin embargo, puede solucionarlo en su propio código, solo necesita restablecer el indicador antes de pasar el mensaje al VCL. Anular el proceso de la 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;

Este es solo un código de demostración, no debe llamar a SystemParametersInfo () cada vez que se recibe un mensaje WM_DRAWITEM , pero una vez al inicio del programa, y ??luego cada vez que su programa recibe un mensaje WM_SETTINGCHANGE .

Otros consejos

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

The Old New Thing: ¿Por qué Windows oculta los aceleradores de teclado? y enfocar rectángulos por defecto?

Parece que Delphi 4 no era compatible con esta función de Windows.

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

No estoy seguro de cómo hacerlo en Vista.

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, por cierto ...
Debo confesar que no presté atención antes de su pregunta. Gracias por señalarlo.

Como Jim McKeeth señaló anteriormente (correctamente), esto es "por diseño". comportamiento. Si los menús se activan mediante 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 los aceleradores en todo momento, pero una prueba rápida con esa opción cambiada confirma que los menús tampoco deben mostrar subrayados (Visual Studio respondió como esperaba, no hay subrayados cuando uso el mouse). Sin embargo, Microsoft Office ignora esta configuración y siempre muestra los subrayados. Por lo tanto, parece un error en la forma en que se dibujan los menús en Delphi (no tengo ninguna experiencia con Delphi).

También encontré la opción para Vista: http://www.vistax64.com/vista-general/42125-always-show-menu-underline-keyboard-accelerators.html

  

Puede activar esto en el nuevo Centro de facilidad de acceso (vaya a Control   Panel, haga clic en Facilidad de acceso y luego haga clic en Centro de facilidad de acceso). 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 Subrayados y acceda   casilla de verificación de teclas.

Mientras investigaba más, encontré este error relacionado en los foros de Delphi: http: //qc.codegear.com/wc/qcmain.aspx?d=37403

Parece que en su caso, las ventanas secundarias (los menús dibujados) no reciben o no manejan el mensaje WM_UIUPDATESTATE desde su ventana principal, que es lo que causa el redibujado con aceleradores.

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