(32)uniGUI for cBuilder下如何动态创建控件

 (中行雷威2019.5.30)

(同一个世界,同一个梦想,交流学习C++Builder and Delphi XE10,传承c++builder and Delphi的魅力!欢迎各地朋友加入我的QQ群484979943、860634510、299497712,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群。)

【阅读倡议】

1、有问题请留言;

2、没问题请点赞;

3、看连载请加群;

4、下源码请加群;

【开发工具】

1、C++Builder and Delphi 10.3.1

2、FMSoft_uniGUI_Complete_Professional_1.70.0.1501(正版)

本人主笔的国内第一本uniGUI教学案例代码已诞生,分为cbuilder和delphi两个版本,买代码送手册,需要的朋友可以加入我的QQ技术交流群484979943给我(群主)留言。资料简介:https://blog.csdn.net/dlboy2018/article/details/88923832
 

一、cBuilder版

7.10如何动态创建控件

         本例子主要介绍如何动态创建一些常用uniGUI控件,并且为一些控件添加一些简单的事件,介绍一下如何为调用动态创建的控件的函数或事件。

7.10.1界面设计

         在MainForm上摆放两个UniContainerPanel和一个UniMemo控件,UniContainerPanel1控件的Align设为alLeft,UniMemo控件的Name设为UniMemoLog、Align设为alRight,将UniContainerPanel2的Align设为alClient。在UniContainerPanel1上面摆放八个UniButton控件,分别将其Name设为createButton、createEdit、createComboBox、createMemo、createPanel、createRadioGroup、createStringGrid、createTreeView,将他们的Align都设为alTop。在UniContainerPanel1上放一个UniCheckBox并将其Name设为cbDragFlag,将其Caption设为“允许拖拽”。如下图所示,左侧八个按钮分别用来动态创建不同的控件,勾选上“允许拖拽”后新创建的控件可以用鼠标拖拽,拖拽后将在右侧的UniMemoLog控件里显示控件的新坐标位置,新创建的控件将在UniContainerPanel2里面出现,鼠标点哪里新创建的控件将出现在哪里。

7.10.2功能实现

1、Main.h引用动态创建控件的头文件

//---------------------------------------------------------------------------

#ifndef MainH

#define MainH

//---------------------------------------------------------------------------

。。。

/*添加控件的头文件*/

#include "uniButton.hpp"

#include "uniEdit.hpp"

#include "uniComboBox.hpp"

#include "uniMemo.hpp"

#include "uniPanel.hpp"

#include "uniRadioGroup.hpp"

#include "uniStringGrid.hpp"

#include "uniTreeView.hpp"

/*----------------*/

 

2、Main.h定义一些变量和函数

class TMainForm : public TUniForm

{

__published:    // IDE-managed Components

。。。

private:    // User declarations

         int      B1,E1,P1,C1,M1,R1,S1,T1;//定义动态生成控件的序号变量

         int      LastX, LastY;//定义鼠标最后点击位置坐标

         void __fastcall AnyEndDrag(TUniControl *Sender,int Left,int Top);//定义控件拖动结束函数

         void __fastcall ShowHello(TObject *Sender);//定义按钮点击事件函数

public:                // User declarations

         __fastcall TMainForm(TComponent* Owner);

};

 

3、Main.cpp主要功能

         点击UniContainerPanel2的任何位置,记录下鼠标点击坐标,点击左侧的控件创建按钮时将在坐标位置创建一个新控件,拖动控件时让右侧记录下控件的新位置。

 

1)记录鼠标的点击位置

void __fastcall TMainForm::UniContainerPanel2MouseDown(TObject *Sender, TMouseButton Button,

          TShiftState Shift, int X, int Y)

{

//记录点击位置

LastX=X;

LastY=Y;

}

 

2)记录控件拖动后的新位置

         AnyEndDrag是一个公共函数,拖动任何一个新创建的控件,都将记录下控件的新位置,让新创建控件的OnEndDrag=AnyEndDrag即可。

