PopUpMenu returns wrong String by "ControlInfo"

Dear all,

my Panel contains a PopUpMenu:

PopupMenu popup0,pos={34,508},size={195,24},bodyWidth=195
PopupMenu popup0,mode=1,proc=popmenuproc,value= #"\"Empty;Marker;Standard 1;Standard 2;Standard 3;Standard 4;Unknown\""


When I to decide how to go on in the procedure, the


Function TabProc(tab0,tabnum) : TabControl
String tab0
Variable tabNum
if (tabnum == 0)

GroupBox group0 disable = 0
GroupBox group7 disable = 0
PopUpMenu popup0 disable = 0
ControlInfo /W=GelQuant popup0 --> HERE the program always returns "Empty", no matter what
strswitch(S_Value)	
case "Empty":
	SetVariable setvar2 disable = 1
	CheckBox check4 disable = 1	
	HideRightBox_Lane1()
break
case "Marker":
 	SetVariable setvar2 disable = 0
	 CheckBox check4 disable = 2
	HideRightBox_Lane1()
break
case "Standard 1":
 	SetVariable setvar2 disable = 0
	CheckBox check4 disable = 2
	HideRightBox_Lane1()	
break
case "Standard 2":
	 SetVariable setvar2 disable = 0
	 CheckBox check4 disable = 2
 	HideRightBox_Lane1()
break
case "Standard 3":
        SetVariable setvar2 disable = 0
  	CheckBox check4 disable = 2
	HideRightBox_Lane1()
break
case "Standard 4":
        SetVariable setvar2 disable = 0
	CheckBox check4 disable = 2
	HideRightBox_Lane1()	
break
case "Unknown":
	SetVariable setvar2 disable = 0
	CheckBox check4 disable = 0
	ControlInfo /W = GelQuant check4
	If(V_Value == 1)
		ShowRightBox_Lane1()
	else
		HideRightBox_Lane1()
	endif
break
	return -1 // wrong string transferred, abort
endswitch


The Problem is now, whenever the procedure is evoked, it returns "Empty" as S_Value, which hinders the procedure from functioning correctly (the switch is basically completely ignored)- I'm desperate, what can I do about it?

Any help is highly appreciated :)

Regards,
Peter
Well it does work here

Function CreatePanel()
	NewPanel
	PopupMenu popup0,mode=1,proc=popmenuproc,value= #"\"Empty;Marker;Standard 1;Standard 2;Standard 3;Standard 4;Unknown\""
End

Function PopMenuProc(pa) : PopupMenuControl
	STRUCT WMPopupAction &pa

	switch( pa.eventCode )
		case 2: // mouse up
			Variable popNum = pa.popNum
			String popStr = pa.popStr
			print popStr
			break
		case -1: // control being killed
			break
	endswitch

	return 0
End


From looking at your code you are using a TabControl to handle different tabs.
Maybe the popupmenu has not been rebuilt yet?
You can also check V_Value of ControlInfo, maybe that gives some more explanatory status code.
V_Value also always returns "1" (first element of the PopUpMenu), which is "Empty" in my case...

The strange thing is, that the choice I make is remembered by the PopUpMenu and also correctly displayed, but whenever I want to read out the value, it always returns 1 for V_Value.... :/
If you're comfortable with it, post the entire experiment (and the Igor version you're using).

This kind of thing has been working for ever so long that I'm sure there's something non-obvious that is causing your problems.

--Jim Prouty
Software Engineer, WaveMetrics, Inc.
What happens when you switch to the structure form of tab controls (and clean up a missing "endif" flow control -- here changed to a switch).


Function MyTabControl(tcstruct) : TabControl
	STRUCT WMTabControlAction &tcstruct
	
	variable tabNum = tcstruct.tab, rtn = 0, sh = 0
	switch(tabNum)
		case 0:	 
			GroupBox group0 win=GelQuant, disable = 0
			GroupBox group7 win=GelQuant, disable = 0
			PopUpMenu popup0 win=GelQuant, disable = 0
		        break
	endswitch
	ControlInfo /W=GelQuant popup0
	strswitch(S_Value)	
		case "Empty":
			SetVariable setvar2  win=GelQuant, disable = 1
			CheckBox check4 win=GelQuant disable = 1	
			break
		case "Marker":
		 	SetVariable setvar2 win=GelQuant, disable = 0
			 CheckBox check4 win=GelQuant, disable = 2
			break
		case "Standard 1":
		 	SetVariable setvar2 win=GelQuant, disable = 0
			CheckBox check4 win=GelQuant, disable = 2
			break
		case "Standard 2":
			 SetVariable setvar2 win=GelQuant, disable = 0
			 CheckBox check4 win=GelQuant, disable = 2
			break
		case "Standard 3":
		        SetVariable setvar2 win=GelQuant, disable = 0
		  	CheckBox check4 win=GelQuant, disable = 2
			break
		case "Standard 4":
		        SetVariable setvar2 win=GelQuant, disable = 0
			CheckBox check4 win=GelQuant, disable = 2
			break
		case "Unknown":
			SetVariable setvar2 win=GelQuant, disable = 0
			CheckBox check4 win=GelQuant, disable = 0
			ControlInfo /W = GelQuant check4
			sh = V_Value
			rtn = -1
			break
	endswitch
	ShowHideRightBox_Lane1(sh)
	
	return rtn
end

// show a different way here to collapse code for RightBox_Lane1() to one place

Function ShowHideRightBox_Lane1(sh)
	variable sh
	
	switch(sh)
		case 0:
			HideRightBox_Lane1()
			break
		case 1:
			ShowRightBox_Lane1()
			break
	endswitch
	return 0
end

--
J. J. Weimer
Chemistry / Chemical & Materials Engineering, UAHuntsville
I have attached a shortended version of the procedure, simplified to the problem...

Thanks in advance for your support!
BugFix.pxp (9.86 KB) check.ipf (4.38 KB)
PeterR wrote: I have attached a shortended version of the procedure, simplified to the problem...

Thanks in advance for your support!


Since you did not describe how to reproduce the problem in your simplified experiment, I am guessing a bit here...

I first noticed that if you execute panel() and then select tab 2 and then tab 1, Igor gives an error about use of a NULL string variable. The line that caused that error is the strswitch call in function TabProc() (line 49). This error happens because when you call ControlInfo, you use the /W flag, passing a window name that does not exist. If I change that line to
ControlInfo /W=panel popup0
, and then test again, I get no Igor error and changing the selected value in the popup box of tab 1 causes other controls in that group box to be hidden/disabled in a way that seems appropriate to me.

Are you sure that you're using the latest version of Igor (6.34A)?

If what I've described isn't the problem you're having, please tell us exactly how to reproduce the problem.
Thanks aclight, that did the trick. I just did not notice that the panel has different name :)

Now the procedure works as it should! Thanks again!