Lazarus速查

从其它平台迁移而来 Package->Install/Uninstall Packages AnchorDockingDsgn:安装后转为一体式IDE LazActiveX:安装后可安装ActiveX组件 lazdaemon:可开发windows服务 lazprojectgroups:使IDE支持工程组 lazvlc:VLC 播放器组件,需要V2版本以上的libvlccore.dll和libvlc.dll Package->Online Package Manager DBTreeViewAndDBCntrlGrid:可从数据集中把树型数据直接显示为树 DCPcrypt:常用加密/解密,如DES、3DES、AES、RC2、RC4、RC5、RC6、MD4、MD5、SHA1、SHA256、SHA384、SHA512等 自带单元 fpjson、jsonscanner、jsonparser:自带JSON jsonConf:JSON配置 fphttpclient:HTTP客户端 fphttpserver:HTTP服务端 base64:BASE64编码/解码 md5:MD2、MD4、MD5算法 sha1:SHA-1(RFC 3174)算法 crcCRC32、CRC64和CRC128算法 开源库 dataset-serialize:数据集与JSON序列化/反序列化 CEF4Delphi:谷歌浏览器内核,依赖DCPcrypt

2022-06-23 22:55:57 · 1 分钟 · 慢步道人

Lazarus报Error: Undefined symbol

从其它平台迁移而来 在使用Lazarus编写动态库的过程中遇到了报Error: Undefined symbol:错误的问题,死活编译不过去,加了LCL包依赖也不行,找了N久终于在一个英文网站上找到了解决办法。 Error: Undefined symbol:错误会依据所写的代码用到的单元不同而有一定的差异,我遇到的报错大致如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 project1.lpr(18,1) Error: Undefined symbol: WSRegisterCustomImageListResolution project1.lpr(18,1) Error: Undefined symbol: WSRegisterMenuItem project1.lpr(18,1) Error: Undefined symbol: WSRegisterMenu project1.lpr(18,1) Error: Undefined symbol: WSRegisterMainMenu project1.lpr(18,1) Error: Undefined symbol: WSRegisterPopupMenu project1.lpr(18,1) Error: Undefined symbol: WSRegisterDragImageListResolution project1.lpr(18,1) Error: Undefined symbol: WSRegisterLazAccessibleObject project1.lpr(18,1) Error: Undefined symbol: WSRegisterControl project1.lpr(18,1) Error: Undefined symbol: WSRegisterWinControl project1.lpr(18,1) Error: Undefined symbol: WSRegisterGraphicControl project1....

2022-06-06 21:59:18 · 1 分钟 · 慢步道人

慎用 out

从其它平台迁移而来 最近需要评估一下海康摄像头不同抓拍方式的性能,以及封装类的可靠性。 在测试过程中,又发现了当初遇见的设备内存抓拍报错的问题。当初排查的结论是:当封装类开启预览的情况下,使用设备抓图有较高概率抓拍失败。由于预览是必需的,最终选择了预览抓拍。 现在,换用lazarus进行测试,发现设备抓图必失败,与是否预览无关。一点点调试,发现直接调用SDK原始方法进行设备抓图正常,使用封装类的设备抓图就不行,那肯定是封装类出了问题。 最终发现,封装类的设备抓图使用了out来修饰参数,参数是TMemoryStream和TJPEGImage对象,尝试去掉out修饰符,然后就一切正常了。 记得很久前专门研究过out和var修饰符的区别,当时查阅的结果是:out和var修饰的参数都是传址的,区别是out会对参数进行初始化,而var则不会。 另外,参数为对象的情况,实际也是传址的。 本次发现的问题可能就是使用out来修饰对象参数导致的,但并没有进行进一步的测试。 附 测试环境 操作系统:win10 硬盘:SSD 测试结果 子码流预览抓图,耗时毫秒级;主码流预览抓图,耗时10+毫秒级 预览抓图比设备拍图耗时少得多,设备抓图在100+毫秒级 在相同分辨率情况下,预览抓图的文件大小比设备抓图的略大

