GUI 요소를 효과적으로 숨기거나 표시하는 방법은?선택기에 따라 일부 요소를 숨기거나 표시하는 GUI가 있습니다.
지금은 각각의 If Box()에서 변경되는 모든 요소를 캡슐화하고 ComboBox 선택자가 변경될 때 각각을 다음과 같이 변경합니다.
Names Default To Here( 1 );
modeSelectorOptions = {"Mode1", "Mode2"};
gui = V List Box(
modeSelector = ComboBox(modeSelectorOptions,
<< Set Function(
Function(
{this},
Match(this << Get Selected(),
modeSelectorOptions[1], Write("\!nMode1");IB1<< Set (1); IB2 << Set(0)/*many more when script expanded*/,
modeSelectorOptions[2], Write("\!nMode2");IB1<< Set (0); IB2 << Set(1)/*many more when script expanded*/,
)
)
);
),
Button Box("All Modes", Write("Always active")),
IB1 = If Box(1, Button Box("GUI ELEMENT for Mode1", Write("Button pressed"))),
IB2 = If Box(0, Button Box("GUI ELEMENT for Mode2", Write("Button pressed")))
);
NW = New Window("Test",<< Show Toolbars(0),<<SHOWMENU></SHOWMENU>This works, but it is not very scalable.
I need to hide or unhide certain elements depending on the mode throughout the whole window with many elements. I have to encapsulate each of those changing elements in an If Box(), name it and don't forget to include it in the Match statement of the <EM>모드선택기</EM>.
It is not very scalable, especially when I move into 10-20 different elements.
Is there any way to, let's say, just raise a corresponding flag in Match statement, define all the IF boxes with those flags and then just give command to redraw them?
Something like this, where redrawIfBoxes is an expression that redraws all the IF boxes so that changed flag takes effect:
<CODE class=" language-jsl">Names Default To Here( 1 );
modeSelectorOptions = {"Mode1", "Mode2"};
mode1Flag = 1;
mode2Flag = 0;
gui = V List Box(
modeSelector = ComboBox(modeSelectorOptions,
<< Set Function(
Function(
{this},
Match(this << Get Selected(),
modeSelectorOptions[1], Write("\!nMode1");mode1Flag = 1;mode2Flag = 0;redrawIfBoxes,
modeSelectorOptions[2], Write("\!nMode2");mode1Flag = 0;mode2Flag = 1;redrawIfBoxes,
)
)
);
),
Button Box("All Modes", Write("Always active")),
IB1 = If Box(mode1Flag, Button Box("GUI ELEMENT for Mode1", Write("Button pressed"))),
IB2 = If Box(mode2Flag, Button Box("GUI ELEMENT for Mode2", Write("Button pressed")))
);
NW = New Window("Test",<< Show Toolbars(0),<<SHOWMENU></SHOWMENU><CODE class=" language-jsl">
<CODE class=" language-jsl"><LINGO-LABS id="lingo-labs-824762" slang="en-US" mode="UPDATE"><LINGO-LABEL>자동화 및 스크립팅</LINGO-LABEL></LINGO-LABS>Re: GUI 요소를 효과적으로 숨기거나 표시하는 방법은?지금은 다음과 같은 방법으로 처리합니다.
Names Default To Here( 1 );
modeSelectorOptions = {"Mode1", "Mode2"};
mode1Flag = 1;
mode2Flag = 0;
mode1IfBoxes = {IB1, IB3, IB5};
mode2IfBoxes = {IB2, IB4, IB6};
gui = V List Box(
modeSelector = ComboBox(modeSelectorOptions,
<< Set Function(
Function(
{this},
Match(this << Get Selected(),
modeSelectorOptions[1], Write("\!nMode1");mode1Flag = 1;mode2Flag = 0;redrawIfBoxes,
modeSelectorOptions[2], Write("\!nMode2");mode1Flag = 0;mode2Flag = 1;redrawIfBoxes,
)
)
);
),
Button Box("All Modes", Write("Always active")),
IB1 = If Box(mode1Flag, Button Box("GUI ELEMENT for Mode1", Write("Button pressed"))),
IB2 = If Box(mode2Flag, Button Box("GUI ELEMENT for Mode2", Write("Button pressed"))),
IB3 = If Box(mode1Flag, Button Box("GUI ELEMENT for Mode1", Write("Button pressed"))),
IB4 = If Box(mode2Flag, Button Box("GUI ELEMENT for Mode2", Write("Button pressed"))),
IB5 = If Box(mode1Flag, Button Box("GUI ELEMENT for Mode1", Write("Button pressed"))),
IB6 = If Box(mode2Flag, Button Box("GUI ELEMENT for Mode2", Write("Button pressed")))
);
redrawIfBoxes = Expr(
mode1IfBoxes << Set (mode1Flag);
mode2IfBoxes << Set (mode2Flag);
);
NW = New Window("Test",<< Show Toolbars(0),<<SHOWMENU></SHOWMENU>Let me know if there is a more robust way.<BR />With more modes redrawIfBoxes can be changed from Expression to Function to match list of IfBoxes to a specific flag without ever needing to update the function.
The only two places to update - lists of If Boxes and Match statement in selector combobox.
Re: GUI 요소를 효과적으로 숨기거나 표시하는 방법은?최종 애플리케이션과 "견고하고" 관리하기 쉬운 것으로 생각하는 것에 따라 다르지만, 다양한 옵션이 있습니다.
- 상자를 사용할 수도 있습니다
- XPath가 도움이 될 수도 있습니다
- 버튼을 컨테이너 안에 감싸서 모드당 하나의 상자만 필요하도록 할 수도 있습니다.
- << Visibility("Collapse")를 사용할 수 있습니다.
- 변경 사항이 발생하면 버튼 텍스트/작업을 동적으로 업데이트할 수 있습니다.
반드시 내가 할 수 있는 방식은 아니지만, 이것은 잠재적인 아이디어를 제공하기 위한 것입니다.
Names Default To Here( 1 );
mode_options = {"Mode1", "Mode2"};
gui = V List Box(
modeSelector = ComboBox(modeSelectorOptions,
<< Set Function(Function({this},
this << Inval;
selection = Contains(mode_options, this << Get Selected);
ibs << Set(0);
ibs[selection] << Set(1);
this << Update Window;
));
),
Button Box("All Modes", Write("Always active")),
If Box(0,
V List Box(
Button Box("GUI ELEMENT for Mode1", Write("Button pressed")),
Button Box("GUI ELEMENT for Mode1", Write("Button pressed")),
Button Box("GUI ELEMENT for Mode1", Write("Button pressed"))
)
),
If Box(0,
V List Box(
Button Box("GUI ELEMENT for Mode2", Write("Button pressed")),
Button Box("GUI ELEMENT for Mode2", Write("Button pressed")),
Button Box("GUI ELEMENT for Mode2", Write("Button pressed"))
)
)
);
ibs = gui << Xpath("//IfBox");
// JMP things
modeSelector << Set(2, Run Script(0));
modeSelector << Set(1, Run Script(1));
nw = New Window("Test",<< Show Toolbars(0),<<SHOWMENU></SHOWMENU>