(中行雷威2018.5.25)
(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群。)
【阅读倡议】
1、有问题请留言;
2、没问题请点赞;
3、看连载请加群;
4、下源码请加群;
【开发工具】
1、C++Builder10.2.2tokyo
2、FMSoft_uniGUI_Complete_Professional_1.10.0build1456
UniGui做web和bcb做vcl程序有太多不一样的地方,本文将通过几个实例详细讲解如何使用单用户全局变量和多用户共享变量,及如何设置同步响应异步相应模式。
一、全局变量(主界面上UniGroupBox1)
在uniGui下,全局变量分为单用户全局变量和多用户共享变量,前者指一次浏览器登录后全局共享的变量,后者指不同用户或者多用户同时登录浏览器时共享的变量。单用户或单链接独享变量定义在UniMainModule.h的public下,多用户共享变量定义在UniServerModule.h的public下。
1、MainModule.h
//---------------------------------------------------------------------------
#ifndef MainModuleH
#define MainModuleH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <UniGUIMainModule.hpp>
//---------------------------------------------------------------------------
class TUniMainModule : public TUniGUIMainModule
{
__published: // IDE-managed Components
void __fastcall UniGUIMainModuleCreate(TObject *Sender);
private: // User declarations
public: // User declarations
int i;//定义一个单用户全局变量
__fastcall TUniMainModule(TComponent* Owner, TComponent* AUniApplication);
};
//---------------------------------------------------------------------------
TUniMainModule *UniMainModule(void);
//---------------------------------------------------------------------------
#endif
2、ServerModule.h
//---------------------------------------------------------------------------
#ifndef ServerModuleH
#define ServerModuleH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <uniGUIServer.hpp>
//---------------------------------------------------------------------------
class TUniServerModule : public TUniGUIServerModule
{
__published: // IDE-managed Components
void __fastcall UniGUIServerModuleCreate(TObject *Sender);
private: // User declarations
public: // User declarations
int j;//定义一个多用户共享变量
__fastcall TUniServerModule(TComponent* Owner);
virtual void __fastcall FirstInit(void);
};
//---------------------------------------------------------------------------
TUniServerModule *UniServerModule(void);
//---------------------------------------------------------------------------
#endif
特别注意:Unigui Web下调用变量和VCL不一样,VCL下是 Form1->i 形式调用,但是在Unigui下是 Form1()->i 形式调用。
3、单用户全局变量测试
void __fastcall TMainForm::UniBitBtn1Click(TObject *Sender)
{
//单用户全局变量自增加
UniMainModule()->i++;
}
void __fastcall TMainForm::UniBitBtn3Click(TObject *Sender)
{
//显示单用户全局变量
ShowMessage(UniMainModule()->i);
}
void __fastcall TMainForm::UniBitBtn2Click(TObject *Sender)
{
//多用户共享变量自增加
UniServerModule()->j++;
}
void __fastcall TMainForm::UniBitBtn4Click(TObject *Sender)
{
//显示多用户共享变量
ShowMessage(UniServerModule()->j);}
测试方法,找两台电脑或者一台电脑,分别用两个浏览器登录,分别点击变量自增加,然后显示查看变量值,你会发现在MainModule下定义的变量在两个浏览器上是独立控制的,在ServerModule下定义的变量在两个浏览器上是共享的。
二、同步异步响应(主界面上UniGroupBox2)
在VCL模式下消息弹出框是同步模式,即等待客户操作,然后继续后续代码,但是在Unigui Web下你会发现默认是异步模式,即消息框出来时不等待客户操作,后续代码继续运行直到结束。那么如何解决这个问题呢?很简单,MainModule有一个属性叫EnableSynchronousOperations,设置为true后就会出现和vcl程序一样的效果了。本程序UniGroupBox2演示了设置属性前后带来的变化。
void __fastcall TMainForm::UniBitBtn5Click(TObject *Sender)
{
int m=0;
ShowMessage(m);
m++;
UniMemo1->Lines->Add(m);
}
上述代码,不设置EnableSynchronousOperations参数时,在弹出消息对话框ShowMessage同时UniMemo1也增加了一行,说明并不等待客户操作。设置EnableSynchronousOperations参数时,只有你操作弹出的对话框之后,UniMemo1才增加了一行。
三、窗口之间变量传递(主界面上UniGroupBox3)
本例子演示MainForm和UniForm1共享UniMainModule的public变量i,UniForm1共享MainForm的public变量f。
1、Main.h
//---------------------------------------------------------------------------
#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <uniGUIForm.hpp>
#include <uniGUIRegClasses.hpp>
#include "uniBitBtn.hpp"
#include "uniButton.hpp"
#include "uniGUIBaseClasses.hpp"
#include "uniGUIClasses.hpp"
#include "uniGroupBox.hpp"
#include "uniMemo.hpp"
//---------------------------------------------------------------------------
class TMainForm : public TUniForm
{
__published: // IDE-managed Components
TUniGroupBox *UniGroupBox1;
TUniBitBtn *UniBitBtn1;
TUniBitBtn *UniBitBtn2;
TUniBitBtn *UniBitBtn3;
TUniBitBtn *UniBitBtn4;
TUniGroupBox *UniGroupBox2;
TUniBitBtn *UniBitBtn5;
TUniMemo *UniMemo1;
TUniGroupBox *UniGroupBox3;
TUniBitBtn *UniBitBtn6;
void __fastcall UniFormCreate(TObject *Sender);
void __fastcall UniBitBtn3Click(TObject *Sender);
void __fastcall UniBitBtn4Click(TObject *Sender);
void __fastcall UniBitBtn1Click(TObject *Sender);
void __fastcall UniBitBtn2Click(TObject *Sender);
void __fastcall UniBitBtn5Click(TObject *Sender);
void __fastcall UniBitBtn6Click(TObject *Sender);
private: // User declarations
public: // User declarations
int f;//定义一个共享给UniForm1的变量
__fastcall TMainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
TMainForm *MainForm(void);
//---------------------------------------------------------------------------
#endif
2、MainForm调用UniForm1
void __fastcall TMainForm::UniBitBtn6Click(TObject *Sender)
{
TUniForm1 *form1=new TUniForm1(UniApplication);
form1->ShowModal();
ShowMessage(UniMainModule()->i);
}
//---------------------------------------------------------------------------
3、UniForm1获得MainForm()->f变量然后设置MainForm()->f变量
void __fastcall TUniForm1::UniFormActivate(TObject *Sender)
{
//引用MainForm的变量
UniEdit1->Text=MainForm()->f;}
//---------------------------------------------------------------------------
void __fastcall TUniForm1::UniBitBtn1Click(TObject *Sender)
{
//设置UniMainModule的变量
UniMainModule()->i=UniEdit1->Text.ToInt();this->Close();
}
至此,一个关于unigui下的变量调用和有效范围的说明和同步模式设置、变量传递已经说明完毕。在IE浏览器中输入http://127.0.0.1:8077就可以观看效果了。如果需要源代码请到我的QQ文件共享下A02-源代码寻找本课程编号13。