如何“一行代码”控制主界面的所有功能调用

类别:编程语言 点击:0 评论:0 推荐:
如何“一行代码”控制主界面的所有功能调用
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方法即可!

本文地址:http://com.8s8s.com/it/it29649.htm