你的代码里全部做这样的操作 1、uses IOUtils; //引用这个单元 这个好像是D2009开始新加入的 2、然后代码中所有的DirectoryExists全部用 TDirectory.Exists来替换(详细的你可以打开IOUtis看或者翻帮助) 3、然后你建个自己的单元, 比如叫DirHelper.pas 并在此单元里定义一个 TDirHelper = record helper for TDirectory //Exists具体参数 跟IOUtils里的TDirectory.Exists要一样 function Exists(...):Boolean; end; 然后在这个Exists用自己的代码去实现 ---------- 我不知道你知不知道 Helper 的作用, 我还是简单再讲一下好了 这样子当你同时uses引用 IOUtils和DirHelper的时候 那将会优先使用DirHelper里的 如果哪天官方的DirectoryExists的BUG被修复 那你只用把这个DirHelper.pas里的Helper给屏蔽提就可以了 其它地方都不用改代码 ---------- 直接修改SysUtils 的问题么我想你也会想到 如果哪天来个Update 结果SysUitls又被替换回了原来的,或者是BUG没被修复的版本,你又忘了这个,结果程序又是错的 , 我感觉用Helper是个比较折中的办法 不过第三方代码引用DirectoryExists 就没办法了 最终还是修改SysUtils
=============================================================================
源代码编辑器里点右键,有个设置编码格式的选项 UTF8
=============================================================================
1、CnPack支持XE 2、EhLib,可能是使用得最多的Grid组件,目前官方还有没for XE的版本, 不过可以通过copy for 2010的包(复制RADStudio2010成RADStudio2011)进行修改,将140修改成150(包括文件 名和文件内容),然后还需要两个文件: Common/EhLib.Inc Common/GridsEh.pas EhLib.Inc中参照2010的增加一个XE GridsEh.pas中将MaxValue修改成MaxIntValue 3、Raize,这个组件使用的人也不少,官方已经发布for XE的5.4版,盒子有下载 4、UniDac,这个组件官方也发布了for XE,但是网上还没有FS下载,所以目前还只能使用3.0的版本,这个组件费了不少精力和时间,特别是Oracle驱动,因为UniDac一直都不提供Oracle的Source,只有dcu。 第一步方法和EhLib一样,copy 2010的包(修改Delphi14)成Delphi15),需要修改如下文件: Dac.inc DacGui.inc Design/UniReg.pas Design/DAConnectionEditor.pas Design/DBToolsClient.pas Design/UniAbout.pas Design/CRDesign.pas inc文件和前面的修改方法一样 Design/UniReg.pas:参照VER14修改 Design/DAConnectionEditor.pas:参照D14修改 Design/DBToolsClient.pas:参照VER14修改 Design/UniAbout.pas:参照D14修改 Design/CRDesign.pas:参照VER14修改 如果需要CRGrid,需要修改CRGrid/Source/CRGrid.inc 除 了Oracle的Provider无法编译通过,其它的都没问题,提示缺少dcu文件,分别是OraClassesUni.dcu、 OraNetUni.dcu、OraCryptUni.dcu,后来想到一个办法,就是安装官方3.5试用版,然后把这3个文件复制出来,结果还真的通过 了,至此,UniDac for XE大功告成! 5、最后一个是巨无霸DevExpress,最新版本为5.2,不直接支持XE,所以也 只能参照2010来修改,这个巨无霸折磨了我3天!因为我装的是完全版,每个组件都安装,而且所有的Delphi组件我都只使用手动编译版本,不使用安装 版本,即使只有安装版,我也会先安装一次,然后复制出来,卸载安装版,最后再自己编译安装。 用过DevExpress组件的人都知道,这个巨无霸的安装是相当复杂的,就算是自动脚本,都比较麻烦,何况是手动安装(具体的编译和安装步骤见Source/ManualInstall) 同样,也要copy一分2010的包成XE的,参照修改 然后修改所有Sources目录下的cxVer.inc文件 按照ManualInstall的步骤进行编译,一路会提示很多警告和错误,基本上提示中就已经写明了怎么修改,由于文件太多,我就不一一列举了,有遇到问题的朋友可以一起交流。 当全部编译通过了(估计得折腾半天),最关键的问题来了! 编 译通过之后,组件可以正常安装,而且如果你不使用Print的话,测试程序完全没有问题,但是如果使用了Print,运行会提示缺少 IDB_DXPSFUNCTION_IMAGE,这个小问题折腾了我2个小时,连调试都没机会,运行程序的第一句之前就出现这个错误了,后来搜索整个 DevExpress的pas文件,才发现是Print里面的,然后逐步排查,定位在dxPSHFLibrary.pas和 dxPSImgs.pas,dxPSHFLibrary.pas只是调用,dxPSImgs.pas才是定义的地方,重新编译没有任何警告和错误,证明和 pas文件无关,然后发现dxPSImgs有一个res文件,用ResHack工具打开才发现,并没有IDB_DXPSFUNCTION_IMAGE,而 dxPSImgs.pas里面定义的其它变量都有,我增加了一个IDB_DXPSFUNCTION_IMAGE资源(虽然找一张图片,参照其它相似变量即 可),项目成功运行,至此DevPress大功告成,手上的所有项目完全成功移植到XE上,运行测试都正常。
=============================================================================
发现调用COM+方法的时候。 最好用WideString
调用这个方法时,客户端不能再 var s: string; AppServer.GetServerDate(s); 这样了, 否则返回值是''(空串) 如果var s: WideString; 再调用就有值了。
=================================================================
winexec 是老函数,它的第一个参数不支持unicode string, CreateProcess用起来太麻烦,还是用ShellExecute 比较好
==================================================================
MDI子窗体关闭时:系统就会发出WM_MDIDESTROY消息,响应这个消息就知道子窗口被撤销了
procedure WMParentNotify(var Msg: TWMParentNotify); message WM_PARENTNOTIFY; procedure TfrmMainFrame.WMParentNotify(var Msg: TWMParentNotify); begin if msg.Event=WM_DESTROY then //msg.Event总是为513。若是2,则是子窗体释放事件。 begin showmessage( 'Child closed! '); end; end;
===================================================================
在DLL调用MDI子窗体时,如何获取当前已将打开的子窗体:
将MDI主窗口当参数传到 DLL 的函数, MDIChildren[]可以列出子窗口
===================================================================
<减小Delphi XE编译出EXE体积的方法>
1. Compiler directives in your project
put the following directives in your DPR just before the uses command:
{$IF CompilerVersion >= 21.0} {$WEAKLINKRTTI ON} {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} {$IFEND}===================================================================