2008-09-25 19 views
6

Estoy usando un menú emergente en Delphi. Quiero usarlo en un modo de "grupo de radio", donde si el usuario selecciona un elemento, se marca y los otros elementos no se marcan. Intenté usar la propiedad AutoCheck, pero esto permite verificar varios elementos. ¿Hay alguna manera de configurar el menú emergente para que solo se pueda verificar un elemento?Delphi Menú emergente cheques

Respuesta

5

Zartog tiene razón, pero si desea mantener la casilla de verificación, asigne este evento a cada elemento en el menú emergente.

Tenga en cuenta que este código es un poco peludo porque no depende de saber el nombre de su menú emergente (por lo tanto, buscándolo con "GetParentComponent").

procedure TForm2.OnPopupItemClick(Sender: TObject); 
var 
    i : integer; 
begin 
    with (Sender as TMenuItem) do begin 
    //if they just checked something... 
    if Checked then begin 
     //go through the list and *un* check everything *else* 
     for i := 0 to (GetParentComponent as TPopupMenu).Items.Count - 1 do begin 
     if i <> MenuIndex then begin //don't uncheck the one they just clicked! 
      (GetParentComponent as TPopupMenu).Items[i].Checked := False; 
     end; //if not the one they just clicked 
     end; //for each item in the popup 
    end; //if we checked something 
    end; //with 
end; 

Puede asignar el evento en tiempo de ejecución para cada cuadro emergente en su forma como esto (si desea hacerlo):

procedure TForm2.FormCreate(Sender: TObject); 
var 
    i,j: integer; 
begin 
    inherited; 

    //look for any popup menus, and assign our custom checkbox handler to them 
    if Sender is TForm then begin 
    with (Sender as TForm) do begin 
     for i := 0 to ComponentCount - 1 do begin 
     if (Components[i] is TPopupMenu) then begin 
      for j := 0 to (Components[i] as TPopupMenu).Items.Count - 1 do begin 
      (Components[i] as TPopupMenu).Items[j].OnClick := OnPopupItemClick; 
      end; //for every item in the popup list we found 
     end; //if we found a popup list 
     end; //for every component on the form 
    end; //with the form 
    end; //if we are looking at a form 
end; 

En respuesta a un comentario más abajo esta respuesta: si desea solicitar que se verifique al menos un elemento, luego use esto en lugar del primer bloque de códigos. Es posible que desee establecer un elemento marcado predeterminado en el evento oncreate.

procedure TForm2.OnPopupItemClick(Sender: TObject); 
var 
    i : integer; 
begin 
    with (Sender as TMenuItem) do begin 
    //go through the list and make sure *only* the clicked item is checked 
    for i := 0 to (GetParentComponent as TPopupMenu).Items.Count - 1 do begin 
     (GetParentComponent as TPopupMenu).Items[i].Checked := (i = MenuIndex); 
    end; //for each item in the popup 
    end; //with 
end; 
+0

Él debe también agregue el código que verifica que al menos un elemento del menú esté marcado y que agregue que el usuario de verificación desactiva la entrada marcada. Eso debería ser simple dados sus ejemplos. – gabr

+0

No estoy seguro de que sea su objetivo, pero agregué un bloque para manejar eso en la respuesta. En realidad, simplifica las cosas un poco. – JosephStyons

+1

Esto definitivamente no es el camino a seguir: esta funcionalidad ya está incorporada. Vea las publicaciones de Zartog y Gerry, y combine las dos. – onnodb

12

Para el tratamiento de la ventana emergente (o cualquier otro) elementos de menú como elementos del grupo de radio, defina la propiedad 'RadioItem' a verdadero de cada artículo que desea tener en el grupo de radio.

En lugar de mostrar una marca de verificación, se mostrará una viñeta en el elemento seleccionado, pero funcionará de la manera que desee, y la señal visual en realidad coincidirá con un estándar de Windows.

4

Para ampliar en la publicación de Zartog: los menús emergentes en Delphi (desde al menos D6) tienen una propiedad GroupIndex que le permite tener múltiples conjuntos de elementos de radio dentro de un menú. Establecer groupIndex a 1 para el primer grupo, 2 para la segunda, etc.

Así: Conjunto AutoCheck = True Conjunto RadioItem = True Conjunto groupIndex si necesita más de un grupo de elementos de radio

Cuestiones relacionadas