从DelphiXE4的例子分析FireMonkey ListBox效率问题.

DelphiXE4有一个Demo CustomListBox.
演示的是一个自定义Item的ListBox.其中有一个按钮,一次添加1000个Item.
尝试着把循环加到10000.乖乖,添加时慢得不得了,接近10秒才能添加完.我当初做光速搜索的时候几百万文件搜索都是100毫秒内解决的.差距怎么这么大.
结果是经过调整,添加10000个Item的时间由10秒提高到了800毫秒,不要太过分哦.

查看了一下Demo中的Button2Click中的代码.
改回到1000次循环,因为AQTime中执行比较慢,10000次循环等不起.

使用AQTime工具分析了一下时间.最后Bu[......]

全文阅读

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

奇技淫巧之Delphi和JavaScript互通

Delphi2010以后增加了新的RTTI信息,也就是通过RTTI可以在运行时获取/调用对象的公开成员或者函数.
ScriptControl可以添加外部的对象,这个对象是个IDispatch接口,脚本调用的时候实际上是调用IDispatch的Invoke方法.
那么我们只要实现了IDispatch的Invoke方法,在里面通过RTTI再转而调用Delphi对象的Public方法即可.通过这个可以代理任何Delphi的对象.

仅仅调用Delphi对象似乎还不够完美,对象事件如果能关联到脚本的函数就更好了.那好,封装一个事件代理的类就可以.
例子如下:

procedure TFo[......]

全文阅读

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

奇技淫巧之获取Delphi所有类的类信息

这个绝大多数朋友应该是用不上的,纯属玩的.
昨天和业界某几个人讨论delphi的class的typeinfo问题,一般implementation部分实现的类在别处是拿不到类型信息的,尽管它有.
还比如私有的嵌套类在别处也拿不到.
于是写了几行代码扫描进程中所有类的类型信息,把这些Unpublic的classinfo也都翻出来.
本来纯属玩的.结果GetAllClassInfos_FromSystemModuleList发现如果把这个做成IDE插件跑起来居然可以看到一些敏感的类的信息,这些类估计都是在implementation部分实现的.比如TLicenceXXX并可以继续TypeI[......]

全文阅读

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

Delphi的DateTimeToUnix/UnixToDateTime的一点小改进

Delphi的DateTimeToUnix/UnixToDateTime转换时间并没有考虑到本地时间和格林尼治时间的差,结果我天朝时间被赤裸裸的差了8个小时.

type
  time_t = Int64;
function DateTimeToUnix(ConvDate: TDateTime): time_t;
var
  zi : TTimeZoneInformation;
begin
  GetTimeZoneInformation(zi);
  Result := Round((ConvDate - UnixDateDelta) * 86400) + 60*(zi.B[......]

全文阅读

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

以低用户权限启动一个进程.比如Vista或者WIN7中的IE

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

以低权限启动一个进程(例如IE)

版权所有 (C) 2013 wr960204 武稀松

******************************************************* }

unit LowIntergrityLevelProcess;

interface

uses
WinApi.Windows;

const
SECURITY_MANDATORY_UNTRUSTED_RID = $00[......]

全文阅读

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

Delphi泛型动态数组的扩展.

从Delphi支持泛型的第一天起就有了一种新的动态数组类型,泛型化的动态数组–TArray.
虽然这个类型比较方便,但是却没有提供更丰富的操作.因为XE4中提供了对数据类型的Helper扩展,例如StringHelper,企图实现一个TArrayHelper但是发现Helper不支持泛型的类型.
没办法只好包装了一个record,好处是似乎只要支持泛型的Delphi版本都可以支持.使用效果如下.

var
  //声明动态数组
  a, b, c: TArrayEx<Integer>;
  f: TArrayEx<Single>;
  s : TArr[......]

全文阅读

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

Delphi XE4做一个超小的浏览器.(做一个超级小的WebBrowser)

用DelphiXE4开发一个40KB的浏览器.

刚好有个需求是要访问一个网页,但是程序的体积又不能太大.
DelphiXE4以后编译出的代码体积越来越大.我一直都是追着最新的Delphi版本,所以不可能退回早期版本.
研究了一下,发现Classes,Rtti,Themes,Controls,Forms这个单元是高高位于体积之首的.
空工程:
System.Classes 398,080 CODE
System.Rtti 293,860 CODE
Vcl.Themes 243,644 CODE
Vcl.Controls 130,056 CODE
Vcl.Forms 12[......]

全文阅读

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

Delphi编解码JS字符串.

今天在CSDN回答网友问题,实际上就是JS字符串的解码.给他写了几行简单的代码,转义符也没全部处理.
闲着没事手痒痒,就把JS字符串的编解码都写出来,转义符也全部处理了.说不定以后用得上.
参考的Json.org上的编码规范.

CSDN问题


function EncodeJSStr(const value: Widestring): Widestring;
var
  P: PWideChar;
begin
  Result := '';
  P := PWideChar(value);
  while P^ <> #0 do
  begin[......]

全文阅读

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

JCL for Delphi XE4

