【发布时间】:2020-11-24 12:27:43
【问题描述】:
如何创建一个包含两个以上自定义按钮而不是阻止脚本的“确定”和“取消”按钮的对话框?
可以使用TwoButtonDialog() 在dm-script 中创建一个带有两个自定义按钮的对话框。但请考虑以下示例对话框,询问是否覆盖文件。此对话框需要的不仅仅是“确定”和“取消”按钮。
可以使用UIFrame 和对话框函数简单地创建此对话框。但是使用UIFrame::display() 不会等待用户进行交互。将显示对话框并继续执行脚本。当使用UIFrame::pose() 时,这会阻止当前脚本,但也会始终添加“确定”和“取消”按钮。所以在这里使用这些函数似乎不适合这种情况。
如何创建一个对话框来阻止脚本在没有额外的“确定”和“取消”按钮的情况下继续运行,以便我可以添加自己的按钮?并且可选地,我如何使这个对话框成为模态?
我尝试过的
版本 1
我试图通过等待Signal 来阻止当前工作线程,如下面的示例代码所示。我正在创建对话框并使用不添加任何按钮的UIFrame::display()。然后等待按钮点击回调中设置的信号。
number index = -1;
object wait_signal = NewSignal(0);
class ButtonDialog : UIFrame{
void button_pressed(object self, number i){
index = i;
wait_signal.SetSignal();
self.close();
}
object init(object self){
// creating dialog contents, for full example look at the bottom
return self;
}
}
// Version 1
alloc(ButtonDialog).init().display(title);
wait_signal.waitOnSignal(10, NULL);
result("The index is " + index + "\n");
底部可执行版本,取消注释Version 1块,注释所有其他版本
但这不起作用。出现的对话框未完成,如下所示:
只要我更改窗口,对话框就会显示文本和按钮,但仍然无法点击。加上布局并不完美。
版本 2
所以我想把对话框完全移到一个单独的线程中。这样,它就可以根据需要进行初始化,并且肯定可以使用,因为新的单独线程永远不会被阻塞。
number index = -1;
object wait_signal = NewSignal(0);
class ButtonDialog : UIFrame{
void button_pressed(object self, number i){
index = i;
wait_signal.SetSignal();
self.close();
}
object init(object self){
// creating dialog contents, for full example look at the bottom
return self;
}
}
class ButtonDialogThread : Thread{
object init(object self){
return self;
}
void RunThread(object self){
alloc(ButtonDialog).init().display(title);
}
}
// Version 2
alloc(ButtonDialogThread).init().startThread();
wait_signal.waitOnSignal(10, NULL);
result("The index is " + index + "\n");
底部可执行版本,取消注释Version 2块,注释所有其他版本
但这会产生与上面提到和显示的对话框相同的输出。
版本 3
更基本的方法是使用while 循环并在其间休眠。据我所知Signals 的工作方式就是这样。但我还是试了一下。
number index = -1;
object wait_signal = NewSignal(0);
class ButtonDialog : UIFrame{
void button_pressed(object self, number i){
index = i;
wait_signal.SetSignal();
self.close();
}
object init(object self){
// creating dialog contents, for full example look at the bottom
return self;
}
}
// Version 3
alloc(ButtonDialog).init().display(title);
number security_counter = 0;
while(index == -1 && security_counter < 100){
sleep(0.1);
security_counter += 1;
}
result("The index is " + index + "\n");
底部可执行版本,取消注释Version 3块,注释所有其他版本
但同样,结果与Version 1 相同。
我做错了什么?如何阻止主线程,直到显示的对话框有一些用户交互?
string text = "Several files already exist. Do you want to overwrite the file 'test_file.dm4' and 12 others?"
string button0 = "Yes";
string button1 = "Yes, all";
string button2 = "No";
string button3 = "No, all";
string button4 = "Cancel";
string title = "Overwrite?";
object wait_signal = NewSignal(0);
number index = -1;
class ButtonDialog : UIFrame{
void button_pressed(object self, number i){
index = i;
wait_signal.SetSignal();
self.close();
}
void button0_pressed(object self){self.button_pressed(0);}
void button1_pressed(object self){self.button_pressed(1);}
void button2_pressed(object self){self.button_pressed(2);}
void button3_pressed(object self){self.button_pressed(3);}
void button4_pressed(object self){self.button_pressed(4);}
object init(object self){
TagGroup dlg, dlg_items, wrapper, label, b;
index = -1;
dlg = DLGCreateDialog("Press a button", dlg_items);
dlg_items.DLGAddElement(DLGCreateLabel(text));
wrapper = DLGCreateGroup();
wrapper.DLGTableLayout(5, 1, 1);
dlg_items.DLGAddElement(wrapper);
b = DLGCreatePushButton(button0, "button0_pressed");
b.DLGWidth(80);
wrapper.DLGAddElement(b);
b = DLGCreatePushButton(button1, "button1_pressed");
b.DLGWidth(80);
wrapper.DLGAddElement(b);
b = DLGCreatePushButton(button2, "button2_pressed");
b.DLGWidth(80);
wrapper.DLGAddElement(b);
b = DLGCreatePushButton(button3, "button3_pressed");
b.DLGWidth(80);
wrapper.DLGAddElement(b);
b = DLGCreatePushButton(button4, "button4_pressed");
b.DLGWidth(80);
wrapper.DLGAddElement(b);
self.super.init(dlg);
return self;
}
}
class ButtonDialogThread : Thread{
object init(object self){
return self;
}
void RunThread(object self){
alloc(ButtonDialog).init().display(title);
}
}
// Version 1
// alloc(ButtonDialog).init().display(title);
// wait_signal.waitOnSignal(10, NULL);
// Version 2
alloc(ButtonDialogThread).init().startThread();
wait_signal.waitOnSignal(10, NULL);
// Version 3
// alloc(ButtonDialog).init().display(title);
// number security_counter = 0;
// while(index == -1 && security_counter < 100){
// sleep(0.1);
// security_counter += 1;
// }
result("The index is " + index + "\n");
【问题讨论】:
标签: dm-script dialog blocking dm-script