(中行雷威2019.2.6)
(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群。)
【阅读倡议】
1、有问题请留言;
2、没问题请点赞;
3、看连载请加群;
4、下源码请加群;
【开发工具】
1、C++Builder10.2.3 tokyo
2、FMSoft_uniGUI_Complete_Professional_1.70.0.1485(正版)
3、本案例资源下载https://download.csdn.net/download/dlboy2018/10949772
4、也可访问我的QQ文件共享:A02-源代码 下载
本人主笔的国内第一本uniGUI教学案例代码已诞生,分为cbuilder和delphi两个版本,买代码送手册,需要的朋友可以加入我的QQ技术交流群484979943、860634510、299497712给我(群主)留言。资料简介:https://blog.csdn.net/dlboy2018/article/details/88923832
一、设计目标
UniDBGrid表格控件可以在最前面出现“√”,用来选择记录,本表格还支持多选,本文将演示如何实现记录多选和在两个表格之间互相挪动表格记录。官方demo在C:\Program Files (x86)\FMSoft\Framework\uniGUI\Demos\Desktop\GridMultiSelect(delphi版),官方demo用ClientDataSet作为数据源,本例子用uniDAC控件组访问oracle作为数据源。主要界面如下图:
二、功能设计
1、创建项目
d:\gridMultiSelect,创建项目standalone exe模式,包含include和lib到“C:\Program Files (x86)\FMSoft\Framework\uniGUI\win32”。本例子使用oracle做为数据源,通过uniDAC控件组实现数据库访问,还要包含C:\Program Files (x86)\Devart\UniDAC for RAD Studio 10.2\Include\Win32头文件和C:\Program Files (x86)\Devart\UniDAC for RAD Studio 10.2\Lib\Win32库文件。关闭项目,再次打开。
2、数据库链接
在MainModule窗口下放置数据库链接控件UniConnection和OracleUniProvider控件,将UniConnection控件的ProviderName设为Oracle,LoginPrompt设为false。
void __fastcall TUniMainModule::UniGUIMainModuleBrowserClose(TObject *Sender)
{
//浏览器关闭时断开连接
UniConnection1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TUniMainModule::UniGUIMainModuleCreate(TObject *Sender)
{
//链接数据库
String dbIp="127.0.0.1",dbUser="webframe",dbPass="webframe2018",dbPort="1521",dbSid="ORCL";
UniConnection1->Disconnect();
UniConnection1->ProviderName="Oracle";
UniConnection1->SpecificOptions->Add("direct=true");
//UniConnection1->SpecificOptions->Add("Charset=ZHS16GBK");
UniConnection1->Username=dbUser;
UniConnection1->Password=dbPass;
UniConnection1->Server=dbIp+":"+dbPort+":"+dbSid;
//ShowMessageN(UniConnection1->Server);
try
{
UniConnection1->Connect();
}
catch(...)
{
Uniguidialogs::ShowMessage("连接数据库["+dbIp+"]失败!");
//FormMain->Close();
}
}
//---------------------------------------------------------------------------
数据源为atable1和atable2两个结构一样的表格。
DROP TABLE WEBFRAME.ATABLE1 CASCADE CONSTRAINTS;
CREATE TABLE WEBFRAME.ATABLE1
(
USER_NAME NVARCHAR2(10),
USER_AGE NVARCHAR2(10),
USER_SEX NVARCHAR2(10)
)
TABLESPACE USERS
RESULT_CACHE (MODE DEFAULT)
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 64K
NEXT 1M
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;
DROP TABLE WEBFRAME.ATABLE2 CASCADE CONSTRAINTS;
CREATE TABLE WEBFRAME.ATABLE2
(
USER_NAME NVARCHAR2(10),
USER_AGE NVARCHAR2(10),
USER_SEX NVARCHAR2(10)
)
TABLESPACE USERS
RESULT_CACHE (MODE DEFAULT)
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 64K
NEXT 1M
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;
3、主窗口
主窗口MainForm要包含UniMainModule窗口#include "MainModule.h"
在主窗口MainForm上放置两个UniDBGrid表格,两个UniDataSource,两个UniQuery,三个UniBitBtn控件。
1)UniDBGrid1属性设置:
DataSource=UniDataSource1
Options-》dgRowSelect=true (选择行)
Options-》dgCheckSelect=true(勾选)
Options-》dgMultiSelect=true(多选)
ReadOnly=true(只读)
WebOptions-》PageSize=25(页记录数)
2)UniDataSource1的属性设置:
DataSet=UniQuery1
3)UniQuery1的属性设置:
Connection=UniMainModule.UniConnection1
4)UniDBGrid2属性设置:
DataSource=UniDataSource2
Options-》dgRowSelect=true (选择行)
Options-》dgCheckSelect=true(勾选)
Options-》dgMultiSelect=true(多选)
ReadOnly=true(只读)
WebOptions-》PageSize=25(页记录数)
5)UniDataSource2的属性设置:
DataSet=UniQuery2
6)UniQuery2的属性设置:
Connection=UniMainModule.UniConnection1
4、主要代码
//---------------------------------------------------------------------------
#include <vcl.h>
#include <uniGUIVars.hpp>
#pragma hdrstop
#include "Main.h"
#include "MainModule.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "uniBasicGrid"
#pragma link "uniBitBtn"
#pragma link "uniButton"
#pragma link "uniDBGrid"
#pragma link "uniGUIBaseClasses"
#pragma link "uniGUIClasses"
#pragma link "DBAccess"
#pragma link "MemDS"
#pragma link "Uni"
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
TMainForm *MainForm(void)
{
return( (TMainForm *)UniMainModule()->GetFormInstance(__classid(TMainForm)));
}
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TUniForm(Owner)
{
}
//---------------------------------------------------------------------------
void T71AFFD34A4414BB2B5EA38264ABFC349__RegisterFormClass() {
Uniguivars::RegisterAppFormClass(__classid(TMainForm));
Uniguiregclasses::CPPInit();
}
#pragma startup T71AFFD34A4414BB2B5EA38264ABFC349__RegisterFormClass
void __fastcall TMainForm::UniFormBeforeShow(TObject *Sender)
{
//查询表一
UniQuery1->Close();
UniQuery1->SQL->Clear();
UniQuery1->SQL->Add("select * from atable1");
UniQuery1->Open();
//查询表二
UniQuery2->Close();
UniQuery2->SQL->Clear();
UniQuery2->SQL->Add("select * from atable2");
UniQuery2->Open();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::UniBitBtn1Click(TObject *Sender)
{
//从左侧向右侧挪
for(int i=0;i<UniDBGrid1->SelectedRows->Count;i++)
{
UniQuery1->Bookmark = UniDBGrid1->SelectedRows->Items[i];
UniQuery2->Append();
UniQuery2->CopyFields(UniQuery1);
UniQuery2->Post();
}
UniDBGrid1->SelectedRows->Delete();
UniQuery1->Refresh();
UniQuery2->Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::UniBitBtn2Click(TObject *Sender)
{
//从右侧向左侧挪
for(int i=0;i<UniDBGrid2->SelectedRows->Count;i++)
{
UniQuery2->Bookmark = UniDBGrid2->SelectedRows->Items[i];
UniQuery1->Append();
UniQuery1->CopyFields(UniQuery2);
UniQuery1->Post();
}
UniDBGrid2->SelectedRows->Delete();
UniQuery1->Refresh();
UniQuery2->Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::UniBitBtn3Click(TObject *Sender)
{
//取表格的某个字段
String tmpStr="";
//方法一
//for(int i=1;i<UniQuery2->RecordCount+1;i++)
// {
// UniQuery2->RecNo=i;
//
// tmpStr+=UniQuery2->FieldByName("user_name")->AsString;
// }
//ShowMessage(tmpStr);
//方法二
for(int i=1;i<UniDBGrid2->DataSource->DataSet->RecordCount+1;i++)
{
UniDBGrid2->DataSource->DataSet->RecNo=i;
tmpStr+=UniDBGrid2->DataSource->DataSet->FieldByName("user_name")->AsString;
}
ShowMessage(tmpStr);
}
//---------------------------------------------------------------------------