网眼技术@cnblogs

-“十万个为什么”电脑学习网(http://www.why100000.com)

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  17 随笔 :: 13 文章 :: 14 评论 :: 0 Trackbacks

2008年2月21日 #

互联网时代还要不要读报纸杂志、看电视?

    互联网进入中国已经有十几个年头了,如今我们似乎已经离不开它了:新闻、天气预报、最新电影、学习资料,甚至订餐都可以在网络上完成。
    而由于互联网的压迫,如今的纸介媒体已经在大量萎缩,甚至电视也已经开始萎缩,而广播业早就受电视打压而衰落了。
    那么,互联网时代我们还有必要看报纸、杂志、电视吗?
    我个人认为,在很长的一个时期内,我们还离不开这些传统的信息传播工具。
    首先是习惯问题。习惯的力量是巨大的,多年养成的读书看报看电视的习惯很难一时半会改变。特别是对于年龄在 40 岁以上的受众,互联网对于他们还是个比较陌生的东西。
    其次有经济条件的限制。现在家庭买一台电脑将近 4000 元,每年的上网费加上电费 1000 多元,这对于农民和工薪阶层的家庭来说,仍然是一笔不菲的支出。普通电视机相对于电脑和网络硬件来说,要便宜得多,而且不用支付内容的费用。
    受知识文化和观念的影响。现在的电脑,技术门槛其实还是很高的,大部分年龄比较大的老人连电视的遥控器都有点怵,更别说 100 多个键的键盘了,而且那么多字母他们也未必认识。互联网对这些人也不是必不可少的必需品。
    即使对于已经进入互联网生活的人,也有必要读书、看报纸、看电视。现在的互联网,信息量大是它的优势,同时也正是它的劣势。信息过剩和垃圾信息盛行,使人们不能及时、准确获取真正有价值的信息。还有互联网信息处理的随意性,导致信息的可信度下降,文字质量粗劣,文章鱼龙混杂,精品成了很难见到的奢侈品。经常阅读互联网文章,会导致文字水平降低。
    互联网上由于互动性强,各种信息流通快,难免众说纷纭,真假难辨,莫衷一是。有些错误信息会误导人们,特别是低龄人群的思想,对他们形成正确的人生观很不利。
    互联网的缺陷还有很多。而这些缺陷正好是传统媒体的优点。传统媒体虽然及时性和互动性差,信息量小,但是由于编辑、记者等参与信息的过滤、提炼、浓缩等制造过程,信息的质量、可信度、准确性、可靠性、可用性能得到很大程度的保障。
    互联网还是一个新兴的媒体和产业,大量的东西需要不断完善,随着技术进步和人们认识的提高,它的缺点定会得到改善。但是在目前阶段,传统媒体和互联网我们都不能放弃。

    张庆(网眼) http://blog.why100000.com
    2008-2-22

posted @ 2008-02-21 05:27 张庆 阅读(89) | 评论 (2)编辑

2007年10月25日 #

    Word2007 的文档格式与 Word97~2003 的二进制文档格式有根本的不同。Office 2007 的推出,全面启用了 OPENXML 概念。Word、Excel、PowerPoint 文档已经默认保存为压缩的 XML 格式,所以其大小也大大减小了。

    基于以上知识,我们现在已经完全可以在某种程度上对 Word2007 文档进行自行的编辑了。

    比如,如果我们的 Word2007 文档里有大量的图片需要另外保存为单独的文件,我们不用通过使用图形编辑进行复制-粘贴来完成,我们只要把这个 Word2007 文件的扩展名改为 zip 或 rar,然后用 Winrar 解压,那么我们所有的图片已经作为文件,存在于 word\media 这个文件夹下了,我们直接就可以使用了。其实 Word 文件中能包含的所有媒体文档都会解压到这里。

    还有一个技巧,如果我们要把 Word2007 文档里的某些图片换成别的图片,我们只要用 Windows 资源管理器打开该 Word2007文件(把文件扩展名先换成 zip,再在右键菜单里点“资源管理器”),把里边的图片文件换成我们自己的,再把文件名换成 docx 即可。注意用 Winrar 解压改名为 zip 后的 docx 文件,再压缩成 zip 格式,会破坏 docx 文件的格式。

    --“十万个为什么”电脑学习网-http://www.why100000.com
    原创文章,转载请注明出处
     张庆(网眼)2007-10-25

posted @ 2007-10-25 03:06 张庆 阅读(275) | 评论 (0)编辑

2007年10月23日 #

        用递归方法,使用 xml 文档生成 Treeview 树形视图。由于是动态生成,所以可以通过修改 xml 的逻辑来定制 Treeview 的结构,
从而实现了 xml 对 Treeview 的动态配置,而不用修改代码。

    xml 文件如下:
    <?xml version="1.0" encoding="gb2312"?>
    <root topic="频道列表" catalog="none">

      <channel topic="操作系统" catalog="none">
        <channel topic="Windows频道" catalog="windows" />
        <channel topic="DOS频道" catalog="dos" />
        <channel topic="Linux" catalog="linux" />
      </channel>

      <channel topic="菜鸟专区" catalog="cainiaozhuanqu" />

      <channel topic="应用软件" catalog="app" />

      <channel topic="安全专区" catalog="safe" />

      <channel topic="代码实验室" catalog="lab" />

      <BBS topic="电脑学习社区" catalog="none">
        <subBBS topic="子社区-1" catalog="sub1" />
        <subBBS topic="子社区-2" catalog="sub2" />
      </BBS>

    </root>

    程序代码如下:

    unit tree_xml;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
      Forms, Dialogs, ComCtrls, StdCtrls, XMLDoc, XMLIntf;

      type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        Memo1: TMemo;
        Button1: TButton;
        procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
                       Shift: TShiftState; X, Y: Integer);
        procedure Button1Click(Sender: TObject);
      private
        function CreateTreeview(XmlNode: IXMLNode; TreeNode: TTreeNode):TTreeNode;
        { Private declarations }
      public
        { Public declarations }
      end;

      type
        pRec = ^TData;
        TData = record
          sCatalog: string;
          sReserved: String
      end;

    var
      Form1: TForm1;

    implementation
    {$R *.dfm}

    function TForm1.CreateTreeview(XmlNode: IXMLNode; TreeNode: TTreeNode): TTreeNode;
    var
      i: integer;
      ParentTreeNode, CurrentTreeNode: TTreeNode;
      pData: pRec;
    begin
      New(pData);
      pData^.sCatalog := XmlNode.AttributeNodes['catalog'].NodeValue;
      CurrentTreeNode := TreeView1.Items.AddChildObject(TreeNode,
                   XmlNode.AttributeNodes['topic'].NodeValue, pData); //pointer(...)
      if XmlNode.HasChildNodes then
      begin
        ParentTreeNode := CurrentTreeNode;
        for i:=0 to XmlNode.ChildNodes.Count-1 do
        begin
          CreateTreeview(XmlNode.ChildNodes[i], ParentTreeNode);
        end;
      end;
      result := CurrentTreeNode;
    end;

    {------------------------------------------------------------------}
    procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var pData: pRec;
    begin
      pData := Treeview1.Selected.Data;
      Memo1.Lines.Add(pData^.sCatalog);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
      oXml: TXMLDocument;
    begin
      oXml := TXMLDocument.Create(self);
      oXml.FileName := '_Treeview.xml';
      oXml.Active:=true;
      CreateTreeview(oXml.ChildNodes.FindNode('root'), Treeview1.Items.GetFirstNode);
      Treeview1.FullExpand; //节点全部展开
      oXml.Free;
    end;

    end.

    注意程序中 Treeview 的 TreeView1.Items.AddChildObject 方法,其最后一个参数用来保存该节点的相关数据,是一个指针类型的数据,使用时要格外小心。本例中,先定义一个记录类型,再定义一个指针指向它,然后作为 AddChildObject 的最后一个参数。记录类型可以保存节点的很多相关参数,本例中只用到了一个,实际使用时可以任意扩充。

    ---“十万个为什么”电脑学习网-http://www.why100000.com-原创文章
     张庆(网眼)2007-10-22

