打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
碧水航工作室

碧水航工作室

专注IT软件技术!

Delphi XE3 RTM版本已经出来,只是官方迟迟未发布,不知道是不是想避开九月苹果?

然而盒子论坛里已经欣起一场骂战。从没用过 泛型、unicode、新RTTI , 坚守D7的开发者,     不知所云在指责DELPHI 从未进步过!只是不可理解的是,一些精通DELPHI底层开发者也在开骂Delphi。

有开发者以为XE3放弃了MAC平台,实际情况是,FM平台升级为FM2。XE3直接出程序MAC OS X 上编译和调试,再也没有XE2的 XE2中的 FireMonkey-iOS.dmg + FPC 复杂编译模式。至于爱疯和安卓的移动开发,应该是在独立的移动IDE上,据说是明年第一季度发布。

我的机器配置是:MAC 一体机(港版,21.5英寸,MAC OS X LION 版本),i7+8G内存+1TB硬盘。装了一个WIN7的虚拟机,分配2个核心+4G内存 给WIN7虚拟机。xe3试用版在WIN7上安装运行。

1、XE3和MAC之间的通讯,靠一个 paserver 工具 来 通讯。XE2中的 FireMonkey-iOS.dmg + FPC 编译模式,已经被去除。下载 setup_paserver.zip 文件(下载地址:

       昨晚请假回一趟中山处理点私人事情。中山是一个小城,安静、美丽、宜居,如今为了生计又要重返北上广深的喧嚣世界。当公司来了几位90后,深有感触:花有重开日,人无再少年。在闲暇时间留点技术涂鸦,留点奔三活过的痕迹。

      RTTI映射TObject属性和Ini文件,源于 作者robstechcorner的 IniPersist单元。作者最早研究Delphi 新RTTI技术,只是不太为国人所熟悉,因为,,,红杏出不了墙。

      我将其 IniPersist单元,改为 RTTI 映射 记录类型与INI文件。

unit IniRec4Rtti;

interface

uses SysUtils,Classes, Rtti,TypInfo;

type

  IniValueAttribute = class(TCustomAttribute)

  private

    FName: string;

    FDefaultValue: string;

    FSection: string;

  published

     constructor Create(const aSection : String;const aName : string;const aDefaultValue : String = '');

     property Section : string read FSection write FSection;

     property Name : string read 

TValue大概是新RTTI最重要最抽象的类!说他复杂,因为他是新版的万能变体类型,但比 Variant类型多带了RTTI类型信息。

在执行方法中,遇到复杂的参数类型(比如 record )必须带上RTTI类型信息。

例子如下:

type

  TMsgInfo =  record

    MsgInfo:string;

    MsgID:Integer;

  end;

  TForm1 = class(TForm)

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

   procedure ShowMsg(MsgInfo:TMsgInfo);

  end;

procedure TForm1.ShowMsg(MsgInfo: TMsgInfo);

begin

  ShowMessageFmt('ID:%d Msg:%s',[MsgInfo.MsgID,MsgInfo.MsgInfo]);

end;

RTTI 执行调用:

procedure TForm1.Button1Click(Sender: TObject);

var

  RT:TRttiType;

  RM:TRttiMethod;

  MsgInfo:TMsgInfo;

  Value:TValue;

begin

  RT := TRttiContext.Create.GetType(TypeInfo(TForm1));

  RM := RT.GetMethod('ShowMsg');

  if RM<>nil then

  begin

    MsgInfo.MsgID := 100000;

    MsgInfo.MsgInfo := 'SEWGWEG';

   // 构造 TValue 复杂参数

    TValue.Make(@MsgInfo,TypeInfo(TMsgInfo),Value);

    RM.Invoke(self,[Value]);

  end;

end;

CSDN 数据库被黑客公布泄露,2000万注册用户密码因为明文而泄露。多少程序员在CSDN的积分和博客都受影响!

丢人的CSDN,就这么点技术和管理水平,还号称中国程序员大本营!

鄙视!!!下面图片是群里发布的!

总有一些Delphi老粉丝,经常口出狂言:D7以来delphi都没什么进步,所以一直在用D7!

因为程序员具有一种深入骨髓的惰性,与年龄日益增长,懒惰和保守遮住了delphi在细节上无微不至的进步!

关于动态绑定事件,老版本当然也可以实现,一个是实现相同的参数名称,直接赋值;另外一个是用TMethod.Code和TMethod.data动态绑定事件,也许还有其他方法,但是,D7是不能用匿名方法来动态绑定事件。Delphi XE 完美实现了匿名方法来动态绑定事件,而匿名方法和事件一起绑定,在程序代码上感觉是一体的;当然,如果匿名方法很长,可以单独声明!

下面请看动态绑定 TEdit.OnChage事件:

///动态绑定 Tedit事件

  @edt1.OnChange :=

   pPointer(Cardinal(pPointer(

     procedure (sender: tObject)

     begin

       ((sender as TEdit).Owner as TForm).Caption :=

        (sender as TEdit).Text;

     end )^ ) + $0C)^;

//复杂点事件参数,比如窗体的OnQuery事件

@Self.OnCloseQuery :=

    pPointer(Cardinal(pPointer(

      procedure (Sender: TObject; var CanClose: Boolean)

      begin

        CanClose := Application.MessageBox('你确定要关闭主窗口吗?','关闭提示',MB_OKCANCEL+MB_ICONQUESTION) = IDOK;

      end )^ ) + $0C)^;

运行效果图:

CIS 是一套很不错的商业internet组件,简单强大易用。需要注意的是,有一个开源版本的ICS,和它命名非常相似!

其中有个CIS SMTP 发送邮件的例子,发送中文邮件,乱码很厉害!

其实只要指定编码格式,黑体的部分,中文乱码即可解决!

uses clEncoder;

procedure TForm1.btnSendClick(Sender: TObject);

begin

  if (clSmtp1.Active) then Exit;

  clSmtp1.Server := edtServer.Text;

  clSmtp1.Port := StrToInt(edtPort.Text);

  clSmtp1.UserName := edtUser.Text;

  clSmtp1.Password := edtPassword.Text;

  if cbUseTLS.Checked then

  begin

    clSmtp1.UseTLS := ctAutomatic;

  end else

  begin

    clSmtp1.UseTLS := ctNone;

  end;

  clSmtp1.Open();

  try

    clMailMessage1.CharSet := 'UTF-8';//请注意,,UTF-8写法很混乱,如果写成 UTF8,那是很杯具!

    clMailMessage1.Encoding :=  cmBase64; //加密方式

    clMailMessage1.BuildMessage( memBody.Text, '');

    clMailMessage1.From.FullAddress := edtFrom.Text;

    clMailMessage1.ToList.EmailAddresses := edtTo.Text;

    clMailMessage1.Subject := edtSubject.Text;

    clSmtp1.Send(clMailMessage1);

    ShowMessage('The message was sent successfully.');

  finally

    clSmtp1.Close();

  end;

end;

运行示例图:

在foxmail浏览邮件,正常显示:

无论你承认或否定,狂欢或轻视,XE2发布是一个具有里程碑的意义,其重要性仅亚于 Delphi 1 !

Delphi XE2 不仅带来一个全新的 2D/3D UI 框架,跨平台IOS,其他方面的改进也是不容小视,比如 RTTI的日趋完善。新版本的XE2支持了 TRttiIndexedProperty 和 加强RTL的反射(支持WIN32/WIN64/MAC)!

Delphi有一种特殊的属性值,叫索引属性,常见的 TCollection 类的 Items[Index] 就是索引属性,在D2010/XE版本中,常常为RTTI 不能反射此属性而抱憾和愤青!今天,XE2版本终于可以反射此属性了。比如针对TDBGrid.TDBGridColumns 凭此功能,我们可以轻松反射其l索引属性(列的标题)并做出多国语言功能。

 uses System.RTTI;

procedure TForm1.Button1Click(Sender: TObject);

var

  RX:TRttiContext;

  RT:TRttiType;

  RP:TRttiProperty;

  RIP:TRttiIndexedProperty;

  Value:TValue;

  i,iCount:Integer;

  Col:TColumn;

begin

  RX := TRttiContext.Create;

  RT := RX.GetType(TDBGridColumns.ClassInfo);

  RP := RT.GetProperty('Count');

  iCount := RP.GetValue(DBGrid1.Columns).AsInteger;

  for RIP in RT.GetIndexedProperties do

  begin

    if RIP.PropertyType.Handle = TypeInfo(TColumn) then

    begin

      ListBox1.Items.Add(RIP.Name+ ':'+RIP.ToString);

      for I := 0 to iCount - 1

Delphi 后续 Unicode 版本中, 一些单元里碰到UTF8编码字符,如果我们可能没有安装西欧的一些字符集,单元有可能显示错误,用delphi右键菜单 File Format->UTF8也未必能修复好。

如图:

正是因为 Delphi 单元不认识UTF8字符集,导致单引号被吃掉,编译异常!

这个时候,千万不要随便修改或保存该单元文件。将该单元拖到 NodePad++里,在 NodePad++ 菜单->格式->以UTF8显示,即可看到这样的效果,UTF8字符编码马上原形毕露(如图:xC0,xFF, 记住这是十六进制,是零而不是大写字母的O):

以 #$ 打头,修正如下:

如果是char字符,则改为  #$00C0和 #$00FF,记住多两个零。

如果是ansichar,则改为 #$C0和 #$FF。

我经历的一些控件: ICS 7.0, SynEdit, Database Comparer VC 都有这个UTF8编码问题。

摆平她们,然后享受她们!

 Delphi IDE 本身就是一个插件模式的工具,插件的好处不用多说。运行包的BPL,其实就是众多单元的集合,因此可以再次重新组合,只要你将各个BPL包用到的单元再组合一次!

本文以  http://code.google.com/p/tangram-plugin-framework/ 插件框架自带的BPL包合并向导工具做一次图文介绍!

1、安装好开源插件框架 tangram-plugin后,然后点击 菜单 File->New->Others,找到tangram FrameWork里的包合并向导,

2、Dev控件堪称独孤求败,最强也是最肥的数据库解决方案。我们以Dev套件包为准,合并Dev几十个BPL包为一个BPL包。

这里用到dev功能是cxGirid,treelist和垂直表格,如果用到其他的功能,涉及的BPL会有所不同!

选择单元

3、生成DPK工程,改名为Dev.BPL,记得保存。DPK文件如果没有生成,请先带一个空白工程,然后再用向导生成DPK,即重复上面的步骤。生成DPK后,再移除原来的DPR工程。

4、有可能碰到重复的单元,已经在别的包被引用了,我们的原则是,只封装Dev的单元。

(Dev的单元名好区分,都是以cx或dx打头。)比如sysInit,在 contains 按 CTRL+Y删除即可。

5、编译会提示,我们新的Dev包,引用到其他单元,在不同的BPL里。选择View details可以查看引用到详细单元。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Delphi中的消息截获(六种方法:Hook,SubClass,Override WndProc,Message Handler,RTTI,Form1.WindowProc:=@myfun)good
《Mastering Delphi 6》学习笔记之四
DELPHI下自定义包的作用,开发以及包文件的安装配置位置
以Delphi Package架构的应用程序开发(转)
Delphi xe7 up1 调用android振动功能
Delphi XE2 之 FireMonkey 入门(34)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服