![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Delphi
文章平均质量分 79
linzhengqun
目前从事网游客户端开发
展开
-
组件制作之四(定制外观)
时常想,如果一个组件能够按自己想要的外观显示,那该是件多么COOL的事啊,这一篇就要来做一个精美外观的组件,但是,做什么好呢.Button? 高手突破>有关于自己定义外观的Button,以及CheckBox等的做法,Button从CustomPanel继承,重载Paint方法来画外观.如果你有兴趣,可以去找来看,这里就不做Button了,做一个Memo如何呢.?是个不错的主意。 我们先起个原创 2004-08-05 14:11:00 · 2400 阅读 · 0 评论 -
程序只运行一次并激活原来的程序
我们的程序有时候只允许运行一次,并且最好的情况是,如果程序第二次运行,就激活原来的程序。网上有很多的方法实现程序只运行一次,但对于激活原来的窗口却都不怎么好。关键就在于激活原来的程序,一般的做法是在工程开始时,打开互斥量对象,如果打不开表示程序还没有运行,创建一个互斥量对象;如果打得开表示程序已经运行了,查找程序中一个特定的窗口,一般是主窗口,然后发送一个自定义消息,主窗口在这个消息处理中激活原创 2005-12-29 01:26:00 · 8608 阅读 · 8 评论 -
线程杂谈
前言由于项目的关系,所以和线程的接触颇多,常常遇到问题,常常看TThread的代码,又常常想一些办法来解决遇到的问题,所以就有了这篇文章。 正文我们常有工作线程和主线程之分,工作线程负责作一些后台操作,比如接收邮件;主线程负责界面上的一些显示。工作线程的好处在某些时候是不言而喻的,你的主界面可以响应任何操作,而背后的线程却在默默地工作。VCL中,工作线程执行在Execute方法中,你必须从TThr原创 2006-01-07 02:11:00 · 4688 阅读 · 10 评论 -
线程杂谈2
作者:linzhenqun(风)时间:2006-2-6Blog: http://blog.csdn.net/linzhengqun----------------------------------------------------------------------------------------------------- 前言上次写了一篇关于线程的文章,其中有介绍原创 2006-02-06 23:31:00 · 3606 阅读 · 3 评论 -
线程杂谈3
(************************************************(* Subject: 线程杂谈3(* Author: linzhenqun(风)(* Time: 2006-3-25(* Blog: http://blog.csdn.net/linzhengqun(* E-mail: linzhengqun@163.co原创 2006-03-30 00:15:00 · 2903 阅读 · 4 评论 -
Delphi事件的广播
明天就是五一节了,辛苦了好几个月,借此机会应该尽情放松一番。可是想到Blog好久没有写文章,似乎缺些什么似的。这几个月来在项目中又增长了许多经验,学到许多实际应用的知识。不如把一些比较有用的记录下来,供朋友们参考可好。我想到Delphi的事件,那可真是个方便的东西,初学者在窗体上拉几个控件,并指定它们的事件,写几句代码,立刻就得到他们想要的效果。可是事件在方便的同时也有一个不足之处原创 2006-05-07 13:37:00 · 4683 阅读 · 4 评论 -
Delphi事件的广播2
上篇文章写了将事件分离成类的方法来实现事件的广播,这次将参考观察者模式来实现事件的广播。模式中主要有这两个角色:发布者:发布者保存着一张观察者的列表,以便在必要的时候调用观察者的方法。观察者:观察者是现实某些特定接口的类,对于发布者来说,它只关注这些接口,并不关注观察者具体是什么类。为了让发布者更具通用性,我写了一个发布者的父类,它负责增删和管理观察者,一个类只要继续这个类,马上就原创 2006-05-13 14:44:00 · 3032 阅读 · 10 评论 -
改变Edit的光标
看着Edit的光标,是不是觉得了无生趣,想不想换个形状来玩玩,其实很简单,且听我道来。 Edit是Windows的标准控件,它是一个系统范围窗口类,所以任何应用程序都能创建它。其实Edit本质上也是一个窗口,MS实现了它却不开放源代码,只暴露出一些接口给我们操作。Edit的光标(Caret)没有意外,就是通过CreateCaret,ShowCaret等API显示出来的。Edit似原创 2006-07-01 16:46:00 · 4357 阅读 · 2 评论 -
从普通函数到对象方法 ------Windows窗口过程的面向对象封装
从普通函数到对象方法------Windows窗口过程的面向对象封装 开始,由VirtualAlloc想起 我在查看VirtualAlloc这个API的时候,思绪竟然跳到另一个地方去了。那是以前阅读VCL源码时遗留下来的问题,Classes单元的MakeObjectInstance函数调用了VirtualAlloc,我甚是不解,为什么Delphi提供了那么多内存分配函原创 2006-12-20 22:12:00 · 7906 阅读 · 24 评论 -
Delphi接口的底层实现
Delphi接口的底层实现引言 接口是面向对象程序语言中一个很重要的元素,它被描述为一组服务的集合,对于客户端来说,我们关心的只是提供的服务,而不必关心服务是如何实现的;对于服务端的类来说,如果它想实现某种服务,实现与该服务相关的接口即可,它也不必与使用服务的客户端进行过多的交互。这种良好的设计方式已经受到很广泛的应用。 早在Delphi 3的时候就引入了接口的概原创 2007-03-04 16:25:00 · 7599 阅读 · 4 评论 -
访问祖先类的虚方法
访问祖先类的虚方法问题提出 在子类覆盖的虚方法中,可以用inherited调用父类的实现,但有时候我们并不需要父类的实现,而是想跃过父类直接调用祖先类的方法。举个例子,假设有三个类,实现如下:type TClassA = class procedure Proc; virtual; end; TClassB = class(TCla原创 2007-08-23 10:17:00 · 2727 阅读 · 1 评论 -
基于栈的对象
基于栈的对象C++的对象是基于栈的,你可以像普通数据类型一样声明它,访问它的成员,调用它的方法,然后由编译器自动清理栈现场,C++的对象更像一个增强的结构。而后来的许多面向对象语言如Java,C#等都采用了基于堆的对象机制。Object Pascal呢?毫无疑问它的对象也是基于堆的,当我们看到对象与指针进行转换的代码时,觉得很正常,因为OP对象本质上就是一个指针。那么Delphi只有基原创 2007-08-28 13:13:00 · 3300 阅读 · 3 评论 -
实现编辑控件的增量搜索
实现编辑控件的增量搜索LinZhenqun2007-10-20前言 增量搜索(又叫渐进搜索)是我比较喜欢的一种搜索方式,这种一边输入一边搜索的模式常常能更快的找到关键字,特别是在关键字记得不全的时候。大部分代码编辑器都提供了增量搜索的功能,比如Delphi,VS。在Delphi,我用得最多的快捷键几乎就是Ctrl+E了。 这几天突然心血来潮,研究了一原创 2007-10-20 14:03:00 · 3498 阅读 · 2 评论 -
绘制玻璃效果
绘制玻璃效果LinZhenqun2007-10-5 前言 现代软件对于用户体验的要求越来越高,特别是对于界面,当人们不再喜欢泛味的经典风格时,渐变效果的界面出来了,这一点在Office2003可以体显出来。但现在,渐变效果似乎也不能满足审美要求了,越来越多的软件尝试用玻璃效果来呈现,Vista整个就是玻璃的界面。 玻璃效果的实现大多采用图片原创 2007-10-05 17:43:00 · 6010 阅读 · 8 评论 -
16位图像Alpha混合的实现
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object class原创 2009-06-15 00:50:00 · 3462 阅读 · 2 评论 -
Delphi:两个高效的哈希函数
<br />function BKDRHash(buf: Pointer; count: Integer) : Cardinal; assembler;asm PUSH EBX; XOR EBX, EBX MOV ECX, EAX XOR EAX, EAX@LOOP: TEST EDX, EDX JZ @EXIT MOV BL, [ECX]原创 2010-11-30 21:33:00 · 3655 阅读 · 0 评论 -
龟速的malloc和神速的FastMM
由于在Delphi项目中,要频繁创建和释放大量小对象,因此担心有效率问题,于是打于GetMem.inc看看,发现FastMM对于小块内存作了很多工作,它预置了一组不同大小的内存池,当要创建一块内存时,FastMM找到大小最相近的内存池分配之,内存释放后回收到池中。这样的做法虽有小量内存浪费,但效率却是大大提高。我决定做一个测试,看看效率研究如何: const cSize: Integer原创 2011-12-02 17:24:52 · 2449 阅读 · 2 评论 -
让C++使用极速的FastMM
由于malloc的低效,一直在寻找替换的方案,最后突发其想,封装一个FastMM的DLL作为C++的内存管理器;然后重载全局的new和delete操作符。如上方法执行之后,再跑原来的测试程序,效率果然与FastMM版本的一致了。我原来以为VC版STL的默认内存管理器,会有大量的优化,后来跟进去才发现,它也不过是用了new和delete,如果不重载,则最终是调用malloc的。如果要让STL也使用F原创 2011-12-06 13:47:46 · 2522 阅读 · 1 评论 -
Delphi对于控件的SuperClassing
Windows内部预定义了一些通用的控件,我们在用这些控件的时候不必再调用RegisterClass注册一个窗口类,只要直接调用CreateWindows,并指定一个预定义的窗口类就可以,比如,我们要创建一个Button,只要用如下形式即可:CreateWindows(.., ‘BUTTON’,...)。但用Delphi写出来的程序,用SPY看它的某个控件的窗口类名,却是这个控件类的ClassNa原创 2005-11-14 19:38:00 · 3032 阅读 · 0 评论 -
XML和对象属性互转的基类
本人做了一个XML和对象属性互转的基类,现在放上来有兴趣拿去看一下,用法很简单,声明一个BaseConversion的子类,该子类与你想转换的对象相对应,然后覆盖基类的两个虚方法,然后在里面写元素与对象属性的转换即可以,废话少说了,还是看代码了,例子也懒得去写了,相信不会很难看懂的:unit XMLConversion; {*************************************原创 2005-11-14 19:51:00 · 2606 阅读 · 0 评论 -
浅析Delphi Container库
与Java和C++相比,Delphi对容器的支持实在少得可怜。Java有强大的集合框架,C++更有STL,Delphi有什么呢,不就是TList几个小巧的列表类,而TCollection系列的类更多只是为了可视控件而存在的,真正意义上的容器类几乎没有。一日在Google上随意的敲上Delphi Container字样,没想到竟搜到一个SourceForge的开源项目,它在主页上是这样写的:DCLX原创 2005-10-30 15:19:00 · 4628 阅读 · 1 评论 -
组件制作之三(图形控件)
VCL中的Shape是个很不错的控件,可以选择几种图形,以满足我们的需求,但有时候就是觉得它的可选图形少了一点,比如我们想要一个三角形,它却没有。于是就想到来扩展一下这个控件,名为ShapeEx。其实扩展的功能不多,只是增加了一些图形。而类也并不是继承自TShape,而是继承自TGraphicControl,这样可以让我们彻底看看图形控件的做法。Tshape也是继承自TGraphicControl原创 2004-08-05 14:09:00 · 2393 阅读 · 0 评论 -
组件制作之五(托盘组件)
这将是最后一个组件了,目标定为非可视化,事实上非可视化组件要比可视化组件难做,因为是从TComponent继承而来,就没有了很多属性和事件。而这些都要我们从头来做过。这个非可视化组件,我决定为托盘组件,其中用到的技术较多,我不如列一个表出来,然后再来讲解好一点。另外,可能篇幅会多一些,请耐心看。用到的技术:1作为核心功能,当然是托盘的应用啦。2 托盘组件怎么样影响到主窗口最小化时隐原创 2004-08-05 14:12:00 · 2417 阅读 · 1 评论 -
组件制作之一(概念)
作为组件制作的开始,应该了解一些概念,我以为这些概念是非常重要的,将可以作为以后实践的理论基础。 一, 组件的简要层次结构。一般情况下,VCL的组件可以从Tcomponent为开始。其最明显的特征就是它的属性可以在设计时通过对象察看器来操纵,另外,他还能拥有其他组件。从Tcomponent下,分出非可视组件和可视组件。非可视组件如TOPenDialog,TTimer,TTabl原创 2004-08-05 13:57:00 · 2940 阅读 · 0 评论 -
组件制作之二(一个简单组件的制作过程)
接下来要动手来做一个组件了,我想了一个计数器组件,功能方面是比较简单的,但这不是本章的重点,这一章的重点是说明一个组件的制作全过程。在其中可以学到很多组件制作的技巧,当然这些也是我从书上学得的。好了,开始制作吧: 这是一个可以计数的组件,为了简单,我以秒为单位,当开始时,他就从0开始增加,并显示出来,到3600时,它又回到0,如此循环。当然它也可以停止,暂停,继续。另外,他还有一个时间事件原创 2004-08-05 14:06:00 · 2317 阅读 · 0 评论 -
格式化函数的用法
一。Format的用法Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译,让它有一个完整的概貌,以供大家查询之用:首先看它的声明:function Format(const Format: string; const Args: array of const): string; overload;事实上Format方法有两个种形式,另外一种是三个参数的,主要原创 2004-08-08 22:47:00 · 3418 阅读 · 3 评论 -
VCL Component Messages
VCL Control Messages (values): parameters: comments: CM_BASE ($B000) CM_ACTIVATE no params used when app is actived or a原创 2005-01-16 14:31:00 · 2332 阅读 · 1 评论 -
Delphi的Hint(1)
作者:linzhenqun(风)时间:2005-8-14Blog: http://blog.csdn.net/linzhengqun----------------------------------------------------------------------------- Delphi中使用提示是如此简单,只需将欲使用Hint的控件作如下设置:ShowHint := True;H原创 2005-08-14 20:18:00 · 2826 阅读 · 0 评论 -
Delphi的Hint(2)
作者:linzhenqun(风)时间:2005-8-14Blog: http://blog.csdn.net/linzhengqun---------------------------------------------------- 上一篇介绍了Hint的简单应用,这一篇将给出一个定制Hint窗口的例子。这个自定义Hint窗口的效果不错,以玻璃为边框,并且有阴影的效果。不过这之前,我们必须介绍原创 2005-08-22 13:47:00 · 2323 阅读 · 0 评论 -
小札记
{一}对象模型小札记读Delphi原子世界中一段的札记:先看一段话,再根据这段文章用一例子来测试:对象就是一个带柄的南瓜。南瓜柄就是对象的指针,南瓜就是对象的数据体。确切地说,DELPHI中的对象是一个指针,这个指针指向该对象在内存中所占据的一块空间。我们将对象指针指向的内存空间称为对象空间。对象空间的头4个字节是指向该对象直属类的虚方法地址表(VMT – Vritual Method Table原创 2005-08-28 23:00:00 · 1810 阅读 · 0 评论 -
钩子及其应用(二)
{二}宏功能的实现我们写程序,常将完成一个特定功能的代码写到一个函数中,以后直接调用便可实现该功能。对于宏,其实也是相同的原理,将一些键盘和鼠标的操作“录制”起来,以后如果要重复这些操作,只需要将这些操作“回放”就行了。许多编辑软件都有宏的功能,比如Word。Delphi也有,按Ctrl+Shift+R进行宏录制,再按Ctrl+Shift+R结束,最后按Ctrl+Shift+P即可回放刚才的输入操原创 2005-10-06 21:37:00 · 3701 阅读 · 6 评论 -
钩子及其应用(三)
unit wdMacro; {******************************************* * brief: 日志钩子实现宏功能 * autor: linzhenqun * date: 2005-9-11 * email: linzhengqun@163.com * blog: http://blog.csdn.net/linzhengqun***************原创 2005-10-06 21:39:00 · 2726 阅读 · 0 评论 -
钩子及其应用(四)
{三}简单的消息Spy的实现凡写过一些程序的人,大都用过VS的Spy++工具,非常好用。Delphi也有一个类似的工具叫WinSignt32,说实话,比Spy++可是差远了。这一篇将介绍如何实现一个简单的消息Spy工具,其功能大概类似于Spy++的Spy Message,以此来学习全局钩子的用法。说点题外话,这些知识都是笔者经过实践学习而得来,其间不乏屡遭碰壁者,因此想写出来,帮助有兴趣者更快地学原创 2005-10-06 21:42:00 · 3439 阅读 · 0 评论 -
钩子及其应用(五)
下面就是DLL的源代码了:首先是声明一些共公的数据结构的单元,这个单元在DLL中用,也在程序中用的:unit wdSpyCommon; {******************************************* * brief: 消息Spy用到的数据结构等的声明文件 * autor: linzhenqun * date: 2005-9-25 * email: linzhengqun@原创 2005-10-06 21:45:00 · 3308 阅读 · 0 评论 -
窗体的构造函数和OnCreate事件
窗体的构造函数和创建事件和OldCreateOrder属性有很大的关系。情况1:如果窗体继承自TForm,且有如下形式:1. constructor TForm1.Create(AOwner: TComponent);2. begin3. inherited;4. Button1.Caption := 1;5. end;6.原创 2005-10-01 18:00:00 · 6382 阅读 · 2 评论 -
钩子及其应用(一)
作者: linzhenqun(风)时间: 2005-10-6Blog: http://blog.csdn.net/linzhengqun-----------------------------------------------------------------------------------------------------前言这不是关于钩子的长篇大论,而更关注于其实际应用。不过实原创 2005-10-06 21:34:00 · 3558 阅读 · 0 评论 -
Delphi的持久化
在论坛上常见到有帖子问如何拷贝控件的问题。其实Delphi提供了非常好的持久化机制,笔者写了一个类,提供两个方法,一个是将多个控件保存到流中,另一个是从流中读出控件。下面是源代码:unit ComPersist; interfaceuses Windows, Classes, Controls; type TComPersister = class private FRoot: TCo原创 2005-10-15 16:44:00 · 5414 阅读 · 2 评论 -
ListView扩展
在论坛上看一个贴,问能不能在ListView的列表头移动时响应事件,随翻查了ListView的事件,发现竟没有。于是自己动手来写一个。其实要响应这个事件也不算难,关键是了解ListView的结构,ListView的列头其实也是一个窗口,不信用Spy看一下。我们只要获得了这个头的句柄,那它的一举一动便逃不过程序的眼睛了(^ ^)。获得了句柄,再用一个新的窗口过程代替旧的窗口过程,当然这个新的窗口过程原创 2005-10-18 19:03:00 · 3127 阅读 · 2 评论 -
Ole控件的事件辅助类
Ole控件的事件辅助类林镇群2008-12-6 概述 Delphi对Ole控件作了很好的封装,使用起来要比C++的方便地多,比如想用IE控件,只需要将TWebBrowser拖到窗体上,设置相关属性,处理相关事件,一切和其他控件没有什么区别。 但是使用过程中,我们会发现一个问题,拿TWebBrowser来说,它没有OnNavigateError事件,如原创 2008-12-06 18:51:00 · 1759 阅读 · 0 评论