Menu déroulant hiérarchique: désactiver 1 élément

Dans un menu déroulant hiérarchique je souhaite désactiver 1 ou N éléments : ils restent visibles mais sont grisés pour que l’utilisateur ne les choisisse pas.

Je ne vois pas comment coder ça !

Dans un menu hiérarchique je n’ai jamais essayé, j’aime pas. Dans un menu à un seul niveau, je fais comme ça : “Pour inactiver une ligne, placez une parenthèse ouvrante “(” dans son libellé.”. Voir http://doc.4d.com/4Dv16/4D/16.3/AJOUTER-LIGNE-MENU.301-3651457.fr.htmlici>.

d’accord avec Arnaud, il faut faire un menu hiérarchique dynamique et inactiver certains éléments à l’aide du symbole ) ou bien ( .

Je déteste utiliser ce fameux “(”.
Car on ne peut pas tout afficher. Il est mieux de construire son menu de A à Z grace aux commandes dédiées, ligne par ligne. Et d’inactiver certaines lignes par INACTIVER LIGNE MENU ($refMenu;-1) // le -1 indique la ligne que l’on vient de créer.

Et on fait facilement du hiérarchique. On créée un autre menu, qu’on attache au menu principal en cours de construction, et une fois attaché, on peut libérer ce sous-menu, car quand on libèrera le principal, ce sous-menu le sera aussi.

Voilà, mieux vaut tard que jamais…

<code 4D>

C_TEXT($refMenu)
C_LONGINT($i;$tt;$k)
ARRAY TEXT($T_labels;0)
APPEND TO ARRAY($T_labels;Get localized string(“SubColors”)) //“Colors…”) // sub
APPEND TO ARRAY($T_labels;Get localized string(“SubColorsInv”)) //“Colors inverse…”) // sub
APPEND TO ARRAY($T_labels;Get localized string(“SubColorsBW”)) //“Black & White”)
APPEND TO ARRAY($T_labels;Get localized string(“SubColorsGW”)) //“Grey & White”)
APPEND TO ARRAY($T_labels;Get localized string(“SubColorsWB”)) //“White & Black”)
APPEND TO ARRAY($T_labels;Get localized string(“SubColorsRandom”)) //“Random”)
APPEND TO ARRAY($T_labels;Get localized string(“SubColorsRandomInv”)) //“Random inverse”)

APPEND TO ARRAY($T_labels;Get localized string(“SubColorsStroke”)) //“All Stroke”)
APPEND TO ARRAY($T_labels;Get localized string(“SubColorsFill”)) //“All Fill”)
APPEND TO ARRAY($T_labels;Get localized string(“SubColorsExchange”)) //“Exchange”)

APPEND TO ARRAY($T_labels;Get localized string(“SubColorsCopy”)) //“Copy colors…”) // sub

C_TEXT($pathPictos)
$pathPictos:=“file:icons”+Folder separator+“icn_colorsTool”

$refMenu:=Create menu
$tt:=Size of array($T_labels)
For ($i;1;$tt)
Case of
: ($i=1) | ($i=2)
$isInvert:=($i=2)

		C_TEXT($patchColors)
		$patchColors:="file:palettes"+Folder separator+"icnMD"+Folder separator+"colorp"
		
		C_LONGINT($offset)
		$offset:=Choose($isInvert;200;100)
		
		$subRef:=Create menu
		$tt1:=Choose($isMD4D;18;7)
		For ($j;0;$tt1)
			If ($isMD4D)
				$noColor:=md_colorMDfromPopup ($j*14+1)+5
			Else 
				$noColor:=md_color4DtoMD (($j+8)*16)+5
			End if 
			$Txt_colorName:=<>T_MDpalette_colorNames{$noColor}
			$Txt_colorName:=Substring($Txt_colorName;1;Length($Txt_colorName)-3)
			APPEND MENU ITEM($subRef;$Txt_colorName;*)
			SET MENU ITEM PARAMETER($subRef;-1;String($j+$offset))
			
			SET MENU ITEM ICON($subRef;-1;$patchColors+String($noColor)+".png")
		End for 
		APPEND MENU ITEM($refMenu;$T_labels{$i};$subRef;*)
		RELEASE MENU($subRef)
		
		
		
	: ($i=$tt)
		C_TEXT($subRef)
		ARRAY TEXT($T_subLabels;0)  // rgb (r, g, b) ; #rgb ; #rrggbb ; rgb(r%, g%, b%)
		APPEND TO ARRAY($T_subLabels;"MD palette")
		APPEND TO ARRAY($T_subLabels;"integer")
		APPEND TO ARRAY($T_subLabels;"rgb (r, g, b)")
		APPEND TO ARRAY($T_subLabels;"#rgb")
		APPEND TO ARRAY($T_subLabels;"#rrggbb")
		APPEND TO ARRAY($T_subLabels;"rgb(r%, g%, b%)")
		$subRef:=Create menu
		$tt1:=Size of array($T_subLabels)
		For ($j;1;$tt1)
			APPEND MENU ITEM($subRef;$T_subLabels{$j};*)
			SET MENU ITEM PARAMETER($subRef;-1;String($j+500-1))
		End for 
		APPEND MENU ITEM($refMenu;$T_labels{$i};$subRef;*)
		RELEASE MENU($subRef)
		
	Else 
		APPEND MENU ITEM($refMenu;$T_labels{$i};*)
End case 
SET MENU ITEM PARAMETER($refMenu;-1;String($i))
SET MENU ITEM ICON($refMenu;-1;$pathPictos+String($i-1)+".png")

End for

C_TEXT($answerMenu)
$answerMenu:=Dynamic pop up menu($refMenu)
RELEASE MENU($refMenu)
C_LONGINT($value;$idx)
$isOk:=(""#$answerMenu)
If ($isOk)
$idx:=Num($answerMenu)

// DO ACTIONS

End if

</code 4D>

Remarque bien le :

<code 4D>
APPEND MENU ITEM($refMenu;$T_labels{$i};$subRef;*)
RELEASE MENU($subRef)

</code 4D>

Tu dois libérer ton sous-menu, une fois attaché à un autre élément de menu.
Car il sera libéré ensuite quand tu libèreras le menu parent.

Merci pour votre contribution fort utile.
Merci beaucoup.

Bonsoir Bertrand,

as-tu essayé avec char(1)+"-" ?

(non testé), mais juste une idée comme cela

Patrick

: Patrick EMANUEL

Bonsoir Bertrand,

as-tu essayé avec char(1)+"-" ?

(non testé), mais juste une idée comme cela

ça crée une ligne de séparation

Essai de le tromper avec un faux nez :

Et tout simplement char(45) qui donne le moins ?

: Jean-Claude BEDERT

Et tout simplement char(45) qui donne le moins ?Qui donne le moins donne le plus ? :wink: non ça fait un trait de séparation :razz:

Effectivement, j’ai reproduit l’objet, et même souci, le moins n’apparaît pas ; mais si on met un espace devant le moins, ça marche. Imparfait, mais visible ! :-?

Ce code figure dans l’objet.

<code 4D>
C_POINTER($p_current_object)

$p_current_object:=OBJECT Get pointer(Object current)

C_LONGINT($L_event;$L_list)

$L_event:=Form event

Case of

: ($L_event=On Load)

	$L_list:=New list

	APPEND TO LIST($L_list;" -";1) // espace devant le -

	APPEND TO LIST($L_list;" +";1) // espace devant le + (pour aligner)

	VARIABLE TO VARIABLE(Current process;$p_current_object->;$L_list)

: ($L_event=On Clicked)

Else 

End case

</code 4D>

Super :mrgreen: pour le + ce n’est pas utile

Si c’est du vrai code, ton on clicked devrait être on data change

Ce n’est pas du vrai code, mais oui, le on data change est plus pertinent.