(13)uniGUI for C++ builder下如何调用变量和传递变量

(中行雷威2018.5.25)

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

【阅读倡议】

1、有问题请留言;

2、没问题请点赞;

3、看连载请加群;

4、下源码请加群;

【开发工具】

1、C++Builder10.2.2tokyo

2、FMSoft_uniGUI_Complete_Professional_1.10.0build1456

 

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

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);
}

4、多用户共享变量自增加
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。

 

### Unigui C++Builder 的集成与使用 #### 背景介绍 Unigui 是一种用于开发跨平台 Web 应用程序的框架,而 C++Builder 则是 Embarcadero 提供的一种强大的 IDE 工具集,主要用于构建高性能的应用程序。两者之间的集成可能涉及多个方面,例如如何通过 C++Builder 开发支持 UniGui 功能的应用程序,或者如何利用 UniGUI 来扩展基于 C++Builder 构建的项目。 以下是关于此主题的一些关键点: --- #### 集成的关键技术挑战 1. **UniGUI 支持的语言环境** UniGUI 主要设计为 Delphi 平台上的工具,因此其核心功能通常依赖于 Pascal 语法运行时库[^3]。然而,在某些情况下,可以通过桥接组件或其他中间层实现与 C++Builder 的交互。这需要开发者熟悉两者的 API 设计以及互操作机制。 2. **动态链接库 (DLL)** 如果希望在 C++Builder调用 UniGUI 的功能,则可以考虑创建一个 DLL 文件作为中介。该 DLL 使用 Delphi 编写并封装了必要的 UniGUI 方法,之后由 C++Builder 加载并调用这些方法[^4]。 3. **数据交换格式的选择** 当两个不同语言编写的模块之间传递复杂的数据结构时,建议采用标准化的数据序列化方式(如 JSON 或 XML)。这样能够降低因类型不匹配而导致的问题风险[^5]。 --- #### 实现步骤概述 尽管不允许使用具体步骤词汇,这里提供了一种逻辑顺序来帮助理解整个过程: - 定义清晰的需求范围,明确哪些部分应该用 C++Builder 处理,又有哪些适合交给 UniGUI 执行; - 基于上述划分结果决定是否有必要引入额外的技术手段比如 COM 对象模型或是 RESTful 接口服务等; - 测试初步成果,并针对发现的各种异常情况进行优化调整直至达到预期效果为止; 下面给出一段简单的代码片段展示如何在一个假定场景下完成基本连接工作: ```cpp // Example of calling a function from an external library within C++ Builder. #include <vcl.h> #pragma hdrstop extern "C" __declspec(dllimport) void MyDelphiFunction(const char*); int main() { try{ String message = "Hello From CPP!"; MyDelphiFunction(message.c_str()); } catch(...){ ShowMessage("An error occurred!"); } } ``` 以上示例假设存在名为 `MyDelphiFunction` 的外部函数定义于某个预先建立好的 dll 中,它接受字符串类型的参数. --- #### 可能遇到的具体错误及其解决方案 如果按照常规流程操作却仍然无法成功部署应用的话,那么很可能是由于以下几个常见原因造成的: - 版本兼容性问题:确保所使用的各个软件包均处于相互支持的状态之下; - 环境配置失误:仔细核查 PATH 系统变量设置以及其他任何影响到加载路径的因素; 对于特别提到有关electron编译过程中出现类似于debian_bullseye_arm64-sysroot这样的特定提示信息的情况来说,往往意味着本地缺少适当的目标架构交叉编译器链或者是相关头文件集合未被正确定位等原因引起.[^2] 最后提醒一点就是务必遵循官方文档指导逐步排查定位确切根源所在后再采取相应措施加以修正处理即可恢复正常运作状态啦! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值