如何“一行代码”控制主界面的所有功能调用
www.lvyin.net 2002-4-22 绿荫网络
在大多数软件中,都具有菜单、工具栏、按钮或树形功能选择。同样的一个功能模板,有可能在菜单中调用它,在工具栏中也调用它,或者用其它方式调用它,即存在着多次调用的问题。
在一次有意无意的探索中,我找到了一个非常方便的功能调用方法,使用了这种方法之后几乎可以说成是“一行代码”控制主界面的所有功能调用。
然而,如何实现呢,请听我慢慢道来。
以我探索时所用的程序为例:所有的功能操作全部集成在主窗体里面,各模板全部以Tframe(即框架)的形式提供,功能调用即包括菜单调用,工具栏调用,也有树形功能树调用。
实现方法:
一、首先定义好几个数组,以方便构造功能树所用:
private: // User declarations
TTreeNode *m_CurrentNode; // 当前节点
TTreeNode *mTree[MAXNODE]; // 节点指针
int mTreeNo[MAXNODE]; // 结点ID
int mTreePNo[MAXNODE]; // 父结点ID
AnsiString mTreeName[MAXNODE]; // 结点名称
TFrame *ChildFrame[MAXNODE]; // Tframe 子模块
二、定义一个构造功能树的函数
public: // User declarations
void CreateTree();
三、功能树的构造
void TfrmMain::CreateTree()
{
mTreeName[0]="公司基本信息"; mTreePNo[0]=MAXNODE;
mTreeName[1]="部门设置"; mTreePNo[1]=0; ChildFrame[1]=new TfraDepartment(plFrame);
mTreeName[2]="职位设置"; mTreePNo[2]=0; ChildFrame[2]=new TfraPosition(plFrame);
mTreeName[3]="员工信息"; mTreePNo[3]=0; ChildFrame[3]=new TfraEmployee(plFrame);
mTreeName[4]="节假日设置"; mTreePNo[4]=0; ChildFrame[4]=new TfraHoliday(plFrame);
mTreeName[5]="排班设置"; mTreePNo[5]=0; ChildFrame[5]=new TfraDeployClass(plFrame);
mTreeName[6]="考勤管理"; mTreePNo[6]=MAXNODE;
mTreeName[7]="数据导入"; mTreePNo[7]=6; ChildFrame[7]=new TfraImportData(plFrame);
mTreeName[8]="签卡"; mTreePNo[8]=6; ChildFrame[8]=new TfraSingCard(plFrame);
mTreeName[9]="请假管理"; mTreePNo[9]=6; ChildFrame[9]=new TfraLeave(plFrame);
mTreeName[10]="加班管理"; mTreePNo[10]=6;
mTreeName[11]="加班申请"; mTreePNo[11]=10; ChildFrame[11]=new TfraOverTime(plFrame);
mTreeName[12]="加班审核"; mTreePNo[12]=10; ChildFrame[12]=new TfraAuditingOverTime(plFrame);
mTreeName[13]="临时换班"; mTreePNo[13]=6; ChildFrame[13]=new TfraTempRelief(plFrame);
mTreeName[14]="数据维护"; mTreePNo[14]=6; ChildFrame[14]=new TfraMaintenanceDatabase(plFrame);
mTreeName[15]="报表"; mTreePNo[15]=MAXNODE;
mTreeName[16]="基础信息报表"; mTreePNo[16]=15; ChildFrame[16]=new TfraBaseReport(plFrame);
mTreeName[17]="日报表"; mTreePNo[17]=15; ChildFrame[17]=new TfraDayReport(plFrame);
mTreeName[18]="月报表"; mTreePNo[18]=15; ChildFrame[18]=new TfraMonthReport(plFrame);
mTreeName[19]="自定义报表"; mTreePNo[19]=15; ChildFrame[19]=new TfraCustomReport(plFrame);
mTreeName[20]="统计报表"; mTreePNo[20]=15; ChildFrame[20]=new TfraCountReport(plFrame);
mTreeName[21]="用户管理"; mTreePNo[21]=MAXNODE;
mTreeName[22]="添加用户"; mTreePNo[22]=21; ChildFrame[22]=new TfraAddAdmin(plFrame);
mTreeName[23]="修改密码"; mTreePNo[23]=21; ChildFrame[23]=new TfraModifyPassword(plFrame);
mTreeName[24]="修改权限"; mTreePNo[24]=21; ChildFrame[24]=new TfraModifyPopedom(plFrame);
for (int i=0;i<MAXNODE;i++)
{
mTreeNo[i]=i;
mTree[i]=tvMain->Items->AddChild((mTreePNo[i]==MAXNODE)?NULL:mTree[mTreePNo[i]],mTreeName[i]);
mTree[i]->Data =&mTreeNo[i];
if (ChildFrame[i]!=NULL)
{
ChildFrame[i]->Visible=false;
ChildFrame[i]->Parent=plFrame;
ChildFrame[i]->Align =alClient;
}
}
}
四、在OnCreate方法中加入以下代码
CreateTree ();
五、在树形控件的OnChange方法中加入以下代码
void __fastcall TfrmMain::tvMainChange(TObject *Sender, TTreeNode *Node)
{
// 如果实际上结点不更换,则不作任何事
if (Node==m_CurrentNode)
return;
int flag;
flag=*((int*)Node->Data);
if (flag==0 ||flag==6 ||flag==15 ||flag==21 || flag==10)
return;
if (m_CurrentFrame!=NULL)
m_CurrentFrame->Visible =false;
m_CurrentFrame=ChildFrame[flag];
m_CurrentFrame->Visible =true;
m_CurrentNode=Node;
}
六、在主窗体中加入一个TActionList控件,并新建一系列Action方法,以功能名命令,设置好相关Caption、Hint、ImageIndex、ShortCut、Tag;最重要的是各Action方法的Tag属性,其值一定要与其相应功能在建立功能调用树时分配的数组下标一样;双击任意一个Action方法,并加入代码:
tvMain->Selected =mTree[((TAction*)Sender)->Tag];
这句代码是整个程序的核心!也就是这句代码控制了整个程序的模块调用。
七、最后,在要调用的控件属性中赋于相应的Action方法即可!