posted @ 2007-10-23 00:04 张庆 阅读(207) | 评论 (0)编辑

2007年10月20日 #

1,页面自动适应屏幕分辨率
以下脚本以客户端屏幕分辨率1024为基准,对屏幕分辨率小于1024的客户端的页面,进行了宽度和样式表的调整,
使页面具有了部分“智能化”,提高了用户界面的友好度。

<script>
var ad_tl_width=930;
var ad_tl_height=80;
var ad_full_height=300;
var screenwidth=1024;
if(screen.width < screenwidth)
{
  ad_tl_width=760;
  ad_tl_height=80;
  ad_full_height=245;
  document.write ('<style type="text/css">.ch_right{display="none";}</style>');
  document.write ('<style type="text/css">.linktable{width: 760px;;}</style>');
}
else
{
  document.write ('<style type="text/css">.linktable{width: 930px;}</style>');
}
</script>

2,定制调用 Flash 函数
调用 Flash 动画在网页编程中是经常用到的。你是不是每调用一个 swf 文件都写一长串差不多重复的代码呢?
问题还在于,如果 flash 组件本版升级了,你是不是还要把每段代码都打开修改那个冗长的classid="…………"

呢?
    其实,只要写一个 javascript 函数,在调用 flash 动画文件的时候,写几行代码就可以了。
