GCC 使用 VCL(LCL) https://github.com/ying32/liblcl

jfet 2020-12-24 11:28:03
项目地址:
https://github.com/ying32/liblcl

熟悉的库跨平台开源无版权问题


c语言调用liblcl示例

// main.c : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "liblcl.h"


#ifdef _WIN32
// UTF8解码
char *UTF8Decode(char* str) {
int len = MultiByteToWideChar(CP_UTF8, 0, str, -1, 0, 0);
wchar_t* wCharBuffer = (wchar_t*)malloc(len * sizeof(wchar_t) + 1);
MultiByteToWideChar(CP_UTF8, 0, str, -1, wCharBuffer, len);

len = WideCharToMultiByte(CP_ACP, 0, wCharBuffer, -1, 0, 0, 0, NULL);
char* aCharBuffer = (char*)malloc(len * sizeof(char) + 1);
WideCharToMultiByte(CP_ACP, 0, wCharBuffer, -1, aCharBuffer, len, 0, NULL);
free((void*)wCharBuffer);

return aCharBuffer;
}
#endif

// 按钮单击事件
void onButton1Click(TObject sender) {
ShowMessage("Hello world!");
}

// 文件拖放事件
void onOnDropFiles(TObject sender, void* aFileNames, intptr_t len) {
printf("aFileNames: %p, len=%d\n", aFileNames, len);
intptr_t i;
// GetFPStringArrayMember 为一个从Lazarus的string数组中获取成员的函数。
for (i = 0; i < len; i++) {

#ifdef _WIN32
// 由于liblcl使用的是UTF-8编码,所以获取或者传入的在Windows下都要经过UTF-8编/解码
char *filename = UTF8Decode(GetFPStringArrayMember(aFileNames, i));
#else
// Linux与macOS默认都是UTF-8,则无需编/解码
char *filename = GetFPStringArrayMember(aFileNames, i);
#endif
printf("file[%d]=%s\n", i+1, filename);
#ifdef _WIN32
free((void*)filename);
#endif
}
}

// 窗口键盘按下事件
void onFormKeyDown(TObject sender, Char* key, TShiftState shift) {
printf("key=%d, shift=%d\n", *key, shift);
if (*key == vkReturn) {
ShowMessage("press Enter!");
}

TShiftState s = Include(0, ssAlt);
if (InSet(s, ssAlt)) {
printf("ssAlt1\n");
}
s = Exclude(s, ssAlt);
if (!InSet(s, ssAlt)) {
printf("ssAlt2\n");
}
}

// 编辑框内容改变事件
void onEditChange(TObject sender) {
printf("%s\n", Edit_GetText(sender));
}