2021-12-15 11:29:07 · 1 分钟 · 慢步道人

配置Lazarus免重装

从其它平台迁移而来 事件 过了个十一,原本好好的电脑,突然鼠标不能用了,本着重启能解决80%的问题的原则重启了下,结果就杯具了,直接就蓝屏了,怎么折腾都进不了系统,BUG 10果然是BUG 10,绝对名不虚传! 无奈,只剩下重装系统这一条路了,装完系统之后还要装一堆软件,还要把软件配置成自己的习惯,还有其它一些细节工作……要把这些都做完才能大致恢复到原先的样子,想想就各种不爽。 虽然已经尽可能的使用免安装/重装的软件了,但还是避免不了有一些软件必须要重装才能使用的情况,唉~ 其中最令人头疼的就是开发环境了,几乎绝大部分都要重装,Lazarus就是其中之一,先前已经尝试过了,离成功只差一步了,这次终于搞定了,记录下来。 免重装 正常安装Lazarus 首次启动Lazarus会弹出初始配置界面,关闭 打开Lazarus的根安装目录,新建一个config文件夹 打开C:\Users\xxx\AppData\Local\lazarus文件夹(xxx为用户名),复制里面所有内容到config 找到Lazarus的快捷方式,右键属性,在目标里原有内容后面添加 --pcp=.\config(注意前面有空格),确定 把修改好的快捷方式复制到Lazarus的根安装目录下,供以后使用 删除C:\Users\xxx\AppData\Local\lazarus文件夹 使用刚才的快捷方式启动Lazarus,进行个性化设置、安装组件等 以后重装系统了直接使用快捷方式启动Lazarus即可 如果安装的组件全部都在Lazarus的安装目录下,整个Lazarus的安装目录即为一个便携式的IDE了 为避免如果使用过程中出现莫名其妙的现象,建议把Lazarus的安装目录下的ssleay32.dll、libeay32.dll、Qt5Pas1.dll和Qt4Pas5.dll复制到C:\Windows\System32或C:\Windows\SysWOW64下 本文参考了https://blog.csdn.net/love3s/article/details/7450339 附 在命令行进入Lazarus的根安装目录,运行lazarus.exe -? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 lazarus [options] <project-filename> IDE Options: --help or -?...

2021-10-10 11:21:03 · 2 分钟 · 慢步道人

踩坑记:DBGridEh中取Footer的Sum值

从其它平台迁移而来 DBGridEh算是Delphi中比较好用的第三方数据感知组件了,但其中有些小坑是真的有点小无语的。 场景 客户需要的有这样一组数据,大部分列是要求和的,用DBGridEh的Footer是轻松加愉快的;但是个别列是和每一行的计算方法一致的,用求和反倒是大错特错的,所以要求针对这些个别列按照给定的算法进行计算后显示在Footer中。 坑 Footer有个ValueType和Value属性,汇总类型是通过ValueType设置的,习惯性的以为汇总值是通过Value来读写的。 然而,事实并非如此! 对于求和列,DBGridEh1.Columns[i].Footer.Value的值一直是''空串,要想取得求和列的汇总值,正确的打开方式是DBGridEh1.GetFooterValue(0,DBGridEh1.Columns[i])!这简直是反人类啊有木有! 后记 这是第二次踩这个坑了,记录下,给自己长点记性!事不过三!! 另外,公司使用的版本比较老,新版本可能没有这些问题了,不太清楚,暂时没空去求证。

2021-03-24 16:26:13 · 1 分钟 · 慢步道人

安装 CodeTyphon

