22.1.14 响应上下文菜单(3)
首先定义了两个数组变量,一个用来存储按钮,另一个用来存储按钮上的数值。必须在这里声明这两个数组,因为它们是在某个if语句块内创建的,而我们需要在if语句块外部访问它们。
前3个if语句块确定是哪个组合框包含被右击而使上下文菜单打开的按钮。这3个if语句块内的处理基本相同,但创建的数组是不同的。按钮数组是根据contextButton所属的那一组按钮的句柄变量创建的。然后,按钮数组的句柄被存入theButtons变量,从而使该数组可以在外部作用域中访问。接下来调用前面添加的GetButtonValues()函数,返回包含按钮上整数值的数组。最后,在if块内设置对话框对象的3个属性,并调用其SetLabelText()函数,根据适用的极限值设置标签文本。contextButton必定属于3个组合框之一,因为只有组合框内的按钮才能使上下文菜单弹出。
已经执行过某个if块之后,在第四条if语句的条件中通过调用对话框的ShowDialog()函数使之显示出来。如果ShowDialog()函数返回::DialogResult::OK,就执行该if块内的代码。在该代码中,首先通过比较contextButton句柄与theButtons数组中的句柄,确定哪一个按钮上的数值应该被替换。一旦找到匹配项,就用新的value代替values数组中相应的元素,并退出循环。在对values数组进行排序之后,更新theButtons数组中各个按钮的Text属性,至此任务完成。
Form1类中GetButtonValues()函数的实现如下所示:
- // Creates an array of button values from an array of buttons
- array<int>^ GetButtonValues(array<Button^>^ buttons)
- {
- array<int>^ values = gcnew array<int>(buttons->Length);
- for(int i = 0 ; i<values->Length ; i++)
- values[i] = Int32::Parse(buttons[i]->Text);
- return values;
- }
在该函数中创建一个整数数组values,其长度与作为实参传递进来的按钮句柄数组相同。然后,用与按钮的Text属性返回的字符串等价的int类型整数填充values数组,并返回该数组的句柄。
再次编译该项目之后,我们应该得到一个功能完整的应用程序。可以生成许许多多数值范围受约束或不受约束的彩票记录,还可以选择为某一次产生的记录在个别按钮上生成新的随机数,或者直接输入新的数值。该程序始终工作正常,但从来没有中过一次奖。当然,正确运行才是衡量成功的标准。