Delphi XE4出来有段时间了,但是JCL(JEDI Code Library )一直还没有能在XE4中使用的版本.
SVN拉下JCL最新的代码,在XE4上修改了一下做出了这个JCLDelphi5-XE4都能用的版本.
主要变化是Delphi XE4中SysUtils单元中的AnsiString相关函数都被挪到了System.AnsiStrings单元中.其他变化都不大.
(Vista/WIN7用管理员权限执行)Install multiple profiles.bat即可安装

下载地址:http://www.raysoftware.cn/content/JCL_D5-XE4.[......]

全文阅读

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

XE4中FMX一些改进

今天把XE3的一些项目升级到了XE4,发现了一些不同.
1.Style文件格式发生了变化
2.FMX单元的做了一些拆分和调整.这个正是之前我最诟病的.FMX的单元引用十分混乱,一看就没有经过仔细的设计.
例如XE3中FMX.Types单元辗转竟然赢了ListBox,Edit等单元.
动画和滤镜等单元也比较恶心,一旦使用了一个特效就会引用全部特效类,因为单元初始化节把所有的特效都注册了,结果因为这些类用到过了,所以没法被优化掉.
如:FMX.Ani中

initialization
  RegisterFmxClasses([TColorAnimation, TGra[......]

全文阅读

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

看Delphi XE4 iOS开发第一眼

继昨天,今天到了公司,用了某人的Mac Book Pro视网膜屏就是李维说很贵的那款,试了一下.
DelphiXE4的Demo直接输出到XCODE的iOS模拟器上,非常顺利,没有任何问题.而且也很流畅.
我猜是XE4只是提供了FireMonkey的设计器,到时候把它自动转换到XCODE对应的设计上.反正界面和代码是分离的,代码估计还是在Windows平台上由Delphi for iOS编译器编译的.界面经XCODE转换后作为资源合成到一块,产生的iOS程序.
因为只是FireMonkey作为一个Windows上的设计器,所以控件什么的都是FireMonkey模拟的,实际没有功能,所以XE[......]

全文阅读

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

Delphi XE4 第一印象

昨天听说DelphiXE4发布了.赶快去易博龙申请了30天试用.
最关心的当然是iOS开发了,听说不再尴尬的需要FreePascal编译了,嘿嘿.

但是悲催的发现自己想简单了,其实还是需要一台Mac计算机,并且要安装XCODE的.不过这个也没问题,如果Delphi确实可以做到一个套代码,随便就可以开发出Windows,Mac,iOS,未来可能还会有Android/WindowsPhone的话,这点要求还是不算什么的.

不过我手头倒是没有Mac计算机,明天到公司再试吧.先往下看看.

手头没有Mac计算机,也没有iOS模拟器,本来以为没法编译看一眼了,突然发[......]

全文阅读

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

Delphi2007以后编译器进步的简单测试

刚刚看了有个兄弟用最新的FreePascal和Delphi7的编译器评测.觉得有点不公平.毕竟D7是10年前的产品.现在Delphi都出到XE3了.

用了个简单的代码测试了一下Delphi编译器的变化.

涵盖Delphi的版本XE3,XE2,XE,2007

测试代码如下

program matrix;

{$APPTYPE CONSOLE}
{$DEFINE USEINLINE}

uses
Windows;

const
SIZE = 30;
msg =
{$IFDEF DEBUG}
'Debug Version'
{$ELSE}
'Rel[......]

全文阅读

发表在 Delphi | 留下评论

RAD XE3 上海发布会见闻

当时是约了8个同道弟兄一块去的,没征得他的们的同意,没他们的照片.

XE3的livebinding被李维用起来非常帅,不知道实战效果会怎么样.

WIN8的非原生支持李维解释起来也有道理,就是XE3开发的Metro风格程序可以在XP,WIN7上正常运行.

计划12月发布的BCB64位的支持是支持最新的C++标准的,但是我特意问了一下和32位代码兼容情况,李维的解释是32位BCB不支持最新CPP标准,也就是如果你用BCB64+最新CPP语法,那么暂时不能移植回32了,所以要跨WIN32/WIN64平台的BCB兄弟们就暂时不要用最新的CPP语法.

Mobile Studio的[......]

全文阅读

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

XE3中Helper的增强.

XE3之前就有想法如果能给String甚至任意类型增加Helper函数有多方便.

每个版本Delphi刚出来我都会试一下Helper能否给简单类型”打补丁”.

自从上次发现XE3有String Helper以后试了一下,现在XE3基本上可以给大多数类型打补丁了,除了Interface类型以外.


type
THInteger = record helper for Integer
function ToStr():String;
end;

THDateTime = record Helper for TDateTime
function GetDate()[......]

全文阅读

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

XE3的String Helper

Delphi XE3增加了字符串的辅助功能.可以像操作一个结构体或者类一样操作字符串了.也就是给字符串追加了成员方法.

procedure TForm5.Button1Click(Sender: TObject);
begin
Caption := ‘abc’.ToUpper; //大写ABC
Caption := string.create(‘a’,20);? //20个a
Caption := Inttostr(‘哈哈’.Length);
end;

看上去很神奇吧.

在sysutils单元

TStringSplitOptions = (None, Excl[......]

全文阅读

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

关掉64位系统中32位程序的目录重定向

在64位Windows系统中运行的32位程序会被系统欺骗.

例如windows\system32的目录实际是windows\syswow64目录的映射.

program files实际是program files(x86)的映射.

注册表的hkey_local_machine\software实际是hkey_local_machine\software\wow6432node子键的映射.

那么如何访问到真正的64位程序的目录和注册表呢?

关掉目录重定向即可.

关闭文件的重定向


var
 OldWow64RedirectionValue: Long[......]

全文阅读

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

判断当前进程是否以管理员权限启动的


uses
 shlobj;
 type
 WELL_KNOWN_SID_TYPE = (
 WinNullSid,
 WinWorldSid,
 WinLocalSid,
 WinCreatorOwnerSid,
 WinCreatorGroupSid,
 WinCreatorOwnerServerSid,
 WinCreatorGroupServerSid,
 WinNtAuthoritySid,
 WinDialupSid,
 WinNetworkSid,
 WinBatchSid,
 WinInteractiveSid,
 WinServiceSi[......]

全文阅读

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

DelphiXE3的FireMonkey的体积我实在无语了.

建立一个空的FireMonkey的HD工程,就一个主窗口.

编译出来Debug版20MB多.Release版8MB多.

不知道功能和速度上怎么样.不然实在找不到亮点啊

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

PNG分割

Delphi新版本虽然集成了PngImage但是分割复制什么的却非常难用.稍微封装了一下.可以把一张PNG横向分割成N张.透明通道什么的都可以保持不变.

//2013.7.22代码做了改动,变成按行和列切割.CopyPng也做了处理,可以拷贝任意区域
type
  TPngArray = array of TPngImage;

{把一个PNG拷贝到另一个PNG中,带透明通道}
procedure CopyPng(const Src: TPngImage; dest: TPngImage;
  const SrcX, SrcY, DestX, DestY, Width,[......]

全文阅读

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

C++的MemoryStream,和Delphi/BCB基本兼容

只有一个头文件.


/*
CMemoryStream
学过Delphi和BCB的同学懂的.
只要引用这个头文件即可.
*/
#pragma once

#include &amp;lt;Windows.h&amp;gt;

enum SEEK_ORIGIN
{
SO_BEGINNING??? = 0,
SO_CURRENT????? = 1,
SO_END????????? = 2
};

class CMemoryStream
{
public:

explicit CMemoryStream(int nMemoryDelt[......]

全文阅读

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

C++内存INI文件

这套代码适用于从服务器拉取INI,而不用保存到文件,而且是跨平台的.支持Unicode和Ansi.

而Windows 那套INI API先不说和平台绑死,他一定要访问文件的.


/*
王锐.2012.8.31
*/

#pragma once

#include <string>
#include <vector>
#include <map>



template<typename T>
class CMemIni
{
private:
template<typename T>[......]

全文阅读

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

FireMonkey工程减肥

今天和同事在搞一个Delphi XE2的东东.结果发现FireMonkey编译出来的程序有8MB.即便采用了Release + WeakRTTI编译选项也3.5MB左右.

阅读了一下FireMonkey的源代码.发现FireMonkey耦合的非常紧密.

例如Forms单元,就实现了2D,3D的Forms.从而引用了这些相关实现单元.这些单元如果有初始化节则很多代码就不会被编译器优化掉.

更有甚者Types居然是用了ListBox和Edit单元…

不过问题虽多但FireMonkey也有一个好处就是和VCL不一样,FireMonkey和RTL\IDE之间捆绑的非常松散.[......]

全文阅读

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

内存加载模块,支持32/64 DLL文件

http://blog.csdn.net/wr960204/article/details/2134157

上几天有人说找遍互联网也找不到内存加载模块能够成功加载DelphiXE2编译出来的的64位DLL的.

看了一下,其实DelphiXE2编译出来的DLL本身是没问题的,而是这些内存加载忽略了X64情况下异常处理和X86不同.而XE2编译出来的 DLL的DLLMain的退出地方用到了halt0,这里面又用的抛异常方式跳出来的.这里就用到了64位PE文件的异常处理部分.而VC等编译的DLL 如果没有用到SEH则不会出现问题.

花了2天写了这个相对可以完整的处理32/64位Wind[......]

全文阅读

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

Win7下超级管理员创建普通权限任务

转自我的旧博客

已转至新的博客 http://www.raysoftware点击打开链接.cn/?p=49

项目中用到一个功能,Win7下超级管理员创建普通权限任务.

试了几种办法,例如获取资源管理器的Token,然后以这个Token用CreateProcessWithTokenW创建任务。这样做是可以的.

但是如果当前没有资源管理器或者其他普通权限的任务怎么办?CreateToken自己构造一个Token也可以,但是那些参数看了就头大.

试了一下以超级用户方式启动任务管理器用菜单中的运行,居然是默认创建普通权限任务,有一个复选项是以超级用户权限启动任务.[......]

全文阅读

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

Delphi磁性窗口

转自我的旧博客

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

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

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

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

public
{ Public declarations }
end;

var
Form3: TForm3;

不多说了,上代码

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

全文阅读

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