从其它平台迁移而来 一直想找个开源的可以商用的Delphi的替代品,能跨平台了最好。开始时试过Lazarus,和D7还真是挺像的,不过用惯了XE,还是想找个习惯相似的IDE,扒拉下论坛后发现了CodeTyphon,就想着试一下。 下载 下载就不多说了,网上很容易找到,而且官方wiki写得也很好,英文好的可以直接看,像我这样的英语渣渣,还是有必要慢慢去啃的。 CodeTyphon下载后只有一个CodeTyphonIns.zip的压缩包,无论是Windows、Linux还是MacOS,安装包都是它,因为不管在哪个平台上安装,都是要编译的。 安装 解压CodeTyphonIns.zip得到CodeTyphonIns 在Windows平台,以管理员方式运行install.bat;在类unix平台,先cd CodeTyphonIns,再sudo ./install.sh 出现以下界面,输入0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ==================================================== CodeTyphon Studio Version 7.30 (GEN 7) Installation for Linux-Solaris-Openindiana-MacOS FreeBSD-NetBSD-OpenBSD-DragonFly ==================================================== -----WARNING------ WARNING ----WARNING------- You tryng to install CT as root This is NOT the correct procedure. You MUST start CodeTyphon Installation as normal user with sudo root privileges --------------------------------------------- 0) Install CodeTyphon Studio (remove old first) 1) Update CodeTyphon Studio 2) Remove CodeTyphon Studio 9) Exit >>> Select an action (press 0....

2021-02-07 09:29:48 · 1 分钟 · 慢步道人

自学RTC——DualServer

从其它平台迁移而来 在窗体上放4个TRtcHttpServer,依次设置ServerPort为:80、443、8080和8090,并分别命名为HS80、HS443、HS8080和HS8090 再放3个TRtcDualDataServerLink到窗体上,分别命名为DL80and443、DL8080and8090和DLall 设置DL80and443的Server属性为HS80,Server2属性为HS443;设置DL8080and8090的Server属性为HS8080,Server2属性为HS8090 设置DLall的Link属性为DL80and443,Link2属性为DL8080and8090 再放1个TRtcDataProvider到窗体上,设置Link属性为DLall,并在OnCheckRequest事件里写上代码: 1 2 3 4 5 with TRtcDataServer(Sender) do begin Accept; Write('you are on Server ' + ServerPort); end; 在窗口OnShow事件里启动所有TRtcHttpServer,在OnClose事件里停止所有TRtcHttpServer 编译运行 在浏览器里分别访问http://localhost:80、http://localhost:443、http://localhost:8080、http://localhost:8090 注意:TRtcDualDataServerLink只能选择设置Server*或Link*!

2020-11-22 14:54:39 · 1 分钟 · 慢步道人

RTC组件关系图

从其它平台迁移而来

2020-11-10 21:26:27 · 1 分钟 · 慢步道人

自学RTC——BrowserUpload

从其它平台迁移而来 核心代码 OnCheckRequest事件中的代码: 1 2 3 with TRtcDataServer(Sender) do if Request.FilePath.Equal(0, 'UPLOAD') then Accept; OnDataReceived事件中的代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 var fname: string; cnt: integer; begin with TRtcDataServer(Sender) do begin if Request....

2020-11-10 20:04:07 · 2 分钟 · 慢步道人

自学RTC——ServerLesson4

从其它平台迁移而来 对于上节的示例中,比较适合发送小文件,若直接用于发送大文件的话,很容易把服务器的内存资源耗尽。当请求大文件时,可以限制每次发送大文件时使用的内存大小(例如16000 B)。 打开上节的工程 修改RtcDataProvider3的OnCheckRequest事件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 var fname: string; begin with TRtcDataServer(Sender) do begin fname := GetFullFileName(Request.FileName); if (fname <> '') and (File_Exists(fname)) then begin Accept; Request.Info['fname'] := fname; Response.ContentLength := File_Size(fname); WriteHeader; end; end; end; 修改RtcDataProvider3的OnDataReceived事件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 var fname: string; len: cardinal; begin with TRtcDataServer(Sender) do if Request....

2020-11-07 23:47:54 · 2 分钟 · 慢步道人