函数如下:
<script>
function ad_flash(u,w,h)
{
document.write ("<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'

codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0'

width="+w+" height="+h+"><param name='movie' value="+u+"><param name='quality' value='high'><param

name='wmode' value='opaque'><embed src="+u+" quality='high'

pluginspage='http://www.macromedia.com/go/getflashplayer' type='application/x-shockwave-flash' 

param name='wmode' value='opaque' width="+w+" height="+h+"></embed></object>");
}
</script>
调用示例:
<script>ad_flash("why100000.com.swf",768,80);</script>

3,定制调用图片函数
和以上定制调用 Flash 函数类似,只要传递连接、图片文件路径,图片的宽度、高度,就可以定义一个图片连接

,同样避免了大段的重复代码。
函数如下:
<script>
function ad_pic(a,s,w,h)
{
  document.write ("<a href="+a+ " target=_blank><img src="+s+" border=0 width="+w+"

height="+h+"></a>");
}
</script>
调用示例:
<script>ad_pic

("http://www.why100000.com","http://www.why100000.com/images/why100000.com.gif",768,80);</script>

---“十万个为什么”电脑学习网-http://www.why100000.com-原创文章
     张庆(网眼)2007-10-20

posted @ 2007-10-20 20:47 张庆 阅读(350) | 评论 (0)编辑

        XML 文档的节点是标准的树形结构,可以通过递归或者回溯算法来遍历所有的节点。
    本例使用递归算法为例,制作了2个遍历 XML 文档的例子。
    第一个例子,给出一个 XML 节点,遍历所有子节点-不包括起始节点。
    第二个例子,给出一个 XML 节点,遍历所给的节点及其下属的所有子节点。
    以上2个示例均列举出了 XML 文档的标签属性和文本值,是比较完整的示例代码。

    <?xml version="1.0" encoding="gb2312"?>
    <root website="http://www.why100000.com">
      <channel id="1" tagname="channel">
        <topic id="1-1" tagname="topic">Windows频道</topic>
        <Url id="1-2" tagname="Url">www.why100000.com/_windows</Url>
      </channel>
      <channel id="2" tagname="channel">
        <topic id="2-1" tagname="topic">代码实验室</topic>
        <subWeb id="2-2" tagname="subWeb">http://lab.why100000.com</subWeb>
      </channel>
      <BBS id="03" tagname="BBS">
        <topic id="03-1" tagname="topic">电脑学习社区</topic>
        <subWeb id="03-2" tagname="subWeb">http://bbs.why100000.com</subWeb>
        <subBBS id="03-3">
          <subBBStopic id="03-3-1">菜鸟学院</subBBStopic>
          <subBBStopic id="03-3-2">问吧</subBBStopic>
          <subBBStopic id="03-3-3">学吧</subBBStopic>
          <subBBStopic id="03-3-4">回吧</subBBStopic>
          <subBBStopic id="03-3-5"></subBBStopic>
          <subBBStopic></subBBStopic>
        </subBBS>
      </BBS>
      <AnatherTag note="testTag-1"/>
      <AnatherTag/>
    </root>
    {----------------------------------------------------------------------}
    function TForm1.GetXmlTree1(nNode: IXMLNode): string;
    var
      i, j: integer;
    begin
      for i:=0 to nNode.ChildNodes.Count-1 do
      begin
        s := s + '<' + nNode.ChildNodes.Nodes[i].NodeName;
        for j:=0 to nNode.ChildNodes[i].AttributeNodes.Count-1 do
        begin
          s := s + ' '+ nNode.ChildNodes[i].AttributeNodes[j].NodeName;
          s := s + '="'+ nNode.ChildNodes[i].AttributeNodes[j].NodeValue +'"';
        end;
        s := s + '>';
        if nNode.ChildNodes.Nodes[i].IsTextElement then
          s := s + nNode.ChildNodes.Nodes[i].Text;
        if nNode.HasChildNodes and not nNode.ChildNodes.Nodes[i].IsTextElement then
        begin
          s := s +  #13 + #10;
          GetXmlTree1(nNode.ChildNodes.Nodes[i]);
        end;
        s := s + '</'+ nNode.ChildNodes.Nodes[i].NodeName +'>' + #13 + #10;
      end;
      result := s;
    end;
    {----------------------------------------------------------------------}
    function TForm1.GetXmlTree2(nNode: IXMLNode): string;
    var
      i, j: integer;
    begin
      s := s + '<' + nNode.NodeName;
      for j:=0 to nNode.AttributeNodes.Count-1 do
      begin
        s := s + ' '+ nNode.AttributeNodes[j].NodeName;
        s := s + '="'+ nNode.AttributeNodes[j].NodeValue +'"';
      end;
      s := s + '>';
      if nNode.IsTextElement then
        s := s + nNode.Text
      else
      begin
        s := s + #13 + #10;
        if nNode.HasChildNodes then
          for i:=0 to nNode.ChildNodes.Count-1 do
          begin
            GetXmlTree2(nNode.ChildNodes.Nodes[i]);
          end;
      end;
      s := s + '</' + nNode.NodeName + '>'+ #13 + #10;
      result := s;
    end;
    {----------------------------------------------------------------------}
    调用:

    procedure TForm1.Button4Click(Sender: TObject);
    var
      oXml: TXMLDocument;
    begin
      oXml := TXMLDocument.Create(self);
      oXml.FileName := '_Treeview.xml';
      oXml.Active:=true;
      s :='';
      s := GetXmlTree1(oXml.ChildNodes.FindNode('root'));
      Memo1.Lines.Add(s);
      oXml.Free;
    end;

    procedure TForm1.Button5Click(Sender: TObject);
    var
      oXml: TXMLDocument;
    begin
      oXml := TXMLDocument.Create(self);
      oXml.FileName := '_Treeview.xml';
      oXml.Active:=true;
      s :='';
      s := GetXmlTree2(oXml.ChildNodes.FindNode('root'));
      Memo1.Lines.Add(s);
      oXml.Free;
    end;

   “十万个为什么”电脑学习网原创文档
    转载请注明出处:http://www.why100000.com

posted @ 2007-10-20 08:13 张庆 阅读(333) | 评论 (0)编辑

2007年10月18日 #

    CollBar 类似于 IE 菜单条、工具条的功能。

    拖放一个 CoolBar 控件,建立 Band 带条。

    拖放 ToolBar 控件,会自动停靠在 CoolBar 中,但是不在 Band 里。

    拖放 Menu 控件,建立菜单项(Item)。把 Menu 控件的 AutoMerge 属性设置为 True。AutoMerge 设置为 True 表示菜单即将和 ToolBar 自动合并在一起,就不会在窗口顶部同时显示 2 个菜单条了。真正的菜单条会自动隐藏起来,发挥作用的是 ToolBar 上的菜单条。

    设置 ToolBar 的 Menu 属性为以上建立的 Menu 控件。这就把 Menu 控件和 ToolBar 联系了起来。这时会在 ToolBar 里显示菜单条。

    设置 CoolBar 中 Bandx 的 Control 属性为 ToolBar,就把 ToolBar 装入到 CoolBar 的 Bandx 中。

    配置完毕后,CoolBar 里的各个 Band 可以用鼠标拖动移动位置,显示了其灵活性。

    “十万个为什么”电脑学习网原创文档
    转载请注明出处:http://www.why100000.com

posted @ 2007-10-18 20:25 张庆 阅读(224) | 评论 (0)编辑

    在编写数据库系统的时候,少不了使用 ADODataSet 这个组件。在表不多的情况下,我们可以为每个表建立一个 ADODataSet,
然后通过 DBGrid 等数据显示组件来操作她。

    但是,如果表的数量很多,比如多达几十个表的时候,特别是表的数量动态变化的时候,我们就不太适合为每个表建立对应的 ADODataSet 了。

    这时,通过 ADODataSet 的复用,可以使问题大大简化,减少大量的笨拙的代码,使程序清晰而优美。甚至使一些无法编程的问题得到完美解决。

    具体做法:只在窗体上拖放一个 ADODataSet 组件,然后在连接不同的表的事件中,使用以下类似代码即可:

    ADODataSet1.Close;
    ADODataSet1.CommandText := 'Select * from <不同的表名>';
    ADODataSet1.Parameters.Clear;
    ADODataSet1.Parameters.ParseSQL(ADODataSet.CommandText, true);
    ADODataSet1.Open;

    以上代码中,语句 ADODataSet1.Parameters.ParseSQL(ADODataSet.CommandText, true) 是关键代码。通过 ParseSQL 方法解构 ADODataSet.CommandText 的 SQL 语句,建立 ADODataSet1 新的对象参数,从而使新的查询生效。

    附:Delphi 文档中对 ParseSQL 方法的描述:

    ParseSQL method (TParameters):

    Parses an SQL statement for parameters and TParameter objects.

    Delphi syntax:

    function ParseSQL(SQL: String; DoCreate: Boolean): String;

    Description

    Call ParseSQL to parse an SQL statement for parameters. For each parameter found in the SQL statement, a TParameter object is added to the calling TParameters object using the name of the parameter in the SQL statement.

    SQL contains the SQL statement to parse.

    DoCreate indicates whether to clear all existing parameter definitions before parsing the SQL statement.

    ParseSQL returns a parsed version of the SQL statement specified in the SQL parameter.

    ADOQuery1.Parameters.ParseSQL(ADOQuery1.Text, True);

    “十万个为什么”电脑学习网原创文档
    转载请注明出处:http://www.why100000.com

posted @ 2007-10-18 20:23 张庆 阅读(272) | 评论 (0)编辑

2007年10月8日 #

    一些网站为了防止文章内容被复制,使用了很多种方法来保护自己的版权。
    其实现在的网站技术,从来就没有什么能够阻止一个想要复制你内容的方法,还不如我们大度一些,在复制内容的过程中增加一个自己的版权信息好了。

    以下的方法是在复制网页内容的时候会在复制后的内容后面增加一段网站的版权信息,代码十分简单,你只要修改那段版权信息代码就可以自己用了!

    代码如下:

    <script language=javascript>
      document.body.oncopy=function()
      {
        event.returnValue = false;
        var txt1 = document.selection.createRange().text;
        var txt2 = "本文来自“十万个为什么”电脑学习网 http://www.why100000.com";
        clipboardData.setData('Text', '\r\n' + txt1 + '\r\n' + txt2);
      }
    </script>

posted @ 2007-10-08 01:36 张庆 阅读(79) | 评论 (0)编辑

2007年10月4日 #

      <form action="getval.asp">
      <input name=v1 value="mmm"><br>
      <input name=v2 value="mmm" disabled><br><br>

      <input type="radio" name="b1" value="true">是&nbsp;&nbsp;
      <input type="radio" name="b1" value="false" checked>否<br><br>

      <input type="radio" name="b2" value="true" disabled>是&nbsp;&nbsp;
      <input type="radio" name="b2" value="false" checked disabled>否<br><br>

      <select name="sel1" disabled>
       <option value="1">selest1
       <option value="2">selest2
       <option value="3">selest3
       <option value="4">selest4
      </select>
      <br><br>

      <input type=submit>
    </form>

    //getval.asp 的内容:
    <%
      response.write "v1=" & request("v1") & "<br>"
      response.write "v2=" & request("v2") & "<br>"

      response.write "b1=" & request("b1") & "<br>"
      response.write "b2=" & request("b2") & "<br>"

      response.write "sel1=" & request("sel1") & "<br>"
    %>
   
    测试结论:disabled 后,form 元素传输的值为空字符串。

  ---“十万个为什么”电脑学习网-http://www.why100000.com-原创文章
     张庆(网眼)2007-10-4

posted @ 2007-10-04 05:46 张庆 阅读(189) | 评论 (2)编辑

2007年9月20日 #

    事情从我最近做的一个小项目开始。
    因为要急着赶一个网络通信程序,我拿起了4年不用的 Delphi(号称 RAD 开发的老大啊),因为已经知道 Delphi 从 8.0 开始,Bug 不断,还因为 8.0 以后的 Delphi 实在已经难以找得到了,我自然选择了 7.0 版本。
    因为是网络通信程序,我选择了 Delphi 引入的原来是第三方的 Indy 控件组,听说功能很强大,还据说 Delphi 以后就把自己的那个 TCP 的 Client 和 Server 原生控件淘汰掉了,用 Indy 的相应控件代替。因为是初用,就到 Delphi 的C:\Program Files\Borland\Delphi7\Demos 下去找例子,居然就没有!
    没办法,到网上去搜。找到了 Demo 下载地址。还好,在例子中找到一个 TCP 的 Client-Server 的 Demo,然后编译、运行。马上就发现一个 Bug,这个演示程序的功能还不错,运行起来像个局域网内的 QQ,电脑间能够聊天。但是做这个 Demo 的老兄不知道当时在网络上实测过这个程序没有,反正我看到,所有的客户端连接到 Server 后,都被认为是一个“名字”,就是 Server 端机器的名字,而 Server 正是通过机器名来区分客户端的,因为名字相同,所以就不能发送消息了。其实严重的还在于,只要有一个客户端没有终止连接,那么 Server 端退出时就会报告线程终止时出错。--这简直成了一个具有世界影响的错误了,在网上搜索这个错误,达到一大片结果,各种奇形怪状的解决办法都有,但是感觉都不是正解。后来一个网友的回答说,升级到 Indy9.0.18 后问题解决了(D7本身带的版本是 9.0.10)。于是我决定把 Indy 升级一下。
    于是第二个麻烦又来了。因为曾经早已经领教过 Delphi 版本之间、VCL 组件之间版本不兼容的折磨,心里有阴影,所以我本来就比较害怕。于是就去 Indy 下了个号称自动安装的版本,而且为了保证 Bug 少一点,想装个 10.0 版本。这个是号称自动安装的版本其实不是 Indy 的公司做的,不知道是不是 Indy 公司的那个老总的亲戚近水得月,还是那个内鬼在洗钱呢?--扯回来--号称自动安装的组件包安装后,拖个 Indy 组件一编译,我靠,报错!说是组件没有那个属性!没有那个属性,组件怎么进入了组件面板了?
    再次上网去搜,说是 Delphi 的各个版本卸载 Indy 的方法都不太一样,由于 Delphi 安装程序的失误,卸载完毕,还在 Lib\Debug 下留下了一推 .dcu 文件,有的遗留文件还不止一处路径,连 Windows 的系统文件夹下都可能有--感觉有病毒的某种特征了。
    于是决定自己冒险实验一下(说是冒险,是担心把 Delphi 搞瘫,又要花费半天功夫收拾系统了。还有,Delphi安装到半路上出问题,很难再次直接安装的)。
    运行 Delphi7 文件夹下的 Borland Delphi 7.msi 文件,选修改(Modify),把 Indy 选掉,继续,结束。再把 Lib\Debug 下以Id 开头的文件删除(先备份一下)。然后,再运行 Delphi7.0 好了!
    Delphi7.0 是好了,但是问题又来了,由于原来我下载的那个示例程序是对 Indy9.0 的,现在 Indy 升级了,原来的那个例子就不能运行了!怎么办呢?降级吧!……好在有了2个小时的经验,顺利的又装了一次 Indy9.0.18。

    为什么说“一个时代结束了,一个传奇结束了!”?在 .NET 和 Java 的夹击、打压下,也许还有 Borland 那些官僚的瞎指挥和资本的胁迫下,10 年前曾经辉煌的 Delphi 如今已经老态龙钟、漏洞百出了。我曾经购买的 Delphi2005 光盘,安装后编译自己带的 Demo 程序都过不去!四处出击,产品众多:C++、J++、C# 一堆 Builder,好像还出了个和 C 相关的东西。
    从 Borland 分拆后的 Codegear,照样在出新东西,Ruby on Rails 火了,就出了个它的 IDE。不知道有没有 Phthon 的相关东西?!
    没有精品,连 Delphi 也给搞得四不像了。
    虽然我承认我有“Delphi情节”,虽然现在的桌面开发 Delphi 照样是最 RAD 的。但是,用户流失、学习资料锐减(6年前书店里计算机语言最多的书可能是Delphi),在支持 Web 开发上的失误,都让 Delphi 走下坡路了。我知道,10 年后,Delphi 也许就像10 年前独步天下的 Borland C++ 一样消失了。但是,计算机史上,曾经有一群技术狂人、有一个公司、有一个精灵……回忆将会永远留在心里,挥之不去……

    电脑学习网:http://www.why100000.com
    张庆  2007.9.20

posted @ 2007-09-20 05:22 张庆 阅读(234) | 评论 (4)编辑