int main()
{
// 加载库
#ifdef _WIN32
if (load_liblcl("liblcl.dll")) {
#endif
#ifdef __linux__
if (load_liblcl("liblcl.so")) {
#endif
#ifdef __APPLE__
if (load_liblcl("liblcl.dylib")) {
#endif

// 主窗口显示在任务栏,仅Windows有效
Application_SetMainFormOnTaskBar(Application, TRUE);
// 应用程序标题,影响到:比如ShowMessage的标题。
Application_SetTitle(Application, "Hello LCL");
// 初始化应用程序
Application_Initialize(Application);

// 创建窗口
TForm form = Application_CreateForm(Application, FALSE);
// 设置窗口标题
Form_SetCaption(form, "LCL Form");
// 设置窗口位置
Form_SetPosition(form, poScreenCenter);

// --- 拖放文件测试 ---
// 接受文件拖放
Form_SetAllowDropFiles(form, TRUE);
// 拖放文件事件
Form_SetOnDropFiles(form, onOnDropFiles);

// 窗口优先接受按键,不受其它影响
Form_SetKeyPreview(form, TRUE);

// 窗口按键事件
Form_SetOnKeyDown(form, onFormKeyDown);

// ---------- 从内存流或者文件加载UI布局文件 ----------
// 从文件加载窗口设置
// 从流加载
//TMemoryStream mem = NewMemoryStream();
//MemoryStream_Write(mem, data, datalen);
//MemoryStream_SetPosition(mem, 0);
//ResFormLoadFromStream(mem, form);
//MemoryStream_Free(mem);

// 从文件加载
//ResFormLoadFromFile("./Form1.gfm", form);

// ---------- 动态创建控件 ----------
// 创建一个按钮
TButton btn = Button_Create(form);
// 设置子父窗口
Button_SetParent(btn, form);
// 设置按钮单击事件
Button_SetOnClick(btn, onButton1Click);
// 设置按钮标题
Button_SetCaption(btn, "button1");
// 设置按钮在Parent的左边位置
Button_SetLeft(btn, 100);
// 设置按钮在Parent的顶边位置
Button_SetTop(btn, 100);

// 创建一个单行文件框(多行为TMemo)
TEdit edit = Edit_Create(form);
// 设置子父窗口
Edit_SetParent(edit, form);
// 设置左边
Edit_SetLeft(edit, 10);
// 设置顶边
Edit_SetTop(edit, 10);
// 设置编辑器内容改变事件
Edit_SetOnChange(edit, onEditChange);

// 运行app
Application_Run(Application);

// 释放liblcl库
close_liblcl();
}
return 0;
}
...全文
1461 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jfet 2020-12-25
  • 打赏
  • 举报
回复
实际这是GO语言使用vcl的附带项目,我们现在更愿意用GO来写客户端,简单不出错。服务器端也用GO,移动端用flutter,开发工具用vscode,还有一个插件在Lazarus中设计界面生成GO代码
  • 打赏
  • 举报
回复
如果考虑跨平台和版权的话,用fpc/Lazarus就可以了,还可以静态链接gcc写的功能模块。当然如果能做到gcc静态链接fpc生成的obj,实用价值就更大了,几乎就是跨平台免费版的C++Builder了,但是难度不小。
  • 打赏
  • 举报
回复
好吧,典型的开源项目的杂凑模式~~~
ooolinux 2020-12-24
  • 打赏
  • 举报
回复
类库封装成C库?界面设计怎么弄?
jfet 2020-12-24
  • 打赏
  • 举报
回复
更多的意义是跨平台和版权
ooolinux 2020-12-24
  • 打赏
  • 举报
回复
引用 6 楼 早打大打打核战争 的回复:
CB有Linux版编译器,但是目前只支持x64,不支持x86、ARM、MIPS

交叉编译、运行、调试方面会麻烦一点。
  • 打赏
  • 举报
回复
CB有Linux版编译器,但是目前只支持x64,不支持x86、ARM、MIPS
ooolinux 2020-12-24
  • 打赏
  • 举报
回复
如果有个C++版的Lazarus就好了,在Linux平台会比较方便。
  • 打赏
  • 举报
回复
感觉意义不大,不如UI用Lazarus搞,然后链接gcc写的功能模块,这样既可以动态链接也可以静态链接(Free Pascal也能静态链接C的obj)
jfet 2020-12-24
  • 打赏
  • 举报
回复
动态链接的,使用的是LCL库(Lazarus 那套库)
  • 打赏
  • 举报
回复
动态链接的?我曾经尝试gcc静态链接Delphi生成的obj,用到VCL、FMX的都没搞成功,没有外部依赖的是可以,但是意义不大
内容概要:本文聚焦风电出力的不确定性问题,采用拉丁超立方抽样(Latin Hypercube Sampling, LHS)方法生成具有统计代表性的风电出力初始场景集,有效克服传统蒙特卡洛抽样存在的样本冗余与收敛速度慢的缺陷。为进一步降低场景数量以提升电力系统优化调度的计算效率,研究结合K-means聚类、快速前向选择等场景缩减技术,对生成的高维场景进行聚合与概率修正,保留最具代表性的典型场景及其对应概率分布。整个建模流程在Matlab平台上编程实现,形成一套完整的“抽样—生成—缩减—验证”的不确定性建模框架,为含高比例风电的电力系统提供高质量、低冗余的输入场景集,显著增强随机优化、鲁棒优化等模型的求解效率与工程实用性。; 适合人群:具备电力系统分析、概率统计基础及Matlab编程能力,从事新能源并网、电力系统优化调度、不确定性建模与风险评估等方向的科研人员、工程技术人员及研究生。; 使用场景及目标:①应用于风电主导的电力系统随机优化调度、机会约束规划、鲁棒经济调度等场景,提升模型对不确定性的刻画能力;②帮助研究者深入掌握拉丁超立方抽样与场景缩减的核心原理与实现方法,构建高精度的不确定性输入模型;③为复杂电力系统仿真提供经过科学约简的典型场景集,平衡计算精度与效率,支撑实际工程决策。; 阅读建议:建议读者结合提供的Matlab代码逐模块调试与运行,重点理解LHS在多维空间中的分层抽样机制、场景距离度量方式及聚类缩减过程中的概率守恒原则,关注缩减前后场景集的分布保真性与计算效率提升效果,以全面掌握风电不确定性建模的关键技术路径。
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 全国范围内的飞思卡尔智能车竞赛是一项专注于在校大学生的科技创新项目,其目的在于通过设计并制造一辆能够执行特定任务的智能车辆,以增强学生的创新思维和工程实践技能。在此过程中,参赛团队需要开发相应的控制程序代码,用以确保智能车的平稳运作以及高级功能,例如路径选择、障碍物躲避等。本文将详细分析飞思卡尔智能车竞赛程序代码中常见的几个核心信息技术范畴:PID控制方法、智能控制方法、图像识别方法以及超声波测距技术。 PID控制方法作为智能车控制系统的核心组成部分,通过模仿人类的驾驶行为,并融合传感器提供的实时数据,对车辆的运动进行精确调控。在智能车竞赛中,PID控制通常被应用于处理车速、方向和加速度等多个控制方面。一个标准的PID控制系统主要由三个关键部分构成:比例部分(P)、积分部分(I)和微分部分(D)。比例部分负责减少误差,积分部分旨在消除稳态误差,而微分部分则预测误差的发展趋势,从而实现快速响应变化。通过调整PID参数,可以使智能车在赛道上保持稳定,并能迅速适应赛道条件的变化。 智能控制方法的实现是智能车在复杂环境中有效运行的关键。智能控制往往需要整合机器学习和人工智能技术,例如模糊逻辑、神经网络或遗传算法等。在智能车竞赛场景下,车辆需要依据传感器收集的环境数据,完成对路线的识别、障碍物的规避等任务。路径规划方法能够协助车辆挑选最优的行驶路线,而避障策略则保障车辆能够安全地绕开前方的障碍物。此外,智能车还应具备一定的学习功能,能够适应环境的变化,并作出相应的调整。 图像识别方法对于智能车对赛道的感知能力具有决定性作用。车辆通常配备摄像头或其他视觉传感器来采集图像信息。借助图像处理...

551

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