如何有效隱藏\取消隱藏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>回覆:如何有效隱藏/取消隱藏 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.
回覆:如何有效隱藏/取消隱藏 GUI 元素?取決於您的最終應用程式以及您認為“強大”且易於管理的應用程序,但有不同的選擇:
- 你可以使用 if 框
- XPath 可能會有所幫助
- 您也可以將按鈕包裝在某個容器中,這樣每種模式只需要一個 if 框
- 您可以使用 << 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>