- 博客(439)
- 资源 (9)
- 收藏
- 关注
原创 sqlserver2019中,一列为计算项目,一列为计算公式及计算项目代表的数字,如何找出一个计算项目是数字改变时,会有多个涉及的计算项目
摘要:本文介绍在SQLServer2019中追踪计算项目依赖关系的实现方案。通过创建ExtractDependentProjects函数解析公式中的依赖项,并利用递归CTE查询从目标项目出发追踪所有直接/间接依赖项目。方案包含详细代码示例,可动态查询任意项目变更的影响范围,支持处理复杂公式和循环依赖检测。关键优化包括建立中间表、索引优化和防止死循环机制,适用于数据校验和变更影响分析场景。示例以项目A变更为例,显示其影响会通过依赖链传递至B、C、D、E、F等项目。
2025-11-06 22:02:25
329
原创 cxgrid中,如何根据列名或字段名取得footer值
该代码片段展示了如何获取cxGrid1中指定字段的汇总值。通过cxGrid1DBTableView1.DataController.Summary对象,访问FooterSummaryValues属性,并使用IndexOfItemLink方法定位特定列(通过GetColumnByFieldName获取)的汇总项索引。主要用于在DevExpress的cxGrid控件中读取表格底部显示的合计值,适用于需要对网格数据进行汇总统计的场景。代码适用于Delphi/VCL开发环境。
2025-11-01 13:51:02
96
原创 视图建不了.删不了.发现是死锁了.
SQL Server锁定资源分析与处理 摘要:本文提供SQL Server数据库锁定资源检查和处理方法,通过查询sys.dm_tran_locks视图获取当前数据库的对象级锁定信息(包括阻塞进程ID、锁定类型、对象ID、锁定状态和模式),重点关注'OBJECT'和'ExchangeDB'类型的资源锁定。随后可使用DBCC INPUTBUFFER查看阻塞进程的SQL语句,并提供终止进程的示例命令KIll 110。这套方法可帮助DBA快速诊断和解决数据库阻塞问题。
2025-10-27 13:00:42
127
原创 C#异步编程 - Task的用法总结
C#中的Task是异步编程的核心类型,封装了异步操作的状态和行为。Task有7种状态,包括创建、等待执行、运行中、完成等。创建Task的方式包括Task.Run()、async/await、Task.FromResult等。等待任务可用await(推荐)或阻塞式Wait()/Result。处理多个任务可使用WhenAll/WhenAny或WaitAll/WaitAny。异常处理上,await会自动解包异常,而直接访问Task需处理AggregateException。取消操作通过CancellationTo
2025-09-12 07:17:48
757
原创 一文搞懂.NET Core、.NET 5、.NET 6、.NET 7、.NET 8 和 .NET 9 的区别
.NET是微软推出的跨平台开发框架,支持C#、F#等语言,可开发Web、桌面、移动等多种应用。从.NET Core(2016)开始实现跨平台,到.NET 5(2020)统一技术栈,再到.NET 6(2021)首个LTS版本支持全平台开发。最新.NET 8(2023 LTS)具备AI/ML支持、Blazor United等特性,性能优化显著。建议新项目优先选择.NET 8,其长期支持至2026年,功能完善且稳定。.NET 9(2024)将聚焦AI集成,但作为短期支持版本更适合技术尝鲜。
2025-09-11 21:31:41
1733
原创 TCP发送接收json格式
本文介绍了在Delphi中通过TCP协议传输不定长JSON数据的处理方法。发送端在每个JSON消息后添加换行符作为分隔符,接收端使用TMessageBuffer类管理数据缓冲区,通过分割换行符来识别完整消息。代码示例包含发送端的JSON格式化与发送实现,以及接收端的缓冲管理、消息分割和JSON解析功能。这种方法有效解决了分包和多包情况下的数据完整性问题,确保正确解析每个JSON消息。可根据实际需求调整分隔符和解析逻辑。
2025-08-18 07:32:45
430
原创 TEdgeBrowser 加载网页是白屏时重新加载
本文介绍了在Delphi中使用TEdgeBrowser组件时解决网页白屏问题的方法。通过监听OnNavigationCompleted和OnContentLoading事件,可以检测页面是否成功加载。当检测到白屏(页面内容为空)时,会自动调用Refresh方法重新加载页面。文中提供了完整的示例代码,包括初始化、导航、事件处理等实现细节,确保在页面加载失败或出现白屏时能够自动刷新并正确显示内容。
2025-08-11 08:49:16
483
原创 devexpressr控件TextEdit属性大全
摘要:TcxTextEdit是DevExpress库中功能丰富的Delphi文本编辑控件,提供多种属性配置选项。它包括基本属性(字体、颜色、位置)、文本属性(对齐方式、密码字符)、编辑属性(只读、自动选择)、验证属性(必填项、错误提示)及其他高级功能(自定义按钮、输入掩码、增量搜索)。这些属性可灵活控制控件行为和外观,满足不同场景下的输入需求,如数据验证、格式限制和界面美化等。
2025-08-10 08:37:13
357
原创 CXGrId中按回车控制
通过以上设置,当用户在最后一列按下回车键时,cxGrid将自动新增一行,并将焦点定位到新行的第一列,从而提高数据输入的效率。
2025-08-03 16:53:56
262
原创 SQLSERVER调用Web Service
该SQL存储过程用于获取微信企业API的访问令牌(Access Token)。首先检查并删除同名存储过程,然后创建新过程。过程通过构造微信API请求URL(包含企业ID和密钥参数),使用OLE自动化对象MSXML2.XMLHTTP发送HTTP请求,获取并返回响应结果。关键步骤包括:设置API地址和参数、创建HTTP对象、发送POST请求、获取响应文本并输出,最后销毁对象释放资源。该过程实现了与微信企业API的交互功能。
2025-07-20 09:43:34
162
原创 Sql server 中关闭ID自增字段(SQL取消ID自动增长)
SQL Server导入数据时如需保留原ID,需先关闭自增列再导入,完成后恢复。使用SET IDENTITY_INSERT命令控制: SET IDENTITY_INSERT products ON 允许手动插入ID值; 执行INSERT INTO products(id,name) VALUES(2,'screwdriver')等导入语句; SET IDENTITY_INSERT products OFF 恢复自增功能。 该方法适用于数据库迁移等需要保持ID一致性的场景,比手动修改更高效。
2025-07-06 08:32:23
795
原创 STM32103CBT6显示ST7789通过SPI方式显示柬埔寨文
摘要:本文详细介绍了在STM32F103CBT6微控制器上通过SPI接口驱动ST7789 LCD显示屏并显示柬埔寨文的完整实现方案。内容包括硬件配置(使用STM32CubeMX初始化SPI1和GPIO)、LCD驱动开发(ST7789初始化/控制指令)、柬埔寨文字符集处理(自定义字体数据格式)以及文本显示函数实现。重点展示了如何将UTF-8编码的柬埔寨文"សួស្តី"(意为"你好")渲染到LCD屏幕,提供了完整的代码框架,包括SPI通信、屏幕控制、字体数据结构和文本绘制逻辑。
2025-06-15 13:14:56
582
原创 柬埔寨 - 高棉语 点阵方式详解
高棉语点阵显示面临三大技术挑战:1.复杂的连写组合规则,需处理x/y偏移及特殊影子符号;2.合成符需要预先生成点阵并建立映射关系;3.字符多形态需根据组合对象动态选择显示方式。解决方案包括:为17BE等特殊符号生成影子符号点阵并自定义编码,建立合成符映射库,以及开发形态选择算法。不同字体(如Daunpenh和KhmerUI)的显示差异也需单独处理。最终需通过转码、形态匹配和组合渲染三个步骤实现接近矢量字体的显示效果。
2025-06-15 12:50:53
624
原创 CS与BS架构优缺点分析以及如何选型
CS架构与BS架构在管理系统中的核心差异主要体现在:CS架构性能高、安全性强但维护成本高,适合需要复杂交互的内部系统(如金融、ERP);BS架构则维护简单、跨平台性强但性能受限,更适合远程协作场景(如OA、电商)。当前混合架构逐渐流行,通过结合CS处理核心业务与BS实现辅助功能,平衡性能与扩展性。选型需综合评估业务需求、用户分布和IT预算。
2025-06-11 08:47:53
772
原创 Delphi的组件读写机制(三)
这是用来读取根组件的属性的,对于属性,前面提到过,既有组件本身的published属性,也有非published属性,例如TTimer的Left和Top。这是写子组件的最关键的一句,它把WriteComponent方法作为回调函数,按照深度优先遍历树的原则,如果根组件FRoot存在子组件,则用WriteComponent来保存它的子组件。否则就要存储子组件。这是用来写组件的属性的。前面提到过,在DFM文件中,既有published属性,又有非published属性,这两种属性的写入方法应该是不一样的。
2025-03-22 08:28:02
822
原创 Delphi的组件读写机制(二)
在DefineProperties方法中,我们可以看出,有一个Filer对象作为它的参数,当定义属性时,它引用了Ancestor属性,如果该属性非空,对象应当只读写与从Ancestor继承的不同的属性的值。它定义了Root属性,Root指明了所读或写的组件的根对象,它的Create方法将Stream对象作为传入参数以建立与Stream对象的联系, Filer对象的具体读写操作都是由Stream对象完成。由于组件的写过程是在设计阶段由Delphi的IDE来完成的,因此无法跟踪它的运行过程。
2025-03-22 08:24:37
1012
原创 Delphi的组件读写机制(一)
窗体中的所有元素包括窗体自身的属性都包含在DFM文件中。在程序开始运行的时候,TReader通过流式对象Stream来读取窗体及组件,因为Delphi在编译程序的时候,利用编译指令{$R *.dfm}已经把DFM文件信息编译到可执行文件中,因此TReader读取的内容实际上是被编译到可执行文件中的有关窗体和组件的信息。值得注意的是,读写对象如TFiler对象、TReader对象和TWriter对象等很少由应用程序编写者进行直接的调用,它通常用来读写组件的状态,它在读写组件机制中扮演着非常重要的角色。
2025-03-22 08:22:56
996
原创 在Windows系统中,你可以通过以下方法查看被占用的端口及其关联的进程
通过以上方法,你可以快速定位并管理Windows中被占用的端口。某些端口可能被系统服务或安全软件占用,需确认后再操作。操作需谨慎,终止系统关键进程可能导致系统不稳定。(可选)以管理员身份运行,确保获取完整信息。:以数字形式显示地址和端口(不解析域名)。:显示占用端口的进程ID(PID)。切换到“详细信息”选项卡,找到对应。列表,直接显示端口号及对应的进程。在“详细信息”选项卡中找到对应。过滤特定端口(例如查看端口。:显示所有连接和监听端口。替换为实际进程ID,(管理员权限更佳)。
2025-02-09 17:03:21
4199
原创 delphi 设置win10 dpi 缩放规则
随着2K、4K显示器的普及,在使用这些高dpi显示器时,为了保证系统软件界面看起来不至于太小,导致视觉疲劳,一般会在系统中设置缩放比例。比如一个32寸的显示,但分辨率只有1920*1440,而一个24寸的显示器,分辨率却达到3840*2160,很明显后面这个显示器的每英寸的像素点的个数多,显示的画面更加细腻。win10,win7系统里 程序经常变形,很可能是 windows 缩放比例大于100%,设置windows缩放比例比较麻烦,可以通过注册表设置程序的DPI缩放比例。表示屏幕缩放时,窗体也会跟着缩放。
2024-11-02 16:42:27
1199
原创 TPair<TKey, TValue> 键值对
的实例,并添加了两个键值对。然后,我们遍历列表并打印出每个键值对。最后,我们释放了列表所占用的内存。在 Delphi(或更准确地说是 Object Pascal,Delphi 的编程语言)中,是一个包含两个元素的记录(record):一个键(Key)和一个值(Value)。这样的数据结构可能用于存储一系列的键值对,其中每个键值对都由两个字符串组成。因此表示一个列表,其中包含的元素是成对的字符串(即每个元素都是一个。在这个示例中,我们首先创建了一个。是泛型列表的一个实现,其中。是列表中元素的类型。
2024-10-25 17:52:30
537
原创 如何将一个标题的数组与数据的数组合并成一个键值对的数组
,并且你想将它们合并成一个键值对数组(对象数组),你可以使用JavaScript的。数组,并为每个标题创建一个键值对,其中键是标题本身,值是对应索引位置上的数据。如果你有多组数据需要与同一组标题合并,并且每组数据都是一个数组,你可以使用。(累加器)参数是一个对象,它累积了所有的键值对。)和一个相应的数据数组(例如,如果你有一个标题数组(例如,
2024-10-24 14:59:59
209
原创 Delphi数据字典TDictionary
在 Delphi 中,创建一个数据字典通常意味着使用一种结构来存储键值对。Delphi 没有内建的字典类型,但你可以使用。单元作为一个简单的键值对存储,或者你可以使用更复杂的第三方容器,如。// 检查一个特定的键是否存在,并输出其值。// 再次检查已移除的键是否存在。// 遍历字典并输出键值对。// 创建一个新的字典实例。// 添加一些键值对。// 移除一个键值对。
2024-10-21 16:30:23
886
原创 Sql Server 生成脚本中的快速删除空行问题
使用 Sql Server 生成脚本,例如生成存储过程,常常会因为存在大量没用的空行。如下图5w行的脚本,空行很多无用,需要删除。手动删除很麻烦,想通过快捷方法删除这些空行,方法其实很简单!3、填好后,点击“全部替换”,完美结束!1、使用快捷键打开查找替换(ctrl+H);“查找选项”,勾选使用 正则表达式,如下图示。“替换为”不用填写(默认为替换成空格)2、“查找内容”填写 ^:b*$\n。“想找范围”,选择“当前文档”
2024-10-10 17:27:02
638
原创 Delphi子窗体一直显示控件名已经存在.
发现原来是dfm文件中的inherite变成为object以前发现这个问题都是替换.今天总算找到根源了.但是不清楚为什么会突然自己改变。
2024-10-10 00:10:08
354
原创 Gattchart使用手册
GanttChart是Delphi的一个交互式非数据库感知前端VCL组件,可以在gantt图表中可视化任务。该组件可用于调度许多资源和任务并可用于多种项目场景,如项目管理、任务管理、生产调度或员工调度。该组件包括用于不同数据类型的pert图表视图、打印预览组件和一些次要的可视化编辑器组件。二.快速入门做一个如下图的Demo1.新建项目2.将窗体中放置TGanttChart组件,并将设置组件的Align为Alclient.让其最大值3.在设置组件为十行.beginend;
2024-09-25 09:11:19
1155
1
原创 关于Delphi 10.4.2 TIdTCPServer 的多线程通信使用
至于多线程,官方文档就有说明,其实TIdTCPServer运行过程中,当客户端连接成功后默认就是基于TIdSchedulerOfThreadDefault调度分配线程模式,为每个客户端连接都分配单独的处理线程,由于Windows线程的限制,Indy 似乎还有一种特殊的模式TIdYarnOfThread来代替传统线程,至于TIdYarnOfThread这里不做研究,开始上代码。这里主要是做一些自定义类断开连接要处理的事情,这里就省略了。当我测试多个客户端连接时问题就来了,线程会一直锁死。
2024-09-22 15:08:23
973
原创 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
757
原创 fdMemTable内存表进行SQL查询
fdLocalSql可以对fdMemTable内存表进行SQL查询(可以对多个fdMemTable内存表进行联表查询哦),fdLocalSql使用SQLITE引擎,而FIREDAC驱动SQLITE,连SQLITE驱动DLL都不需要附带的。2]可以设置多个内存表,FDMemTable1,FDMemTable2。
2024-08-27 09:40:21
1083
原创 delphi fireDAC+SQLite 在多线程下笔记
实际测试,分别建立50个读和50个写线程,同时读写,Synchronous=off 的情况下,数据仍然是同步的,其他线程写的时候,读线程仍然可以立即得到最新的数据状态。仍然是接受sqlite的建议,在数据安全要求不太严的情况下,设置为off模式,网上有人测试,讲off比full模式,效率要高50倍以上。特别是主线程需要注意。开启 WAL后,在 Synchronous = Normal 下,速度仍然非常快,但是,会有一定概率,同一时间读写同一条数据时,读出来的是写入之前的数据。
2024-08-24 22:15:33
503
原创 sqlite3 多线程和锁 ,优化插入速度及性能优化
另一个要说明的是prepared statement,它是由数据库连接(的pager)来管理的,使用它也可看成使用这个数据库连接。当开启auto-vacuum,当提交一个从数据库中删除数据的事务时,数据库文件自动收缩, (VACUUM命令在auto-vacuum开启的数据库中不起作用)。sqlite在没有显式使用事务的时候会为每条insert都使用事务操作,而sqlite数据库是以文件的形式存在磁盘中,就相当于每次访问时都要打开一次文件,如果对数据进行大量的操作,时间都耗费在I/O操作上,所以很慢。
2024-08-24 22:04:32
2658
原创 sqlserver 消息 9420,级别 16,状态 1,第 7 行
感觉非常奇怪,这个程序在很多客户多运行.当时以为数据库的配置不对.我重启了数据服务,还是没有解决.于是就查了KIMI,他讲有转认字符。执行时报9420错误,sqlserver 消息 9420,级别 16,状态 1,第 7 行。
2024-08-18 23:35:51
382
原创 Delphi线程同步(临界区、互斥、信号量)
顺便总结Application.ProcessMessages的作用:运行一个非常耗时的循环,那么在这个循环结束前,程序可能不会响应任何事件,按钮没有反应,程序设置无法绘制窗体,看上去就如同死了一样,这有时不是很方便,例如于终止循环的机会都没有了,又不想使用多线程时,这时你就可以在循环中加上这么一句,每次程序运行到这句时,程序就会让系统响应一下消息,从而使你有机会按按钮,窗体有机会绘制。它是在互斥的基础上建立的,但是信号量增加了资源计数的功能,预定数目的线程允许同时进入要同步的代码。这两个过程的声明如下。
2024-08-17 23:38:54
1471
原创 TStopwatch属性及方法
IsRunning: Boolean - 获取或设置一个值,表示Stopwatch是否正在运行。Elapsed: TTimeSpan - 返回已执行代码的时间,以秒为单位,具有微秒精度。ElapsedMilliseconds: Double - 返回已执行代码的总毫秒数。在这个例子中,我们在窗体创建时开始计时,销毁时停止计时,并输出总执行时间(毫秒)。Reset: 无 - 重置Stopwatch,将Elapsed属性设置为0。Start: 无 - 开始计时。Stop: 无 - 停止计时。
2024-08-09 18:03:09
530
原创 Oracle数据库字符集及修改方式详解
Oracle语言环境的描述包括三部分:language、territory、characterset(语言、地域、字符集)language:主要指定服务器消息的语言,提示信息显示中文还是英文territory:主要指定服务器的数字和日期的格式characterset:是指字符集,一般国内数据库实际使用的字符集主要是ZHS16GBK、AL32UTF8只要两个数据库的字符集(characterset)一样,就可以相互导入导出数据。
2024-07-28 07:40:35
2287
原创 IdSchedulerOfThreadPool用法和想法
其实用起来也还比较简单,主要是实现了维护一个线程池的功能,功能不是很强。TIdYarnOfThread(in IdSchedulerOfThread.pas) 需要强制转换的类,只有强制转换后才能访问到线程Thread对象,使用Synchronize来访问VCL控件。TIdTask(in IdTask.pas) 需要用户继承实现的类,实现参数的传入,及具体的run、BeforeRun、AfterRun功能代码。操作你会发现,线程池是用抛出异常来实现,因此你需要捕获异常来进行线程池满的处理。
2024-07-24 07:43:27
391
原创 Delphi - Indy TIdThreadComponent 线程研究
StopMode:这里分为Terminate和Suspend两种,Terminate为强行终止,Suspend为延缓、等待终止。为了优化用户体验,采用了Indy 自带的IdThreadComponent控件,完美的解决了此问题。Active:默认False,当需要令IdThreadComponent控件生效时,置为True;前几天在开发数据实时解析功能模块的时候,发现解析数据量巨大,特别耗时,程序一跑起来界面假死。TIdThreadComponent用的是观察者模式,所有这里的事件都是回调事件。
2024-07-24 07:27:19
544
原创 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
405
delphi代码标准文档
2010-04-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