Delphi
bdmh
多年从事软件开发工作,现在主要从事移动端应用开发
展开
-
了解运行时类型信息(RTTI)
翻阅近期的帖子,发现类似如下的问题被提及多次:如何根据名称找到控件如何根据名称找到对应的属性如何根据名称执行某个方法或事件那我们能不能做到呢,当然可以,那就让我们了解一下RTTI吧.运行时类型信(以下简称RTTI)是在运行时保存和检索对象和数据类型的手段.通过RTTI我们可以了解正在使用的对象或组件的信息,并对它们进行一些处理. RTTI需要引用单元TypeIn原创 2009-04-27 13:29:00 · 2149 阅读 · 5 评论 -
FormatMessage获取错误代码描述
大家都知道获取错误代码用GetLastError,但是它返回的是错误标识,不是描述,我们可以用FormatMessage将其转换为本地语言的错误描述。FormatMessage的具体解释可以查看API的帮助。unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 =原创 2010-12-13 11:02:00 · 1989 阅读 · 0 评论 -
KMP(字符串匹配)算法
这里不做研究,只是为个人加深印象而写,以便日后查阅,具体可以参考下面两篇文章,写的比较详细:http://wenku.baidu.com/view/5045c90cba1aa8114431d994.htmlhttp://www.matrix67.com/blog/archives/115C++代码#include//获取模式数组void GetNext(const char* p,int next[]){ int m=0; int n=-1; next[0] = -1; wh原创 2010-12-22 09:56:00 · 3274 阅读 · 1 评论 -
取PE文件的引入表和导出表
直接上代码,PE结构可参阅资料,很多很详细,需要注意的是,本例中是映射到内存,不是通过PE装载器装入的,所以对于节的RVA地址需要转换成为文件偏移地址。Delphi代码unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type //导入表元素结构 TImageImportDis原创 2010-12-27 15:20:00 · 5432 阅读 · 0 评论 -
实现拦截API的钩子(Hook)
道理不多讲,简单说就是将系统API的地址,替换为我们自己写的API的地址,所以要求我们自定义的API函数要和被拦截的API有相同的参数。在用完后,记得恢复。因为要挂全局的钩子,所以Hook的部分,做成DLL。Hook.DLL主工程文件代码library Hook;uses SysUtils, Windows, Classes, ApiDefine in 'ApiDefine.pas', APIHook in 'APIHook.pas';{$R *.res}v原创 2010-12-29 10:48:00 · 4665 阅读 · 1 评论 -
实现软件自动升级
原来简单,在FTP上维护一个Update.ini文件,里面记录着要更新文件的版本号,本地也有一个Update.ini文件,每次启动更新程序时,先从FTP上下载Update.ini文件到本地名字为Update_new.ini,然后比较这两个文件,如果新的版本号大于旧的,或者新的文件在就ini中没有,这些就表示要更新的文件,然后逐一下载。 本程序名字为AutoUpdate,你生成这个exe,然后和主程序一起打包,创建桌面快捷方式时,指向AutoUpdate,而不是主程序。 在本地还有一个in原创 2011-01-06 15:34:00 · 4618 阅读 · 3 评论 -
全局键盘钩子(WH_KEYBOARD)
<br />为了显示效果,在钩子的DLL中我们会获取挂钩函数的窗体句柄,这里的主程序窗体名为"TestMain",通过FindWindow查找。<br /> <br />KeyBoardHook.dll代码<br />library KeyBoardHook;{ Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your pr原创 2011-01-08 14:41:00 · 7871 阅读 · 2 评论 -
获取进程列表及相关信息
闲着没事,看着任务管理器好玩,查资料先简单实现一下,代码中没有加入获取CPU占用率的代码,这个代码网上很多,只是不喜欢那种写法,这里就不写了。以后继续完善,对于System Process和System的信息还没法获得,那位兄弟知道可以提个醒。代码如下unit Main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,TlHelp32,原创 2011-01-30 14:49:00 · 3967 阅读 · 5 评论 -
在窗体上创建自己的光标并输入文字
我们知道在文本框等可以接收输入的组件中,我们可以看到闪烁的光标,并可以输入文字,如果我们在,比如窗体上时,因为不支持输入,也无法显示闪烁的光标,那我们 有办法做自己的输入吗?当然可以,下面我们演示在Form上来输入文字。 用到的API函数如下GetTextMetrics:获取程序当前的字体信息,存放到TEXTMETRIC结构中CreateCaret:为系统插入标记创建一个新的形状,并且将插入标记的属主关系指定给特定的窗口。插入标记的形状。可以是线、块或位图ShowCaret:显示光标SetCa原创 2011-05-31 11:19:00 · 4075 阅读 · 3 评论 -
在Win32程序中显示Dos调试窗口
在很多程序中,都可以看到程序运行中,会有一个Dos窗口,实时显示一些运行信息,这里就告诉大家是如何实现的,我们做个简单的,其实对控制台的操作还有很多,有兴趣的可以去查资料。 用到的API函数如下: //创建控制台 AllocConsole; //获取控制台窗口 GetStdHandle; //向控制台输出信息 WriteConsole; //释原创 2011-06-15 13:59:00 · 3865 阅读 · 2 评论 -
内存映射对于大文件的使用
平时很少使用大文件的内存映射,碰巧遇到了这样的要求,所以把过程记录下来,当给各位一个引子吧,因为应用不算复杂,可能有考虑不到的地方,欢迎交流。对于一些小文件,用普通的文件流就可以很好的解决,可是对于超大文件,比如2G或者更多,文件流就不行了,所以要使用API的内存映射的相关方法,即使是内存映射,也不能一次映射全部文件的大小,所以必须采取分块映射,每次处理一小部分。先来看几个函数CreateFile :打开文件GetFileSize : 获取文件尺寸CreateFileMapping :创建映射MapView原创 2011-04-28 11:57:00 · 4379 阅读 · 1 评论 -
文字录入无限制Undo,Redo的实现
这里只针对Edit的内容做一个简单的undo,redo功能;原理就是,将新增字符和相关信息添加到undo列表,在undo动作时,取记录信息,并在edit中删除新增的字符,然后将此动作添加到redo列表,以便恢复。 本程序只对文本框文字的顺序增加做了处理,对于任意位置的删除,复制粘贴等没有进行处理,大家可以根据实际情况完善,增加辅助信息来完成对撤销和恢复的操作。 明白了原理,对于原创 2011-05-17 12:21:00 · 4357 阅读 · 10 评论 -
Webbrowser中模拟连接点击(非鼠标模拟)
Delphiuses mshtml, ActiveX;//初始加载网易主页procedure TForm1.FormCreate(Sender: TObject);begin Webbrowser1.Navigate('http://www.163.com/');end;procedure TForm1.Button1Click(Sender: TObj原创 2010-12-11 13:47:00 · 5425 阅读 · 1 评论 -
Windows Server 2008运行Delphi程序报xxxxx.bpl错误
1、我的电脑右键->属性2、选择 高级系统设置3、选择 高级 页签中的性能设置4、选择 数据执行保护 页签的第二个单项按钮,并将要执行的Exe添加到列表原创 2014-01-03 14:11:22 · 2366 阅读 · 0 评论 -
在Win7系统中安装Delphi7
<br /> 最近本本里新装了Win7 32位系统,安装其他软件,一切正常,偏偏安装Delphi7时,遇到了头疼的麻烦,怎么也装不上,安装过程嗖的就过去了,安装失败,查了很多网络资料,也没搞定,很偶然的一次看到了兼容性这个东东,改一下试试,结果安装顺利完成。<br /> 右键点击Delphi7的安装程序,选择‘兼容性’页签,打上那个勾勾就可以了。<br /> <br />原创 2010-09-21 18:28:00 · 5385 阅读 · 7 评论 -
常见文件处理之INI文件
INI文件的结构如下[小节名]关键字=值uses IniFiles; {操作Ini文件需要引用TIniFile 的单元}常用的方法WriteString 写入字符串WriteInteger 写入数字WriteBool 写入布尔值 ReadString 读取字符串值ReadInteger 读取数字ReadBool 读原创 2009-05-04 08:58:00 · 3932 阅读 · 2 评论 -
常见文件处理之注册表文件
uses Registry; 不废话了,直入主题. Registry为我们提供了操作注册表的方法,这里我们用TRegIniFile提供的方法,TRegIniFile继承自TRegistry,TRegIniFile提供的方法类似于前面讲到的操作Ini文件的方法,这样就大大简化了我们操作"神秘"注册表的方法,下面是常用的方法: function CreateKey原创 2009-05-05 14:54:00 · 2698 阅读 · 1 评论 -
常见文件处理之文本文件
文本文件是以行为单位进行读、写的。由于每一行的长度不一定相同,不能计算出给定行在文件中的确切位置,因而只能顺序地读写。 文本文件只能单独为读或写而打开,在一个打开的文本文件上同时进行读、写操作是不允许的。 文本文件的打开需要两个步骤:1.文件变量与文件名关联;2.初始化读写。1.文件变量与文件名关联: AssignFile(VarTxt, FileName);FileName原创 2009-05-04 08:50:00 · 2186 阅读 · 3 评论 -
Delphi:窗体的扩展样式GWL_EXSTYLE用于SetWindowLong
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT or WS_EX_LAYERED ); WS_EX_ACCEPTFILES = 0x00000010 指明了一个已创建视窗具有拖拽文件功能 WS_EX_APPWINDOW = 0x00040000 强制一转载 2009-07-28 17:46:00 · 4515 阅读 · 0 评论 -
FastReport问题整理(http://129.sqdj.gov.cn/?p=77)
1.FastReport中如果访问报表中的对象?可以使用FindObject方法。TfrxMemoView(frxReport1.FindObject(’memo1′)).Text:=’FastReport’;2.FastReport中如何使用上下标?设置frxmemoview.AllowHTMLTags := True;在Text输入如下上标:mm2下表:k6举一反三,你还可以使用其他HTM转载 2009-05-27 09:50:00 · 14669 阅读 · 3 评论 -
用DLL实现插件的简单演示
这是DLL的代码library MyDll;uses SysUtils, Dialogs, Classes;procedure ShowInfo(info:PChar);stdcall;begin ShowMessage(您选择了【+info+】);end;function GetCaption:Pchar;begin原创 2009-10-27 13:57:00 · 1781 阅读 · 0 评论 -
根据字符串找到函数并执行
关键字:MethodAddress:取得方法的地址,这个方法需要是published的。unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TShowIn原创 2009-10-29 13:55:00 · 1274 阅读 · 0 评论 -
API编写WinSock通信示例
闲着没事,写一个socket的基本应用,针对初学者,老鸟们可以掠过。本示例采用Delphi2010编写。本示例中,涉及到的缓冲,均采取1024长度,采用的select轮询,现在select轮询已经被认为是比较低级的方法了,微软也不推荐使用,这里就以它开头吧,有时间,大家可以研究其他用法,比如WSAAsyncSelect模型 ,WSAEventSelect模型 ,Overlapped I/O 事件通知模型 ,Overlapped I/O 完成例程模型 ,IOCP模型 。下面开始贴代码了:服务端单元:Socke原创 2010-08-31 15:12:00 · 3567 阅读 · 2 评论 -
根据数据库结构生成TreeView
现在大多数的方法是采用递归,但这种操作会频繁的去select数据库,降低了执行效率,稍微改动一些,效果会好不少,这里介绍一种方法,即一次性select出所有数据,然后按照ParentID排序,逐条添加到TreeView,添加前,先遍历TreeView,查找他的上一级节点,遍历Treeview可比select数据快啊,下面看代码:数据表结构,最顶级parentid值我用的是-1,大家也可以用其他值,但要保证最顶级parentid值最小,层次越深,parentid越大procedure TUIOperate.F原创 2010-09-02 09:04:00 · 5831 阅读 · 7 评论 -
Delphi实现软件中登录用户的操作权限
经常在坛子里看到有朋友问如何对软件的登录用户,进行权限控制,可以设定到每一个菜单或按钮上,这里来实现一个最普通的方法,通过数据库,维护一个权限列表(里面有一个字段和节目上菜单项或Button等的tag对应),在执行时,通过到数据库去查询与之匹配的记录是否开通,来决定用户是否有权限。 数据库结构:包括两张表BaseData和UserRightData,BaseData中是一张基本表,里面不区分用户,UserRightData是用户权限表,结构和BaseData一样,只是多了用户字段,增加用户时,原创 2010-09-02 13:00:00 · 8726 阅读 · 16 评论 -
Delphi实现全局鼠标钩子
其中涉及到的一些API,网上均能查到详细的解释,这里不再熬述。因为是全局钩子,所以要用dll注入。用到的鼠标消息结构如下: PMouseHookStruct = ^TMouseHookStruct; {$EXTERNALSYM tagMOUSEHOOKSTRUCT} tagMOUSEHOOKSTRUCT = packed record pt: TPoint; hwnd: HWND; wHitTestCode: UINT; dwExtraInfo: DWO原创 2010-09-16 14:11:00 · 5582 阅读 · 1 评论 -
禁止用键盘左右箭头,去切换PageControl页签
<br />unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls;type TForm1 = class(TForm) PageControl1: TPageControl; TabSheet1: TTabSheet; TabSheet2: TTabShee原创 2010-09-19 16:08:00 · 1874 阅读 · 0 评论 -
用DDE控制Word
<br />DDE(Dynamic Data Exchange),称为动态数据交换。用于进程间的通讯,看看他如何来和Word交互。<br />在System页签下有TDdeClientConv组件,拖一个放到界面上,然后我们写如下代码:<br />unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleServer原创 2010-09-21 13:25:00 · 2401 阅读 · 0 评论