(中行雷威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运行效果