
Delphi
文章平均质量分 60
蝈蝈(GuoGuo)
这个作者很懒,什么都没留下…
展开
-
Delphi的组件读写机制(三)
这是用来读取根组件的属性的,对于属性,前面提到过,既有组件本身的published属性,也有非published属性,例如TTimer的Left和Top。这是写子组件的最关键的一句,它把WriteComponent方法作为回调函数,按照深度优先遍历树的原则,如果根组件FRoot存在子组件,则用WriteComponent来保存它的子组件。否则就要存储子组件。这是用来写组件的属性的。前面提到过,在DFM文件中,既有published属性,又有非published属性,这两种属性的写入方法应该是不一样的。原创 2025-03-22 08:28:02 · 699 阅读 · 0 评论 -
Delphi的组件读写机制(二)
在DefineProperties方法中,我们可以看出,有一个Filer对象作为它的参数,当定义属性时,它引用了Ancestor属性,如果该属性非空,对象应当只读写与从Ancestor继承的不同的属性的值。它定义了Root属性,Root指明了所读或写的组件的根对象,它的Create方法将Stream对象作为传入参数以建立与Stream对象的联系, Filer对象的具体读写操作都是由Stream对象完成。由于组件的写过程是在设计阶段由Delphi的IDE来完成的,因此无法跟踪它的运行过程。原创 2025-03-22 08:24:37 · 913 阅读 · 0 评论 -
Delphi的组件读写机制(一)
窗体中的所有元素包括窗体自身的属性都包含在DFM文件中。在程序开始运行的时候,TReader通过流式对象Stream来读取窗体及组件,因为Delphi在编译程序的时候,利用编译指令{$R *.dfm}已经把DFM文件信息编译到可执行文件中,因此TReader读取的内容实际上是被编译到可执行文件中的有关窗体和组件的信息。值得注意的是,读写对象如TFiler对象、TReader对象和TWriter对象等很少由应用程序编写者进行直接的调用,它通常用来读写组件的状态,它在读写组件机制中扮演着非常重要的角色。原创 2025-03-22 08:22:56 · 861 阅读 · 0 评论 -
delphi 设置win10 dpi 缩放规则
随着2K、4K显示器的普及,在使用这些高dpi显示器时,为了保证系统软件界面看起来不至于太小,导致视觉疲劳,一般会在系统中设置缩放比例。比如一个32寸的显示,但分辨率只有1920*1440,而一个24寸的显示器,分辨率却达到3840*2160,很明显后面这个显示器的每英寸的像素点的个数多,显示的画面更加细腻。win10,win7系统里 程序经常变形,很可能是 windows 缩放比例大于100%,设置windows缩放比例比较麻烦,可以通过注册表设置程序的DPI缩放比例。表示屏幕缩放时,窗体也会跟着缩放。原创 2024-11-02 16:42:27 · 862 阅读 · 0 评论 -
TPair<TKey, TValue> 键值对
的实例,并添加了两个键值对。然后,我们遍历列表并打印出每个键值对。最后,我们释放了列表所占用的内存。在 Delphi(或更准确地说是 Object Pascal,Delphi 的编程语言)中,是一个包含两个元素的记录(record):一个键(Key)和一个值(Value)。这样的数据结构可能用于存储一系列的键值对,其中每个键值对都由两个字符串组成。因此表示一个列表,其中包含的元素是成对的字符串(即每个元素都是一个。在这个示例中,我们首先创建了一个。是泛型列表的一个实现,其中。是列表中元素的类型。原创 2024-10-25 17:52:30 · 376 阅读 · 0 评论 -
获得Windows串口列表函数
【代码】获得Windows串口列表函数。原创 2024-10-22 14:52:00 · 172 阅读 · 0 评论 -
Delphi数据字典TDictionary
在 Delphi 中,创建一个数据字典通常意味着使用一种结构来存储键值对。Delphi 没有内建的字典类型,但你可以使用。单元作为一个简单的键值对存储,或者你可以使用更复杂的第三方容器,如。// 检查一个特定的键是否存在,并输出其值。// 再次检查已移除的键是否存在。// 遍历字典并输出键值对。// 创建一个新的字典实例。// 添加一些键值对。// 移除一个键值对。原创 2024-10-21 16:30:23 · 561 阅读 · 0 评论 -
Delphi子窗体一直显示控件名已经存在.
发现原来是dfm文件中的inherite变成为object以前发现这个问题都是替换.今天总算找到根源了.但是不清楚为什么会突然自己改变。原创 2024-10-10 00:10:08 · 281 阅读 · 0 评论 -
Gattchart使用手册
GanttChart是Delphi的一个交互式非数据库感知前端VCL组件,可以在gantt图表中可视化任务。该组件可用于调度许多资源和任务并可用于多种项目场景,如项目管理、任务管理、生产调度或员工调度。该组件包括用于不同数据类型的pert图表视图、打印预览组件和一些次要的可视化编辑器组件。二.快速入门做一个如下图的Demo1.新建项目2.将窗体中放置TGanttChart组件,并将设置组件的Align为Alclient.让其最大值3.在设置组件为十行.beginend;原创 2024-09-25 09:11:19 · 766 阅读 · 0 评论 -
关于Delphi 10.4.2 TIdTCPServer 的多线程通信使用
至于多线程,官方文档就有说明,其实TIdTCPServer运行过程中,当客户端连接成功后默认就是基于TIdSchedulerOfThreadDefault调度分配线程模式,为每个客户端连接都分配单独的处理线程,由于Windows线程的限制,Indy 似乎还有一种特殊的模式TIdYarnOfThread来代替传统线程,至于TIdYarnOfThread这里不做研究,开始上代码。这里主要是做一些自定义类断开连接要处理的事情,这里就省略了。当我测试多个客户端连接时问题就来了,线程会一直锁死。原创 2024-09-22 15:08:23 · 680 阅读 · 0 评论 -
Delphi TDictionary字典类
ws2.range['E' + inttostr(k) + ':K' + inttostr(k)].value := VarArrayOf([temparr[0],temparr[5], temparr[1], temparr[2], '新刀具区', 0, temparr[4]]);上面的代码,把字典里的K,V用"@"符号拼接了起来,塞进一个TStringList类里.字典不可以排序,但是TStringList可以啊,只是在使用里,需要SPLIT一下元素才行。// 将字典的键(唯一元素)转换为数组并返回。原创 2024-09-14 19:46:08 · 622 阅读 · 0 评论 -
fdMemTable内存表进行SQL查询
fdLocalSql可以对fdMemTable内存表进行SQL查询(可以对多个fdMemTable内存表进行联表查询哦),fdLocalSql使用SQLITE引擎,而FIREDAC驱动SQLITE,连SQLITE驱动DLL都不需要附带的。2]可以设置多个内存表,FDMemTable1,FDMemTable2。原创 2024-08-27 09:40:21 · 913 阅读 · 0 评论 -
delphi fireDAC+SQLite 在多线程下笔记
实际测试,分别建立50个读和50个写线程,同时读写,Synchronous=off 的情况下,数据仍然是同步的,其他线程写的时候,读线程仍然可以立即得到最新的数据状态。仍然是接受sqlite的建议,在数据安全要求不太严的情况下,设置为off模式,网上有人测试,讲off比full模式,效率要高50倍以上。特别是主线程需要注意。开启 WAL后,在 Synchronous = Normal 下,速度仍然非常快,但是,会有一定概率,同一时间读写同一条数据时,读出来的是写入之前的数据。原创 2024-08-24 22:15:33 · 362 阅读 · 0 评论 -
Delphi线程同步(临界区、互斥、信号量)
顺便总结Application.ProcessMessages的作用:运行一个非常耗时的循环,那么在这个循环结束前,程序可能不会响应任何事件,按钮没有反应,程序设置无法绘制窗体,看上去就如同死了一样,这有时不是很方便,例如于终止循环的机会都没有了,又不想使用多线程时,这时你就可以在循环中加上这么一句,每次程序运行到这句时,程序就会让系统响应一下消息,从而使你有机会按按钮,窗体有机会绘制。它是在互斥的基础上建立的,但是信号量增加了资源计数的功能,预定数目的线程允许同时进入要同步的代码。这两个过程的声明如下。原创 2024-08-17 23:38:54 · 1242 阅读 · 0 评论 -
TStopwatch属性及方法
IsRunning: Boolean - 获取或设置一个值,表示Stopwatch是否正在运行。Elapsed: TTimeSpan - 返回已执行代码的时间,以秒为单位,具有微秒精度。ElapsedMilliseconds: Double - 返回已执行代码的总毫秒数。在这个例子中,我们在窗体创建时开始计时,销毁时停止计时,并输出总执行时间(毫秒)。Reset: 无 - 重置Stopwatch,将Elapsed属性设置为0。Start: 无 - 开始计时。Stop: 无 - 停止计时。原创 2024-08-09 18:03:09 · 460 阅读 · 0 评论 -
IdSchedulerOfThreadPool用法和想法
其实用起来也还比较简单,主要是实现了维护一个线程池的功能,功能不是很强。TIdYarnOfThread(in IdSchedulerOfThread.pas) 需要强制转换的类,只有强制转换后才能访问到线程Thread对象,使用Synchronize来访问VCL控件。TIdTask(in IdTask.pas) 需要用户继承实现的类,实现参数的传入,及具体的run、BeforeRun、AfterRun功能代码。操作你会发现,线程池是用抛出异常来实现,因此你需要捕获异常来进行线程池满的处理。原创 2024-07-24 07:43:27 · 334 阅读 · 0 评论 -
Delphi - Indy TIdThreadComponent 线程研究
StopMode:这里分为Terminate和Suspend两种,Terminate为强行终止,Suspend为延缓、等待终止。为了优化用户体验,采用了Indy 自带的IdThreadComponent控件,完美的解决了此问题。Active:默认False,当需要令IdThreadComponent控件生效时,置为True;前几天在开发数据实时解析功能模块的时候,发现解析数据量巨大,特别耗时,程序一跑起来界面假死。TIdThreadComponent用的是观察者模式,所有这里的事件都是回调事件。原创 2024-07-24 07:27:19 · 478 阅读 · 0 评论 -
Delphi开发 Android 程序启动画面简单完美解决方案
3、制作一个真实的 Splash 启动画面的图片,如果是分辨率真按1080的话,就是1080×1920,如果是按470画的话,就是470×836。1、先创建一个470×320像素的空白图片,保存到工程的某个目录下,如 Images,假设我们命名为 Splash470x320.png(其它分辨率类似,实际在720p(荣耀 4x )/1080p( Mate8 )/2K(小米Note Pro)屏下调用的都是它,别的好象没有用,所以随意放几个空白图片好了)。3、方案还不够完善,需要较多的步骤;原创 2024-07-21 06:50:49 · 292 阅读 · 0 评论 -
Delphi 11.2 配置Android SDK 环境
这里如果配置64位就选 Android 64-bit,如果配置32位就选 Android 32-bit。有警告图标的就是有问题的项,需要手动更新一下,点击每一行后面的…,仿照选择对应的路径。点击 Select an SDK version–Add New…然后稍等一下让他更新一会,等待警告符号都消失以后点击 Finish。然后点击 Deployment–SDK Manager–Add…点击 Tools–Options…手动修改完以后点击 Next。打开 Delphi 11。原创 2024-07-20 20:56:22 · 624 阅读 · 0 评论 -
Flexcel学习笔记
Felxcel笔记原创 2024-07-10 09:30:17 · 604 阅读 · 0 评论 -
cxGrid合计忽略重复记录
/cxGrid1DBBandedTableView1->DataController->Summary->FooterSummaryItems->OnSummary 事件。//重新打开数据集前清空lstCust。//存放不同的客户编号记录。//创建lstCust对象。//记下之前未出现过的客户编号。//释放lstCust对象。//lstCust.Count就是不同的客户数。//只对colaCustNo列的合计进行处理。//合计Item的OnGetText 事件。原创 2024-06-15 10:27:50 · 617 阅读 · 0 评论 -
delphi清理程序占用的内存,真的有效果.
找了二天没有处理好是什么没有释放.直接调用该函数.发现系统占用内存减少了.再也不怕占用内存太多,导致程序异常了.//DELPHI清理释放内存小代码。原创 2024-06-05 08:13:30 · 446 阅读 · 0 评论 -
调用WINDOWS的TTS接口,将你的文字变成Wav文件
【代码】调用WINDOWS的TTS接口,将你的文字变成Wav文件。原创 2024-06-04 23:14:58 · 326 阅读 · 0 评论 -
通过lame_enc.dll实现将Wav转为mp3格式.wav要求是16bit
【代码】通过lame_enc.dll实现将Wav转为mp3格式.wav要求是16bit。原创 2024-06-04 22:38:10 · 956 阅读 · 0 评论 -
通过ffmpeg 将wav格式转为mp3格式.
通过ffmpeg实现将wav转为mp3格式.需要下载一个ffmpeg放到执行文件所在目录.是一个功能强大的多媒体处理工具,它支持大量的输入和输出格式,以及多种编解码器。由于其功能的多样性,ffmpeg的参数列表也非常丰富。以下是一些常用的ffmpeg。原创 2024-06-04 23:05:18 · 1520 阅读 · 0 评论 -
FireDAC与ADO读写数据的性能测试
数据库连接组件,支持三种连接方式:1.持久定义(有一个唯一名称和一个配置文件,可以由FDManager管理)3.临时定义(没有名称和配置文件,不能由FDManager管理,运行时将参数写入params属性)发现它完全可以同UNIDAC相媲美,但UNIDAC购买费用是几万美刀,而FIREDAC是免费的。fd读取数据用时2438毫秒,ado用时5590毫秒。fd读取数据用时1988毫秒,ado用时5548毫秒。fd读取数据用时363毫秒,ado用时783毫秒。fd读取数据用时10毫秒,ado用时553毫秒。原创 2024-05-23 07:10:04 · 918 阅读 · 0 评论 -
用TIDTcpClient发送以及接收信息
【代码】用TIDTcpClient发送以及接收信息。原创 2024-04-23 12:25:40 · 1447 阅读 · 0 评论 -
Delphi Xe 10.3 钉钉SDK开发——审批流接口(获取表单ProcessCode)
Log.Debug(dk.GetProcessCode('ERP客户订单'),'debug');dk.Getappsecret := '你企业钉钉的Appsecret';dk.Getappid := '你企业钉钉的APPID';二、接口获取:今天的重点,不说了,直接上代码。ProcessCode后面就是了!中年大叔学Delphi。原创 2024-04-16 21:17:05 · 686 阅读 · 0 评论 -
Delphi TDictionary字典类
ws2.range['E' + inttostr(k) + ':K' + inttostr(k)].value := VarArrayOf([temparr[0],temparr[5], temparr[1], temparr[2], '新刀具区', 0, temparr[4]]);上面的代码,把字典里的K,V用"@"符号拼接了起来,塞进一个TStringList类里.字典不可以排序,但是TStringList可以啊,只是在使用里,需要SPLIT一下元素才行。Add:向字典中添加一个键和其对应的值。原创 2024-04-07 06:36:38 · 1332 阅读 · 0 评论 -
delphi 设置win10 dpi 缩放规则
假设现在有一个软件界面(宽为950像素,高为700像素),该软件在24寸、分辨率为1900*1400的显示器上显示正常,但放到高dpi显示器(同样是24寸,但分辨率为3800*2800)上显示效果会如何?比如一个32寸的显示,但分辨率只有1920*1440,而一个24寸的显示器,分辨率却达到3840*2160,很明显后面这个显示器的每英寸的像素点的个数多,显示的画面更加细腻。同样,在系统dpi缩放改变时,系统也不会将软件进行缩放拉伸,但软件会收到WM_DPICHAN。所以:高分辨率不等于高dpi。原创 2024-04-04 06:08:00 · 805 阅读 · 0 评论 -
delphi windows 程序DPI缩放设置
win10,win7系统里 程序经常变形,很可能是 windows 缩放比例大于100%,设置windows缩放比例比较麻烦,可以通过注册表设置程序的DPI缩放比例。原创 2024-04-04 06:06:38 · 524 阅读 · 0 评论 -
Flexcel笔记
1.引入:2.原创 2024-03-26 07:58:26 · 412 阅读 · 0 评论 -
TStopwatch属性及方法
在这个例子中,我们在窗体创建时开始计时,销毁时停止计时,并输出总执行时间(毫秒)。原创 2024-03-04 08:49:43 · 368 阅读 · 0 评论 -
delphi android打开pdf
另外,如果您需要更强大的PDF编辑和显示功能,可以考虑使用其他第三方组件,如SynPDF或VCL for PDF。在Delphi开发的Android应用程序中打开PDF文件,您可以使用第三方组件,如TeePDF、SynPDF或VCL for PDF等。另外,如果您希望在Android设备上直接打开PDF文件,而不需要在应用程序中显示,可以使用Intent来启动系统的PDF查看器。在这个示例中,我们创建一个Intent来启动系统的PDF查看器,并传递PDF文件的路径。首先,您需要下载并安装TeePDF组件。原创 2024-03-01 09:25:29 · 418 阅读 · 0 评论 -
Delphi XE2 新控件 布局Panel TGridPanel TFlowPanel
TGridLayou:表格,自动排列容器里的控件,控件大小相同可自定义大小,设定后全部控件大小相同且不变,x行y列,行数列列数根据控件大小变动。TFlowPanel的效果图,里边是panel,左侧是TCategoryButtons,搜索框是TButtonedEdit。堆栈Panel,一行只有一个控件(不能多列),或一列只有一个控件(不能多行)不需要些代码计算左边,自动水平居中 垂直居中 ,横向纵向居中!原创 2023-11-06 09:08:37 · 925 阅读 · 0 评论 -
delphi 使用TFlowPanel容器,实现对内含控件进行自动排版
还有一点需要注意的是,当改变tflowpanel的大小时,其中的控件不能自动重排。2,在其中添加一个tflowpanel,设置align为altop,autosize为true,autowrap为true。1,先添加一个Tscrollbox,设置其align为alclient。autosize默认为false,不用改动。然后往下找到Margins属性,进行设置.设置好后,复制粘贴这个TscGPEdit任意次,然后就可以看到效果了。1.TFlowPanel设置好合适的对齐,其他基本上不用怎么设置,默认即可。原创 2023-11-06 08:59:49 · 577 阅读 · 0 评论 -
delphi 实现Ribbon风格的窗体
设置dxRibbon的ApplicationButton.Menu属性为dxBarApplicationMenu,双击dxBarApplicationMenu控件的ItemLinks属性,在屏幕左上方会发现一个小窗口,这个窗体就是用来做ApplicationMenu的,向里面添加按钮和组即可。首先,Delphi本身并没有Ribbon风格的窗口可以直接拿来使用,而市面上很多类似于Ribbon的风格都是用截图法做出来的,那样做很麻烦,而且对于图片的控制要求非常高。接下来,继续设置控件的属性。原创 2023-04-14 15:26:51 · 916 阅读 · 0 评论 -
DevExpress VCL 动态加载皮肤换肤示例,支持Ribbion
对于Ribbion控件,经实际测试,要在换肤前将其ColorSchemeName设置为'UserSkin',加载皮肤后,再将其ColorSchemeName设置为皮肤的名称,否则可能看不到效果。本例使用了外部皮肤加载,将皮肤资源文件'AllSkins.skinres'进行动态加载,该文件包含DevExpress控件官方自带的所有皮肤,以减小可执行文件大小。原创 2023-03-04 21:35:40 · 1044 阅读 · 0 评论 -
DevExpress皮肤引用的办法
二. 从Dev Express 项下选择dxSkinController控件,添加到工程,设置dxSkinController1的SkinName属性设为:UserSkin;Editor 对话框,从列表中,只选择: UserSkin这一项,取消Enable skin Support的勾,三. 代码:(对RES皮肤有效,在程序文件夹里需要先建一个叫Skin的文件夹)str:='Xmas2008Blue.skinres';点OK退出. (注意:此步骤需DEV40以上版本才有效)原创 2023-03-04 21:13:52 · 1051 阅读 · 0 评论 -
Delphi XE 10.4.2 IDE 设置----【代码格式化】
使用IDE自带的代码格式化(CTRL+D),默认为80。经常一格式化变成很短的两行。原创 2023-02-19 08:23:13 · 516 阅读 · 0 评论