Delphi磁性窗口

转自我的旧博客

昨天要用到磁性窗口,就是两个窗口离得近到一个距离就吸附到一起.拖动主窗口,吸附窗体一块运动.

到网上搜了一下,基本没见到可以使用的.有个东东,还是收费的.没办法自己写了一个.

用法很简单,把你的窗口都改成从这个继承即可生效.例如

type
TForm3 = class(TCustomMagnetForm)
private
{ Private declarations }

public
{ Public declarations }
end;

var
Form3: TForm3;

不多说了,上代码

{ *****[......]

全文阅读

发表在 Delphi, 未分类 | 留下评论

一个灵巧的Delphi多播实事件现方案.

转自我的旧博客

一个灵巧的Delphi多播实现方案.必须是支持泛型的Delphi版本.也就是Delphi2009以后.强烈建议用DelphiXE.

用法就是例如写一个Class指定一个Event,触发的时候会通知多个Method.和.NET的多播事件机制是一样的.

用法例如:

type
TFakeButton = class(TButton)
private
FMultiCast_OnClik : TMulticastEvent<TNotifyEvent>;

public
constructor Create(AOwnder : TComp[......]

全文阅读

发表在 Delphi, 未分类 | 8条评论

给Delphi的工具条按钮添加BTNS_WHOLEDROPDOWN风格

转自我的旧博客

工具条按钮的BTNS_WHOLEDROPDOWN风格是IE5以后就提供的.

Delphi早期版本估计是为了照顾兼容性工具条按钮是没有这个风格的.只有下面几种和系统风格对应的风格.

TToolButtonStyle = (tbsButton, tbsCheck, tbsDropDown, tbsSeparator,
tbsDivider, tbsTextButton);

后面尽管IE5以下根本没人用了,但是Delphi的开发人员都忘了添加一种WholeDropDown风格来对应这种风格..

CSDN网友 xiedewei 提了这个问题.并且[......]

全文阅读

发表在 Delphi, 未分类 | 留下评论

一个可以再WIN2000及以上操作系统使用的GetTickCount64

转自我的旧博客

以后尽量用Delphi/C++双代码写.

GetTickCount返回值是整数,这样的话最多49天多就会复位重新从0开始.Vista以后提供了GetTickCount64这个函数, 但是WindowsXP还是主流.在项目中为了处理这个,自己实现了一套办法.这个GetTickCount和真正的额GetTickCount相比会恒 定的相差800毫秒左右.不过这个不影响使用.获取开机时间这800毫秒完全可以忽略.计算时间差的话就和GetTickCount是一样的了.

Delphi版XE下编译通过.

type
_SYSTEM_INFORMATION_CLASS[......]

全文阅读

发表在 Delphi, 未分类 | 留下评论

Delphi的Anymouse方法探秘

转自我的旧博客

这段时间换工作.加之身体不太好.总是感冒和喉咙发炎.就整天躺在家里等待面试电话.刚好有了点时间能看看Delphi的一些新东西

自从Delphi2009以后增加了一种匿名方法.

通过反汇编跟踪发现是编译器利用插入接口,类,对象来实现的.

Delphi2010刚好有RTTI的增强.我们就可以还原这个接口和类.至于RTTI的用法可以参看我前面的文章.

说干就干,挽袖子操刀

多余的话不多说.

procedure Test(Strs : TStrings);
type
TProc = reference to function () : TObj[......]

全文阅读

发表在 Delphi, 未分类 | 留下评论

一个最简单的Delphi2010的PNG异形窗口方法

转自我的旧博客

同事演示了一个.NET的的PNG异形窗口.挺漂亮.于是也想用Delphi显摆一个.

关于Delphi用PNG做异形窗口的资料有不少.都是用GDIPlus或者TPNGImage组件加载PNG图像做的.但是我很懒,不想引用的GDIPlus,也不想去找PNGImage下载.

好在从Delphi2009开始Delphi中就收购了PNGImage,并集成到后继的版本中.Delphi2010又包装了微软的IWICImagingFactory接口,这样处理PNG的工作就交给操作系统去做了.

函数很简单一共就几行,关键就是UpdateLayeredWindow.[......]

全文阅读

发表在 Delphi, 未分类 | 留下评论

Windows CE,Windows Mobile在PC端的操作.

转自我的旧博客

上一段做WindowsCE上的工作.翻译,包装了微软的RAPI和dccManSink等.

可以感知嵌入社设备的插拔.可以操作嵌入式设备上的注册表.文件,数据库等等.

发出来算是给Delphi社区做个贡献

下面贴出的是三个单元的代码.也可以在CSDN下载.里面包含例子.

http://download.csdn.net/source/1993722

{*******************************************************

RAPI接口

版权所有 (C) 2010 王锐

翻译自MSDN和RAP[......]

全文阅读

发表在 Delphi, 未分类 | 留下评论

Delphi2010的RTTI增强

转自我的旧博客

Delphi编译的文件体积增大了很多.很大一部分原因是因为Delphi2010默认提供了全信息的RTTI.

每一个数据类型都有全部运行时信息.例如可以在运行时获得结构体的成员以及成员类型等.

这个功能带来的方便就是我们可以写很多通用的序列化方法.也可以做一些类似OR的东西.

相反这个功能带来的缺点就是文件体积将增大.

不过有一个解决方案.就是把运行时信息的编译开关关掉.但是编译期间连接的库在Lib目录下.这些DCU文件却都是带RTTI信息的.所以编译出来 的内容也会是非常大的.就只有修改VCL源代码,全部关掉运行时信息的编译开关.然后把代码编译成DCU[......]

全文阅读

发表在 Delphi, 未分类 | 留下评论

Delphi2010中Windows7新的taskbar功能的使用

转自我的旧博客

Windows7正式版已经用了很久了.MSDN上面正式版Windows7已经发布很久了.
发现Windows7的TaskBar很漂亮.也有很多功能.例如IE下载的时候可以看到进度,可以叠加图标等等特效.
Delphi2010也发布很久了,Delphi2010号称支持Windows7的新增API.那么看看有没有TaskBar相关的API.
一提到Taskbar相关,首先就想到ITaskBarList不同版本接口.到shlobj单元一看,果然增加了ITaskbarList3,ITaskbarList4两个新版本的接口.
老办法CreateComObject(CLSID[......]

全文阅读

发表在 Delphi, 未分类 | 一条评论

再探Delphi2010 Class的构造和析构顺序.

转自我的旧博客

发了上一篇博客.盒子上有朋友认为Class的构造和析构延迟加载.是在Unit的初始化后调用的Class的构造.在Unit的反初始化前调用的Class的析构函数.

为了证明一下我又做了个试验

unit Unit2;

interface

Type
TClassTest = class
class constructor create();
class destructor destory();
end;

implementation
uses
Windows;

{ TClassTest }

class constr[......]

全文阅读

发表在 Delphi, 未分类 | 留下评论

Delphi2010新发现-类的构造和析构函数功能

转自我的旧博客

Delphi2010发布了.

虽然凭着对Delphi的热爱第一时间就安装了,但是现在可能是年纪大了,对新事物缺乏兴趣了.一直都没有仔细研究.

今天有点时间试了一下新功能.

本来C#和Delphi.NET是支持类的构造函数/析构函数的(注意不是实例的构造和析构).也就是在模块初始化/卸载的时候会调用.

这样有很多好处,比如说类的静态变量的初始化什么的都可以在这里做.

Delphi For Win32对这方面的需求还不是很大.

第一个原因.历史上旧版Delphi不支持静态变量.只能用Unit的全局变量+类函数来模拟.所以类的构造析构[......]

全文阅读

发表在 Delphi, 未分类 | 留下评论

获取进程的命令行参数

转自我的旧博客

type

UNICODE_STRING = packed record

Length: Word;

MaximumLength: Word;

Buffer: PWideChar;

end;

PUNICODE_STRING = UNICODE_STRING;

type

PROCESS_PARAMETERS = packed record

AllocationSize: ULONG;

ActualSize: ULONG;

Flags: ULONG;

Unknown1: ULONG;

Unkn[......]

全文阅读

发表在 Delphi, 未分类 | 留下评论

集合和字符串的转换

转自我的旧博客

?在DFW上回答了一个问题.写了些代码.为了以后用贴到这里

uses
TypInfo;

type
TSetDemo = set of(S1, S2, S3, S4);

procedure StrToSet(TypeInfo: PTypeInfo; const Value: string; out Result);
function NextWord(var P: PChar): string;
var I: Integer;
begin
while P^ in [‘,’, ‘ ‘, ‘[', ']‘] do Inc(P);
I :=[......]

全文阅读

发表在 Delphi, 未分类 | 留下评论

构造一个通用的回调Thunk.(把回调函数指向对象的方法的办法)

构造一个通用的回调Thunk.(把回调函数指向对象的方法的办法)

转自我的旧博客

构造一个通用的回调Thunk.(把回调函数指向对象的方法)
最近又看到了VCL代码中的MakeObjectInstance函数,实际上是一段WndProc的Thunk代码.再一次感叹VCL设计之精巧,效率之高.
不喜欢MFC的消息映射方式,MFC的消息映射虽然好理解,但是是采用查表方式效率实在是太低了.VCL的MakeObjectInstance可以
说是VCL Windows系统的灵魂所在,效率极高.
不禁想可不可以实现一个通用的回调函数Thunk呢,可以把所有回调函数都变成对象的方法.[......]

全文阅读

发表在 Delphi, 未分类 | 2条评论

18位身份证号码的校验

转自我的旧博客
18位公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。
组成:六位地址,八位生日,三位顺序码, 一位校验码。校验方法:
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, … , 16 ,先对前17位数字的权求和
Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

(2)计算模
Y = mod(S, 11)

(3)通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验[......]

全文阅读

发表在 Delphi, 未分类 | 留下评论

像Delphi IDE一样运行时设计控件IDesignerNotify, IDesignerHook的实现

转自我的旧博客

前几日有个朋友问我Delphi的TCustomForm的Designer是怎么实现的.

以前研究过这个.于是花了一个上午写了代码给他.代码如下.

想要设计窗口的时候直接调用一下BeginDesign函数.结束设计调用一下EndDesign就行了.

2013年做了些修改,不知道Delphi什么时候Set
http://www.raysoftware.cn/wp-content/uploads/2013/06/IDesingHook.zip

{****************************************************[......]

全文阅读

发表在 未分类 | 3条评论

Delphi是最适合编写ShellCode的工具

本文是写给经常写ShellCode或者给PE文件添加代码的人的.
题目这样写有点不精确.不过Borland的编译器确实是算得上最适合编写ShellCode工具.
编写ShellCode的朋友们知道.字符串常量应该是处理起来非常麻烦.
例如:
调用GetProcAddress函数吧.参数有一个是字符串.很多编译器字符串常量是在数据段中.只读的属性.
那么编写ShellCode的时候GetProcAddress(hm,”Function”);就不行了.因为”Function”实际上是在数据段中,传递的只是指针.如果是DLL的话可能还要重定位.
所以见到有很多人编写ShellCode自己[......]

全文阅读

发表在 未分类 | 留下评论

Delphi中调用C约定不定参数函数的调用方法.

Delphi支持C约定的调用Cdecl大家都是知道的.最近一个朋友说C中不确定参数的函数Delphi中无法调用.其实Delphi支持内嵌汇编,这样任何函数约定都可以?调用的.

我做了一个例子,选取的函数是NtDll中的DbgPrint函数.这个函数在C中的原型

ULONG
DbgPrint(
IN PCHAR? Format,
. . . .? [arguments]
);

是典型的C约定,不确定参数的函数.

Delphi中确实没有可以直接调用的约定方式.但是Delphi本身也支持一种不确定参数的调用方式就是array of const参数.只要稍加变通就行[......]

全文阅读

发表在 未分类 | 留下评论

研究心得——->CPU信息的获得,比较全面的。

研究心得——->CPU信息的获得,比较全面的。

转自我的旧博客.

最近到整理了一份CPU的信息,应该算是比较全面的吧。
几乎现在所有的X86 CPU都内置了CPUID指令以辨别真伪,一些CPU厂商例如AMD,VIA等还内置了更加丰富的扩展CPUID指令,用着更方便了。
下面我们利用Delphi来实现一个CPU检测的软件。
CPUID的调用方式如下:
asm
push eax
push ebx
push ecx
push edx
mov eax,X
//***************************************************[......]

全文阅读

发表在 未分类 | 留下评论

惨痛教训

服务器被我玩坏了.

博客没备份.数据库又在C盘.丢了好几篇博客.不过又可以多发一篇这个吐苦水的博客了.

后面会把CSDN的博客都迁移过来.

这次一定要小心啊.

发表在 未分类 | 一条评论