void __fastcall TMainForm::AnyEndDrag(TUniControl *Sender,int Left,int Top)

{

//拖动结束

UniMemoLog->Lines->Add(Sender->Name+"的X位置:"+String(Left)+" Y位置:"+String(Top));

UniMemoLog->Lines->Add("--------------------------------------------------------");

}

 

3)控制新控件是否可以拖动

void __fastcall TMainForm::cbDragFlagChange(TObject *Sender)

{

//是否可拖动控制

TUniControl *uControl;

if(cbDragFlag->Checked)

         {//可以拖动

         for(int i=0;i<UniContainerPanel2->ControlCount;i++)

                   {

                   uControl=(TUniControl*)UniContainerPanel2->Controls[i];

                   uControl->Draggable->Enabled =true;

                   uControl->Cursor=crDrag;

                   }

         }

else

         {//不可拖动

         for(int i=0;i<UniContainerPanel2->ControlCount;i++)

                   {

                   uControl=(TUniControl*)UniContainerPanel2->Controls[i];

                   uControl->Draggable->Enabled=false;

                   uControl->Cursor=crDefault;

                   }

         }

}

 

4)动态创建UniButton按钮

ShowHello是一个自定义的功能函数,如果想让按钮的点击事件调用ShowHello函数,设置按钮的OnClick=ShowHello即可。

void __fastcall TMainForm::ShowHello(TObject *Sender)

{//控件点击事件

ShowMessageN("Hello World");

}

//---------------------------------------------------------------------------

void __fastcall TMainForm::createButtonClick(TObject *Sender)

{

B1++;

TUniButton * newCtl=new TUniButton(this);

newCtl->Left=LastX;

newCtl->Top=LastY;

newCtl->Parent=UniContainerPanel2;

newCtl->Caption="UniButton"+String(B1);

newCtl->Name=newCtl->Caption;

newCtl->Draggable->Enabled=true;

newCtl->Cursor=crDrag;

newCtl->OnEndDrag=AnyEndDrag;

newCtl->OnClick=ShowHello;//调用按钮点击事件

}

 

5)动态创建UniEdit控件

void __fastcall TMainForm::createEditClick(TObject *Sender)

{

E1++;

TUniEdit * newCtl=new TUniEdit(this);

newCtl->Left=LastX;

newCtl->Top=LastY;

newCtl->Parent=UniContainerPanel2;

newCtl->Caption="UniEdit"+String(E1);

newCtl->Name=newCtl->Caption;

newCtl->Draggable->Enabled=true;

newCtl->Cursor=crDrag;

newCtl->OnEndDrag=AnyEndDrag;

 

newCtl->Width=200;

newCtl->FieldLabel="姓名";

newCtl->FieldLabelWidth=30;

newCtl->Text="";

newCtl->EmptyText="请输入姓名";

}

 

6)动态创建UniComboBox控件

void __fastcall TMainForm::createComboBoxClick(TObject *Sender)

{

C1++;

TUniComboBox * newCtl=new TUniComboBox(this);

newCtl->Left=LastX;

newCtl->Top=LastY;

newCtl->Parent=UniContainerPanel2;

newCtl->Caption="UniComboBox"+String(C1);

newCtl->Name=newCtl->Caption;

newCtl->Draggable->Enabled=true;

newCtl->Cursor=crDrag;

newCtl->OnEndDrag=AnyEndDrag;

 

newCtl->Items->Add("大连理工大学");

newCtl->Items->Add("武汉理工大学");

newCtl->Items->Add("南京理工大学");

newCtl->Items->Add("湖北理工大学");

newCtl->Items->Add("江苏理工大学");

newCtl->ItemIndex=0;

}

 

7)动态创建UniMemo控件

void __fastcall TMainForm::createMemoClick(TObject *Sender)

