转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
Delphi 8 for .net 第一时间 之 分析篇         ★★★★

Delphi 8 for .net 第一时间 之 分析篇

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1385 更新时间:2009/4/23 18:36:42

Delphi 8 for .net 第一时间 之 分析篇

 

 

_________________________________________________________________________

   本文章只是作者这两天试用D8并对VCL.net源码稍微查看了一下,作出的一些分

   析判断,时间水平有限请见谅 cocoboy79#163.com  qq:364941)

 

   下文中:D7代表基于Win32版本的Delphi,D8代表Delphi 8 for .net 

__________________________________________________________________________

 

  一直在使用Delphi编程,也一直关注.net技术。又是时代变化的时候了,VCl.net对于我们来说是一个完美的.net解决方案么?还是用于过度的桥梁?,如果你和我一样使用Delphi,那么我们是时候思考一下如何利用现有的Delphi技能更快的搭上.net快车。下面是这两天稍使用了一下Delphi8而总结一点东西,共同分享,共同思考。

 

TList:
    我们都知道TList实际上是一个功能强大的地址列表,这种数据结构非常有用。对于一个在D7中的TList的实例来说,这个地址列表中每一个项目(Item)是一个Pointer类型,你可以像下面程序一样,把对象变量或是一个值类型的指针(比如一个指向Record型的指针变量)存放到里面,在需要时取出来,并可以进行运行期类型转换。
var
  myList:TList;
  myLab:TLabel;
  i:integer;
begin
   myList:=TList.Create;
   for i:=0 to 10 do
   begin
     myLab:=TLabel.Create(self);
     myLab.Parent:=Self;
     myLab.Caption:=''''这是第 ''''+IntToStr(i)+'''' 个'''';
     myList.Add(myLab);
   end;
   for i:=0 to myList.Count-1 do
   begin
     ShowMessage( TLabel(myList.Items[i]).Caption );
   end;
end;

   在.net中你也会找到与之相像的一个东西,它就是.net中的ArrayList(System.Collections.ArrayList),我在大概看了一下发现ArrayList可以说是
TList的一个增强,唯一不足的就是它不开放源码,我们没办法看到是如何实现的。而且我们会发现D8中的TList的实现也与ArrayList有关。 

  让我们来稍微看一下D7与D8中TList的源码的声明吧,(整个类声明请查看D7,8的TList源码,对于不开源的ArrayList就无能为力了)

 

这是D7中的TList的一些声明
FList: PPointerList;
property List: PPointerList read FList;
function Add(Item: Pointer): Integer;
function First: Pointer;
function Last: Pointer;

这是D8中的TList的一些声明
FList: System.Collections.ArrayList;
property List: System.Collections.ArrayList read FList;
function Add(Item: TObject): Integer;
function First: TObject;
function Last: TObject;

这是在D7是PpointerList的声明:
PPointerList = ^TPointerList;
TPointerList = array[0..MaxListSize - 1] of Pointer;
 
    看一下D7的TList,TList内部维护的Flist是一个PpointerList,实际上就是一个指向TpointerList的指针,(如最上面的程序,myList.Add(myLab)实际上就是往Flist中增加元素)TpointerList是一个静态的元素为无类型指针的数组。Pointer类型为无类型指针,这个在D7中的Pointer在D8的.net mangaged环境已经不能使用了,如果你在Vcl.net工程中声明一个Pointer变量,按f9会被告知: UnSafe pointer variables,parameters or consts only allowed in unsafe procedure 。所以上面D8的TList源码声明中的所有Pointer已经变成了Tobject,(注意这个TObject其实已经不是原先D7那个TObject了,它是:System.Object,这个等会再说。)。引用的一篇文章的一句话:Pointer -- There is a Pointer type, but in safe code Pointer is a reference to an object. You can''''t do pointer math on it.(
http://delphi.weblogs.com),在.net的managed环境中指针代表对象的引用。即然原先的Pointer已经不能用了,那么Flist:PpointerList也就不能成立,于是它在D8中被改成了FList: System.Collections.ArrayList,所有Pointer都成了Tobejct。那么ArrayList,请去看看.Net的MSDN,功能上完全可以充当一个指针数组,只不过它的元素由Pointer变成了Tobject类型。

   其实看完了想想上面这个问题也很简单,就是一个寻找替代品的问题,看看D8的TList各方法的源码基本都没有变。后来我又看了一个其它类的源码发现在VCL.net中有好多这种’替代情况’,当原先的Delphi语言元素在.net环境中不便于或不能使用时,总会有一个.net framework中的替代品。

 

TObject:


  打开D8中的 Borland.Delphi.System.pas只看一下上面几行
   type
  TObject = System.Object;
  TCustomAttribute = System.Attribute;
  Exception = System.Exception;
  TGUID = System.Guid;
   

  这与D7的TObject,Exception类的定义已经大不相同了,在D8中TObject就是.net的System.Object,另外那个Exception也一样。“.NET Framework 中的所有类均从 Object 派生,所以 Object 类中定义的每个方法可用于系统中的所有对象。派生类可以而且确实重写这些方法中的某些,其中包括:”-------来自MSDN,那么就很自然了,原先VCL的TObject的地位和作用与上面MSDN里对System.Object类描述一样,那VCL要移植到.net就必须照办,即TObject定义为System.Object,而对于子类来说,声明还是subclass=class(TObject) ,但实际上已经是System.Object了,底层处理完全由.net framework来进行。而且没有System.Object的源码我们也不知道它干了什么。

 

TComponent:

  新建一个VCL.net工程,然后在Form上放一个Tedit或是Tmemo按f9,你会发现在代码编辑器上面的uses里比以前多了一个System.ComponentModel,如下所示。

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, System.ComponentModel, Borland.Vcl.StdCtrls;
    这是为什么?也是很简单,打开Borland.Vcl.Classes.pas文件找到114行有如下声明:TComponent = System.ComponentModel.Component;好了。。和TObject一样我们现在的Tcomponet已经和原先那个完全不同了,只是具有相同的名字,而且你也不用操心Tcomponent怎么实现的了,因为System.ComponentModel.Component的源码是不公开的。类似的还有  TPersistent = System.MarshalByRefObject 等等。


  Windows.Pas

  我们看一下这个单元吧,里面有一些对Windows Api的直接声明和调用。打开Borland.Vcl.Windows.pas找到19871行,看看implementation下面的一些Api的
声明如下:

[DllImport(advapi32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = ''''AbortSystemShutdown'''')]

function AbortSystemShutdown; external;

[1] [2]  下一页


[C语言系列][C#防止反编译].NET 产品版权保护方案 (.NET源码加…  [互联动态].NETFramework3.0新特性介绍与问答翻译
[Web开发]asp.net代码空格显示为……点号的原因及解决办法  [Web开发]asp.net调用压缩软件对文件进行压缩与解压缩的代码
[Web开发]详细介绍asp.net获取日期时间的各种格式的函数  [Web开发]如何将JS文件编译到ASP.NET项目里的DLL文件中
[Web开发]asp.net加密口令的最简单方法  [Web开发]目前asp.net开发主流工具软件介绍
[Web开发]asp.net中的反射介绍  [Web开发]制作留言板不使用数据库之asp.net操作XML文件的代…
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台