2.2 界面功能按钮与响应事件的衔接
在控制界面当中,功能按钮大致可以分为三类:第一类是主菜单底下的子菜单按钮;第二类是工具栏中的快捷按钮;第三类是界面上的其它功能按钮。这三类按钮是程序与界面衔接的重要部分,现以第一类按钮当中存储子菜单为例说明衔接过程:
在完成菜单项的界面设计之后,先在集成开发环境当中单击存储子菜单按钮,则在主程序文件当中会自动生成这样一个函数:
void __fastcallTForm1::N7Click(TObject* Sender)
{
}
由于没有响应事件,在编译运行后点击该子菜单时,系统不做任何响应。然后在响应函数当中添加如下实体,以便完成存储功能:
void __fastcallTForm1::N7Click(TObject* Sender)
{
if(! strcmp(FFileName. c_str(), "未命名")); //判断G
代码文件是否命名
{ if(SaveDialog1->Execute()); //没有命名,打开存储
文件对话框
{ RichEdit1->Lines->SaveToFile(SaveDialog1->
FileName); //存储文件
SetFileName(SaveDialog1->FileName); //在文件标题上显示
RichEdit1->Modified=false; //复位文件修改标志
}
}
else //如果文件已命名则直接存储
{
RichEdit1->Lines->SaveToFile(FFileName);
RichEdit1->Modified=false;
}
}
这样,程序运行之后点击存储按钮,就可完成将编辑器当中的G代码存储起来。
第二类是工具栏上的快捷工具按钮,而在子菜单当中又都能够找到它们的响应按钮,所以可以直接将它们与各个相应子菜单按钮衔接,这样就不用在它们的函数当中添加同样的函数体以省去写原代码的麻烦。仍以存储按钮为例,通过两种方法来实现两个按钮的衔接:
(1)在集成开发环境当中的界面工具栏上选中存储按钮(假设界面已设计好),在左边控件属性栏中点击even,t再点击Onclick右边的框子,在下拉菜单中选相应按钮名称即可完成衔接。
(2)在集成开发环境当中的界面工具栏上双击存储按钮,在主程序文件当中会自动生成如下响应函数:
void __fastcallTForm1::ToolButton1Click(TObject* Sender)
{
}
在函数体中添加如下代码即可完成两个按钮之间的衔接:
void __fastcallTForm1::ToolButton1Click(TObject* Sender)
{
N7Click(Sender);
}
由于设计思路一样,对其他按钮的衔接问题不再赘述。
2.3 界面参数的读入
在控制界面上读入各种控制参数,才能建立起系统的运行环境。界面参数输入一般通过Edit和Com-boBox等控件来实现。
如图1所示为设定系统周期的输入框,通过下面函数,可将输入框中的各个参数输入系统:
图1 系统周期参数输入框
void ZhouqiSet()
{
short rtn;
tm=StrToFloat(Form1->cbotm->Text);
lmt=StrToFloat(Form1->cbolmt->Text);
enc=StrToFloat(Form1->cboenc->Text);
.
}
图中三个输入框都是ComboBox控件,从上到下被命名为cbotm、cbolmt、cboenc。系统伺服周期通过Form1->cbotm->Text语句读入,此语句在功能上相当于一个指针,对应地址当中的内容就是向输入框当中输入的数字,这时参数的类型为String而不是整形或浮点型,因而需要进行转换后再赋予相应变量,以便系统函数调用。转换的数据类型通过这样的语句实现: tm=StrToFloat(Form1->cbotm->Text),这句将周期输入框中的输入参数转换成浮点型,再赋予周期变量。
Edit控件的读入原理跟ComboBox一样。
2.4 界面参数的输出
在程序设计中,用到的数据输出控件主要有Lable控件、PaintBox控件及状态条StatusBar控件。PaintBox控件的使用与图形显示有关,而Lable控件是一个标签控件,它可以用于在界面上标示各种输入输出框的作用,也可以直接用于输出某一数据,在设计中,除了利用这个控件来标示各种输入框外,还用于输出X轴和Y轴的位置坐标。以显示运行轨迹界面X、Y位置坐标为例,论述其输出过程。
首先,访问GT400运动控制器的位置寄存器。访问函数为: shortGT_GetAtlPos(long* Apos);这个函数返回各坐标的位置数据,以便实现必要的位置数据输出和图形显示。位置坐标的读回代码为:
EnterCriticalSection(&Sect1); //多线程中初始化临界区域
rtn=GT_Axis(1); error(rtn);
rtn=GT_GetAtlPos(&actl_xpos); error(rtn); //读回X位置值,放到变量actl_xpos中
rtn=GT_Axis(3); error(rtn);
rtn=GT_GetAtlPos(&actl_ypos); error(rtn); //读回Y位置值,放到变量actl_ypos中
LeaveCriticalSection(&Sect1); //释放临界区然后,在界面上显示坐标位置:
Form1->xpos->Caption=" " +IntToStr(actl_xpos); //
将X轴的位置值向运行轨迹分页的X轴标签处输出
Form1->StatusBar1->Panels->Items[1] ->Text="
X: "+IntToStr(actl_xpos); //将X位置值向控制界面的状态栏输出
Form1->ypos->Caption=" " + IntToStr( actl_ypos);
//将Y轴的位置值向运行轨迹分页的Y轴标签处输出
Form1->StatusBar1->Panels->Items[2] ->Text="
Y: "+IntToStr(actl_ypos); //将Y位置值向控制界面的状态栏输出
第一句涉及到多线程当中对公共变量的访问问题。为了避免在多线程中因为同时访问公共数据块而造成不良后果,需要对公共数据块进行保护,直到一个线程对它的访问结束为止,在设计中调用的是W in32的API函数进行临界区域的划定,即EnterCriticalSec-tion(&Sect1)和LeaveCriticalSection(&Sect1)。设定临界区域后就可以保证一次只有一个线程对该区域进行访问,而不会引起数据访问的冲突。