{

M1++;

TUniMemo * newCtl=new TUniMemo(this);

newCtl->Left=LastX;

newCtl->Top=LastY;

newCtl->Parent=UniContainerPanel2;

newCtl->Caption="UniMemo"+String(M1);

newCtl->Name=newCtl->Caption;

newCtl->Draggable->Enabled=true;

newCtl->Cursor=crDrag;

newCtl->OnEndDrag=AnyEndDrag;

 

newCtl->ScrollBars=ssBoth;

newCtl->Font->Size=12;

newCtl->Font->Color=clRed;

newCtl->WordWrap=false;//不自动换行

for(int i=0;i<20;i++)

newCtl->Lines->Add("我自来大连理工大学,我的学号是:"+String(i));

}

 

8)动态创建UniPanel控件

void __fastcall TMainForm::createPanelClick(TObject *Sender)

{

P1++;

TUniPanel * newCtl=new TUniPanel(this);

newCtl->Left=LastX;

newCtl->Top=LastY;

newCtl->Parent=UniContainerPanel2;

newCtl->Caption="UniPanel"+String(P1);

newCtl->Name=newCtl->Caption;

newCtl->Draggable->Enabled=true;

newCtl->Cursor=crDrag;

newCtl->OnEndDrag=AnyEndDrag;

 

newCtl->Collapsible=true;

newCtl->Collapsed=false;

newCtl->CollapseDirection=cdTop;

}

 

9)动态创建UniRadioGroup控件

void __fastcall TMainForm::createRadioGroupClick(TObject *Sender)

{

R1++;

TUniRadioGroup * newCtl=new TUniRadioGroup(this);

newCtl->Left=LastX;

newCtl->Top=LastY;

newCtl->Parent=UniContainerPanel2;

newCtl->Caption="UniRadioGroup"+String(R1);

newCtl->Name=newCtl->Caption;

newCtl->Draggable->Enabled=true;

newCtl->Cursor=crDrag;

newCtl->OnEndDrag=AnyEndDrag;

 

newCtl->Items->Add("香蕉");

newCtl->Items->Add("西瓜");

newCtl->Items->Add("苹果");

newCtl->ItemIndex=0;

}

 

10)动态创建UniStringGrid控件

void __fastcall TMainForm::createStringGridClick(TObject *Sender)

{

S1++;

TUniStringGrid * newCtl=new TUniStringGrid(this);

newCtl->Left=LastX;

newCtl->Top=LastY;

newCtl->Parent=UniContainerPanel2;

newCtl->HeaderTitle="UniStringGrid"+String(S1);

newCtl->Name=newCtl->HeaderTitle;

newCtl->Draggable->Enabled=true;

newCtl->Cursor=crDrag;

newCtl->OnEndDrag=AnyEndDrag;

 

newCtl->ShowColumnTitles=true;//显示列标题

newCtl->StripeRows=true;//条带化

newCtl->RowCount=5;

newCtl->ColCount=3;

for(int i=0;i<newCtl->RowCount;i++)

         for(int j=0;j<newCtl->ColCount;j++)

                   {

                   newCtl->Cells[j][i]=String(i*j);

                   }

}

 

11)动态创建UniTreeView控件

void __fastcall TMainForm::createTreeViewClick(TObject *Sender)

{

T1++;

TUniTreeNode *newNode;

TUniTreeView * newCtl=new TUniTreeView(this);

newCtl->Left=LastX;

newCtl->Top=LastY;

newCtl->Width=200;

newCtl->Height=250;

newCtl->Parent=UniContainerPanel2;

newCtl->Title="UniTreeView"+String(T1);

newCtl->Name=newCtl->Title;

newNode=newCtl->Items->Add(NULL,"中华人民共和国");

newCtl->Items->AddChild(newNode,"辽宁");

newCtl->Items->AddChild(newNode,"北京");

newCtl->Items->AddChild(newNode,"广西");

newCtl->Items->AddChild(newNode,"湖南");

newCtl->Items->AddChild(newNode,"吉林");

newCtl->Draggable->Enabled=true;

newCtl->Cursor=crDrag;

newCtl->OnEndDrag=AnyEndDrag;

}

7.10.3运行效果

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值