不想说啥's profile想说点啥的不想说啥PhotosBlogListsMore Tools Help

Blog


    May 08

    API函数快速入门

    一、在VB中声明API函数有两种方法:如果我们只在某个窗体中使用API函数,我们可以在窗体代码的General部分声明它:

      声明的语法是:
      Private Declare Function ...
      Private Declare Sub.....
      这里必须采用Private声明,因为这个API函数只能被一个窗体内的程序所调用。

      如果我们的程序有多个窗体构成,而且我们需要在多个窗体中使用同一个API函数,就需要在模块中声明了。
      先添加一个模块(如图示),
      然后采用如下语法声明:
      Public Declare Function....
      Public Declare Sub....
      Public声明的含义是把API函数作为一个公共函数或过程,在一个工程中的任何位置(包括所有的窗体和模块)都能直接调用它。 声明完毕我们就能在程序中使用此API函数了。

      二、可采用以下几种方式使用API函数,以SetWindowPos函数为例:
      (1)忽略函数返回值的调用:
        SetWindowPos Form1.hWnd, -2 ,0 ,0 ,0, 0, 3
      注意此时函数的参数是不加括号的。
      (2)Call方法调用:
        Call SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)
      注意这里需要加上括号,但我们不取回函数的返回值。
      (3)取得函数返回值的调用:
        MyLng = SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)
      此时需要加上括号,而且我们必须事先定义一个变量(变量的类型与函数返回值类型相同)来存储API函数的返回值。

      三、几个问题的说明:

      (1)声明中的Lib 和 Alias 是怎么回事
      一般情况下WIN32API函数总是包含在WINDOWS系统自带的或是其它公司提供的动态连接库DLL中,而Declare语句中的Lib关键字就用来指定DLL(动态连接库)文件的路径,这样VB才能找到这个DLL文件,然后才能使用其中的API函数。如果我们只是列出DLL文件名而不指出其完整的路径的话,VB会自动到.EXE文件所在目录、当前工作目录、WINDOWS\SYSTEM目录、WINDOWS目录下搜寻这个DLL文件。所以如果所要使用DLL文件不在上述几个目录下的话,我们应该指明其完整路径。
      Alias用于指定API函数的别名,如果我们调用的API函数要使用字符串(参数中包含String型)的话,Alias关键字是必须的。这是因为在ANSI和Unicode字符集中同一API函数的名称可能是不一样的,为了保证不出现声明错误,我们使用Alias关键字指出API函数的别名,一般来说在WIN9X平台下我们把API函数名后加一个大写A作为别名即可。

      (2)常见的API参数类型的说明
      API函数的参数中最常见的是长整Long型数据类型,例如API中的句柄、一些特定的常量、函数的返回值都是此类型 的值;另外几种常见的参数类型有:整型Integer、Byte型、String型等。

      (3)声明中的ByVal是作什么用的
      这跟VB的参数传递方式有关,在默认情况下VB是通过地址传递方式传递函数的参数、而有些API函数要求必须采用传值方式来传递函数参数(这两种参数传递方式是不同的,前者传递的是一个指针,而后者要求是参数真实的值)。这样就会发生错误,解决的办法是在API函数参数声明的前面加上ByVal关键字,这样VB就采用传值方式传递参数了。

      (4)怎样得到完整的API函数声明
      VB自带了API文本查看器API TEXT VIEWER,我们可以在其中找到API函数的完整声明,然后把它粘贴到程序中即可。

    如何编写高质量的VB代码

        如何通过一些技术手段来提高VB代码的执行效率。这些手段可以分为两个大的部分:编码技术和编译优化技术。在编码技术中介绍了如何通过使用高效的数据类型、减少外部引用等编程手段来提高代码执行速度,减少代码消耗的系统资源。在编译优化技术中介绍了如何正确地利用VB提供的编译选项对在编译时最后生成的可执行文件进行优化。
    什么是一个高效的软件?一个高效的软件不仅应该比实现同样功能的软件运行得更快,还应该消耗更少的系统资源。这篇文章汇集了作者在使用VB进行软件开发时积累下来的一些经验,通过一些简单的例子来向你展示如何写出高效的VB代码。其中包含了一些可能对VB程序员非常有帮助的技术。在开始之前,先让我陈清几个概念。

      让代码一次成型:在我接触到的程序员中,有很多人喜欢先根据功能需求把代码写出来,然后在此基础上优化代码。最后发现为了达到优化的目的,他们不得不把代码再重新写一遍。所以我建议你在编写代码之前就需要考虑优化问题。

      把握好优化的结果和需要花费的工作之间的关系:通常当完成了一段代码,你需要检查和修改它。在检查代码的过程中,也许你会发现某些循环中的代码效率还可以得到进一步的改进。在这种情况下,很多追求完美的程序员也许会立马修改代码。我的建议是,如果修改这段代码会使程序的运行时间缩短一秒,你可以修改它。如果只能带来10毫秒的性能改进,则不做任何改动。这是因为重写一段代码必定会引入新的错误,而调试新的代码必定会花掉你一定的时间。程序员应该在软件性能和开发软件需要的工作量之间找一个平衡点,而且10毫秒对于用户来说也是一个不能体会到的差异。

      在需要使用面向对象方法的时候尽量使用它;VB提供的机制不完全支持面向对象的设计和编码,但是VB提供了简单的类。大多数人认为使用对象将导致代码的效率降低。对于这一点我个人有些不同的意见;考察代码的效率不能纯粹从运行速度的角度出发,软件占用的资源也是需要考虑的因素之一。使用类可以帮助你在整体上提升软件的性能,这一点我会在后面的例子中详细说明。

      当你编写VB代码的时候,希望你能把上面几点作为指导你编码的原则。我把文章分为两个部分:如何提高代码的运行速度和编译优化。

      如何提高代码的运行速度

      下面的这些方法可以帮助你提高代码的运行速度:

      1. 使用整数(Integer)和长整数(Long)

      提高代码运行速度最简单的方法莫过于使用正确的数据类型了。也许你不相信,但是正确地选择数据类型可以大幅度提升代码的性能。在大多数情况下,程序员可以将Single,Double和Currency类型的变量替换为Integer或Long类型的变量,因为VB处理Integer和Long的能力远远高于处理其它几种数据类型。

      在大多数情况下,程序员选择使用Single或Double的原因是因为它们能够保存小数。但是小数也可以保存在Integer类型的变量中。例如程序中约定有三位小数,那么只需要将保存在Integer变量中的数值除以1000就可以得到结果。根据我的经验,使用Integer和Long替代Single,Double和Currency后,代码的运行速度可以提高将近10倍。

      2. 避免使用变体

      对于一个VB程序员来说,这是再明显不过的事情了。变体类型的变量需要16个字节的空间来保存数据,而一个整数(Integer)只需要2个字节。通常使用变体类型的目的是为了减少设计的工作量和代码量,也有的程序员图个省事而使用它。但是如果一个软件经过了严格设计和按照规范编码的话,完全可以避免使用变体类型。

      在这里顺带提一句,对于Object对象也存在同样的问题。请看下面的代码:

    Dim FSO
    Set FSO = New Scripting.FileSystemObject

      或

    Dim FSO as object
    Set FSO = New Scripting.FileSystemObject

      上面的代码由于在申明的时候没有指定数据类型,在赋值时将浪费内存和CPU时间。正确的代码应该象下面这样:

    Dim FSO as New FileSystemObject
    3. 尽量避免使用属性

      在平时的代码中,最常见的比较低效的代码就是在可以使用变量的情况下,反复使用属性(Property),尤其是在循环中。要知道存取变量的速度是存取属性的速度的20倍左右。下面这段代码是很多程序员在程序中会使用到的:

    Dim intCon as Integer
    For intCon = 0 to Ubound(SomVar())
    Text1.Text = Text1.Text & vbcrlf & SomeVar(intCon)
    Next intCon

      下面这段代码的执行速度是上面代码的20倍。

    Dim intCon as Integer
    Dim sOutput as String
    For intCon = 0 to Ubound(SomeVar())
    sOutput = sOutput & vbCrlf &
    SomeVar(intCon)
    Next
    Text1.Text = sOutput

      4. 尽量使用数组,避免使用集合

      除非你必须使用集合(Collection),否则你应该尽量使用数组。据测试,数组的存取速度可以达到集合的100倍。这个数字听起来有点骇人听闻,但是如果你考虑到集合是一个对象,你就会明白为什么差异会这么大。

      5. 展开小的循环体

      在编码的时候,有可能遇到这种情况:一个循环体只会循环2到3次,而且循环体由几行代码组成。在这种情况下,你可以把循环展开。原因是循环会占用额外的CPU时间。但是如果循环比较复杂,你就没有必要这样做了。

      6. 避免使用很短的函数

      和使用小的循环体相同,调用只有几行代码的函数也是不经济的--调用函数所花费的时间或许比执行函数中的代码需要更长的时间。在这种情况下,你可以把函数中的代码拷贝到原来调用函数的地方。

      7. 减少对子对象的引用

      在VB中,通过使用.来实现对象的引用。例如:

    Form1.Text1.Text

      在上面的例子中,程序引用了两个对象:Form1和Text1。利用这种方法引用效率很低。但遗憾的是,没有办法可以避免它。程序员唯一可以做就是使用With或者将用另一个对象保存子对象(Text1)。

    使用With
    With frmMain.Text1
    .Text = Learn VB
    .Alignment = 0
    .Tag = Its my life
    .BackColor = vbBlack
    .ForeColor = vbWhite
    End With

      或者

    使用另一个对象保存子对象
    Dim txtTextBox as TextBox
    Set txtTextBox = frmMain.Text1
    TxtTextBox.Text = Learn VB
    TxtTextBox.Alignment = 0
    TxtTextBox.Tag = Its my life
    TxtTextBox.BackColor = vbBlack
    TxtTextBox.ForeColor = vbWhite

      注意,上面提到的方法只适用于需要对一个对象的子对象进行操作的时候,下面这段代码是不正确的:

    With Text1
    .Text = Learn VB
    .Alignment = 0
    .Tag = Its my life
    .BackColor = vbBlack
    .ForeColor = vbWhite
    End With

      很不幸的是,我们常常可以在实际的代码中发现类似于上面的代码。这样做只会使代码的执行速度更慢。原因是With块编译后会形成一个分枝,会增加了额外的处理工作。

      8. 检查字符串是否为空

      大多数程序员在检查字符串是否为空时会使用下面的方法:

    If Text1.Text = then
    执行操作
    End if

      很不幸,进行字符串比较需要的处理量甚至比读取属性还要大。因此我建议大家使用下面的方法:

    If Len(Text1.Text) = 0 then
    执行操作
    End if

      9. 去除Next关键字后的变量名

      在Next关键字后加上变量名会导致代码的效率下降。我也不知道为什么会这样,只是一个经验而已。不过我想很少有程序员会这样画蛇添足,毕竟大多数程序员都是惜字如金的人。

    错误的代码
    For iCount = 1 to 10
    执行操作
    Next iCount
    正确的代码
    For iCount = 1 to 10
    执行操作
    Next

      10. 使用数组,而不是多个变量

      当你有多个保存类似数据的变量时,可以考虑将他们用一个数组代替。在VB中,数组是最高效的数据结构之一。

      11. 使用动态数组,而不是静态数组

      使用动态数组对代码的执行速度不会产生太大的影响,但是在某些情况下可以节约大量的资源。

      12. 销毁对象

      无论编写的是什么软件,程序员都需要考虑在用户决定终止软件运行后释放软件占用的内存空间。但遗憾的是很多程序员对这一点好像并不是很在意。正确的做法是在退出程序前需要销毁程序中使用的对象。例如:

    Dim FSO as New FileSystemObject
    执行操作
    销毁对象
    Set FSO = Nothing
    对于窗体,可以进行卸载:
    Unload frmMain

      或

    Set frmMain = Nothing

      13. 变长和定长字符串

      从技术上来说,与变长字符串相比,定长字符串需要较少的处理时间和空间。但是定长字符串的缺点在于在很多情况下,你都需要调用Trim函数以去除字符串末的空字符,这样反而会降低代码效率。所以除非是字符串的长度不会变化,否则还是使用变长字符串。

      14. 使用类模块,而不是ActiveX控件

      除非ActiveX控件涉及到用户界面,否则尽量使用轻量的对象,例如类。这两者之间的效率有很大差异。

      15. 使用内部对象

      在涉及到使用ActiveX控件和DLL的时候,很多程序员喜欢将它们编译好,然后再加入工程中。我建议你最好不要这样做,因为从VB连接到一个外部对象需要耗费大量的CPU处理能力。每当你调用方法或存取属性的时候,都会浪费大量的系统资源。如果你有ActiveX控件或DLL的源代码,将它们作为工程的私有对象。

      16. 减少模块的数量

      有些人喜欢将通用的函数保存在模块中,对于这一点我表示赞同。但是在一个模块中只写上二三十行代码就有些可笑了。如果你不是非常需要模块,尽量不要使用它。这样做的原因是因为只有在模块中的函数或变量被调用时,VB才将模块加载到内存中;当VB应用程序退出时,才会从内存中卸载这些模块。如果代码中只有一个模块,VB就只会进行一次加载操作,这样代码的效率就得到了提高;反之如果代码中有多个模块,VB会进行多次加载操作,代码的效率会降低。

      17. 使用对象数组

      当设计用户界面时,对于同样类型的控件,程序员应该尽量使用对象数组。你可以做一个实验:在窗口上添加100个PictureBox,每个PictureBox都有不同的名称,运行程序。然后创建一个新的工程,同样在窗口上添加100个PictureBox,不过这一次使用对象数组,运行程序,你可以注意到两个程序加载时间上的差别。

      18. 使用Move方法

      在改变对象的位置时,有些程序员喜欢使用Width,Height,Top和Left属性。例如:

    Image1.Width = 100
    Image1.Height = 100
    Image1.Top = 0
    Image1.Left = 0

      实际上这样做效率很低,因为程序修改了四个属性,而且每次修改之后,窗口都会被重绘。正确的做法是使用Move方法:

    Image1.Move 0,0,100,100

      19. 减少图片的使用

      图片将占用大量内存,而且处理图片也需要占用很多CPU资源。在软件中,如果可能的话,可以考虑用背景色来替代图片--当然这只是从技术人员的角度出发看这个问题。

      20. 使用ActiveX DLL,而不是ActiveX控件

      如果你设计的ActiveX对象不涉及到用户界面,使用ActiveX DLL。
    编译优化

      我所见过的很多VB程序员从来没有使用过编译选项,也没有试图搞清楚各个选项之间的差别。下面让我们来看一下各个选项的具体含义。

      1. P-代码(伪代码)和本机代码

      你可以选择将软件编译为P-代码或是本机代码。缺省选项是本机代码。那什么是P-代码和本机代码呢?
    P-代码:当在VB中执行代码时,VB首先是将代码编译为P-代码,然后再解释执行编译好的P-代码。在编译环境下,使用这种代码要比本机代码快。选择P-代码后,编译时VB将伪代码放入一个EXE文件中。

      本机代码:本机代码是VB6以后才推出的选项。当编译为EXE文件后,本机代码的执行速度比P-代码快。选择本机代码后,编译时VB使用机器指令生成EXE文件。

      在使用本机代码进行编译时,我发现有时候会引入一些莫名其妙的错误。在编译环境中我的代码完全正确地被执行了,但是用本机代码选项生成的EXE文件却不能正确执行。通常这种情况是在卸载窗口或弹出打印窗口时发生的。我通过在代码中加入DoEvent语句解决了这个问题。当然出现这种情况的几率非常少,也许有些VB程序员从来没有遇到过,但是它的确存在。

      在本机代码中还有几个选项:

      a) 代码速度优化:该选项可以编译出速度较快的执行文件,但执行文件比较大。推荐使用

      b) 代码大小优化:该选项可以编译出比较小的执行文件,但是以牺牲速度为代价的,不推荐使用。

      c) 无优化:该选项只是将P-代码转化为本机代码,没有做任何优化。在调试代码时可以使用。

      d) 针对Pentium Pro优化:虽然该项不是本机代码中的缺省选项,但是我通常会使用该选项。该选项编译出的可执行程序在Pentium Pro和Pentium 2以上的机器上可以运行得更快,而在比较老的机器上要稍稍慢一些。考虑到现在用Pentium 2都是落伍,所以推荐大家使用该选项。

      e) 产生符号化调试信息:该项在编译过程中生成一些调试信息,使用户可以利用Visual C++一类的工具来调试编译好的代码。使用该选项会生成一个.pdf文件,该文件记录了可执行文件中的标志信息。当程序拥有API函数或DLL调用时,该选项还是比较有帮助的。

      2. 高级优化

      高级优化中的设置可以帮助你提高软件的速度,但是有时候也会引入一些错误,因此我建议大家尽量小心地使用它们。如果在代码中有比较大的循环体或者复杂的数学运算时,选中高级优化中的某些项会大幅度提升代码的性能。如果你使用了高级优化功能,我建议你严格测试编译好的文件。

      a) 假定无别名:可以提高循环体中代码的执行效率,但是在如果通过变量的引用改变变量值的情况下,例如调用一个方法,变量的引用作为方法的参数,在方法中改变了变量的值的话,就会引发错误。有可能只是返回的结果错误,也有可能是导致程序中断运行的严重错误。

      b) 取消数组绑定检查、取消整数溢出检查和取消浮点错误检查:在程序运行时,如果通过这些检查发现了错误,错误处理代码会处理这些错误。但是如果取消了这些检查,发生了错误程序就无法处理。只有当你确定你的代码中不会出现上面的这些错误时,你才可以使用这些选项。它们将使软件的性能得到很大的提升。

      c) 允许不舍入的浮点操作:选择该选项可以是编译出来的程序更快地处理浮点操作。它唯一的缺点就是在比较两个浮点数时可能会导致不正确的结果。

    一个VB过来人寄语VB初学者

    在学习了vb的基本知识后,就应该选定一个方向深入。windows api方面的书是肯定要看的,无论你向哪个方向发展,想要开发出强大的应用程序,都离不开api。如果对网络感兴趣,可以看看介绍stockt控件的书,再找找RFC的资料,个人感觉网络编程主要学协议。如果对数据库感兴趣,可以先从DAO学起,它可以让你对数据库基本操作有深入的了解。RDO可以跳过不学,直接从ADO开始,但这你需要比较熟练的sql语言知识。建议你可以看一本《sql编程起步》的书,人民邮电出版社出版的。它不仅介绍了sql语言,还结合了vb做为编程语言进行讲解,非常适合学习vb数据库编程。有了一定功底后,可以看看关于com方面的书,它会教会你怎样开发多线程程序,但这有点难。至于vb方面的图书,感觉上没有什么名著,不象c++有《Thanking in c++》、《The c++ program language》等名著,只有自己选择适合的。还有就是多看别人的源码,学习别人的思想。再就是多编程,从小项目开始,完成一些基本功能,再慢慢组合起来,做成大项目,这对你提高很快。

    (1)VB不只是数据库和报表。不要以为VB就是数据库和报表,这只是VB强大功能的一小部份。如果这些都搞不清,还是好好的看一下相关的书籍,比在这里问问题有用多了。我以前没有学过数据库,只是有些编程的思路,后来学数据库就非常容易了。我做报表一般用RichTextBox或是From来做,一般都能做的很好,也不用去考虑什么水晶报表了。

    (2)不要迷信于API。API能做很多东西,但有些东西在VB里面的函数中就有,API只是VB对WindowsSDK的封装而已。如果想学好API,建议学习SDK。如果VB本身就能很好的支持这个功能,何必还要用API呢。

    (3)不要什么都想着控件。如果做程序都想着第三方控件的话,代价是很高的,不仅程序大,安全性也低了很多。其实VB本身带的控件已经完全够用了。

    (4)认认真真的把MSDN中关于VB的内容好好看一看,特别是函数和语句,很有用的。

    (5)遇到问题不要直接来这里问,自己好好想一想,试着解决这个问题,这虽然在时间上慢了,可是在自身的提高上却有很大的帮助。

    (6)没事的时候,多研究些语言上的东西,如数据结构和算法,不要老是想着什么花哨的东西。这对以后的提高非常有帮助。

    (7)如果想精通VB,在VB的基础上,学学VC还是非常的帮助的。拿VC的东西对照VB来想一想。

    (8)有些很大的问题要自己动脑来想。如设计一整套软件,这是一个非常好的学习机会,不要让别人来帮你设计,只是让别人帮你提些建议。

    (9)学VB要付出代价的,没有不劳而获的。

    (10)祝初学者都能成功。

    VB之道

          引子 大师为一帮初学者讲解VB之道。 初学者问道:“VB很容易学习吗?” 大师答道:“是的。” 初学者问道:“VB的结构很简单吗?” 大师答道:“是的。” 初学者又问道:“VB程序很慢吗?” 大师轻轻咳嗽了一下:“呃,今天就讲到这里吧。” 内篇 1、 大师如是说:“人如果明确自己的位置,就可以避免不必要的烦恼;变量如果明确自己的类型,就可以避免不必要的错误。” 2、 大师去参观另一个高手的程序,对每一个变量和控件都仔细地请教别人。高手的弟子们在一旁议论:“谁说大师懂得VB之道呢?” 大师回答:“我这样做本身就符合VB之道。” 3、 大师如是说:“除非必要,不要使用非 Intel 处理器;除非必要,不要使用非整型变量。” 4、 一个单机编程者向大师请教如何使程序更小和更快。 大师回答:“有一种树,在地下的部分是地上部分的三倍,庞大的树根为树吸取养料;程序也应该利用这种根系。” 单机编程者问:“那么,怎样做到呢?” 大师回答:“利用32位抢先任务处理,将程序分解到许多个ActiveX部件中;使用远程自动化,让远程处理器承担多数进程。使你的程序完全没有事情可做,这就是VB的最高境界。” 单机编程者说:“这是我无法达到的呵!” 5、 大师如是说:“永远不要进行字符串复制。” 6、 大师和弟子们去自助餐,有经验的弟子直接奔向最喜欢的餐位,一般的弟子在按照餐位的标牌行动,而没有经验的弟子则兴奋得四处乱窜。 大师说:“对于文件输入输出操作,不也是这样吗:优秀的程序员使用二进制访问,一般的程序员使用文本访问方式,蹩脚的程序员使用随机访问方式。” 7、 大师如是说:“多次使用的签名应该做成印章;多次使用的操作应该编制宏;多次使用的属性应该放入变量。” 8、 两个程序员为应该采用集合还是数组争论不已。 其中一个程序员找到大师:“集合不好吗?我可以准确地定位其中任何一个成员。” 大师回答:“你是正确的。” 另一个程序员也找到大师:“数组不好吗?我可以对其进行顺序访问。” 大师回答:“你是正确的。” 前一个程序员听说了,和另一个程序员一起来找大师:“我们俩到底谁是对的?” 大师回答:“你们是正确的。” 两个程序员对别人说:“谁说大师有学问呢?” 外篇 1、 在大师手下学习的一个新手编制了一个大型程序,兴奋地请大师看。当程序启动之后,开始进行无法想象的复杂的初始化,整个系统为之凝滞,其间没有任何提示指出正在干什么,也没有任何措施允许用户取消该过程。令人尴尬的十几分钟过去后,程序界面终于出现在屏幕上--原来是记事本程序的加强版。 大师回过头去对大家说:“这就是所谓新手呵。” 2、 大师如是说:“吸引蜜蜂的果树绽开花朵;遭到袭击的乌贼放出烟幕;正在启动的程序显示Splash屏。自然界就是这样呵。” 3、 大师和弟子们观看魔术师演出,魔术师在表演后介绍魔术的秘诀:只有将物件预先藏在手中,然后转移观众的注意力,才能达到出其不意的效果。 一个弟子对大师说:“预先载入窗体,在需要时显示,从而加快显示,不也是同样的道理吗?” 大师说:“你明白VB之道了。” 4、 一个弟子找到大师:“您刚才讲解的程序还可以更快,”他用手指着屏幕上的窗体,“只要把AutoRedraw关闭就行了。” 大师说:“比我多想到一点,也是我的老师呵。” 5、 大师如是说:“为什么不使用标签呢?它所耗费的资源极少,你可以用隐藏的标签储存文本,你可以使用DragIcon存储图标……没有比标签更好的了!” 6、 大师注意到有一个弟子在上机时还开了一个BBS窗口,当大师走近时,他敏捷地使用VB窗口将其覆盖。大师于是将弟子们召集过来:“控制窗口的重显是很重要的,”大师最小化覆盖在上面的窗口,说道,“非常重要。” 7、 大师如是说:“汽车比自行车快,我仍然要使用自行车;Linux比Windows稳定,我仍然要使用Windows;Line比Pset方便,我仍然要使用Pset。” 8、大师如是说:“Image我所欲也,Picture亦我所欲也,二者不可得兼,舍Picture而取Image者也。” 杂篇 1、 一个弟子向大师倾诉程序编译中频繁的数据类型报错,问大师:“使程序永远没有数据类型错误,可能吗?” 大师回答:“可以做到。”于是将所有变量类型设置为Variant。 弟子运行程序,高兴地发现没有一处错误,但系统很快死机。 2、 大师如是说:“龟不活动,才能长寿;人没有欲望,才能保护自己;程序不吃内存,才能避免被删除。” 3、 大师的弟子微使用Unload卸载窗体,弟子壁使用赋予Nothing值的方法卸载。 大师看到了,对其他的弟子说:“贤能呵壁!更接近VB之道了。” 4、 大师如是说:“没有用的垃圾应该扔掉,没有用的代码应该删除。” 5、 大师问弟子:“有一个机会让你们用三个字说出最想要而总是得不到的东西,你们会要求什么?” 弟子贾说:“涨工资。” 弟子倚说:“放长假。” 弟子饼说:“内存条。” 大师微笑不语。 6、 大师如是说:“使用局部变量,不亦乐乎;删除动态数组,不亦乐乎;程序不会死机,不亦乐乎。” 7、 大师给弟子们讲了一个故事:“在一个公司里,有一个汇编高手,一个网络高手,还有一个VB程序员。项目经理为了考察属下的能力,交给每个人同样的任务。汇编高手从最不起眼的输入输出开始,花费了一个月的时间,打印出了足有一百页的程序清单;网络高手穷尽所有的平台,也花费了一个月的时间,制作了五十多个版本的应用程序;轮到VB程序员了,他在屏幕上画了一个窗体、一个按钮,写道:‘按下此按钮,运行他们的程序。’” 8、 一个弟子问大师:“我什么时候可以出师?” 大师回答:“到你的程序中注释是代码的十倍的时候。”

    May 07

    颓废的欲望街

         宁静的凌晨,麻木的敲击键盘,手中的香烟微微泛光,缕缕的烟圈漂浮在空气中......
      空气中弥漫着麻木和寂寞,围绕着我,令我窒息。
      又是一个不眠之夜,已经一个星期了,我想我快要崩溃了......
      其实今天晚上没有什么灵感,但就是想写点什么,或许只是想发泄心中的烦躁不安。本来就寂寞无语歇斯底里的我变得越加的莫名其妙。
      这样的夜里,没有车水马龙,没有繁华喧闹,似乎整个世界都平静了下来,浮躁仿佛不属于这里!
      喜欢一个人呆着,思考让我变得睿智!
      猛吸一口烟,两种神经刺激物开始在体内作祟,依然精神抖擞,身体却力不从心!
      被爱的感觉是什么样的呢?幸福吗?好想知道!
      重新点燃一只烟,看着窗外...... 明天是不是又是雨天呢?我喜欢下雨,它总是让我回想起从前!
      伤心的男人总喜欢沉浸在香烟和啤酒的麻醉下。也许是因为醉了以后可以在脑海中留出一片空白,好休息休息。香烟?或许只是想提起精神再多喝几瓶吧!
      人间的真理总是矛盾的,不同的人悟出不同的矛盾,但是却不足以推翻它,因为它确实是真理。真理总是上帝创造的,所以我总觉得不应该相信上帝。
      幸福?幸福的定义是什么呢?满足就是幸福吗!?人却都是不知足的,但却不失幸福!开心就是幸福吗!?但有的时候开心有的时候不开心,开心的人说她不幸福,不开心的人却说我很幸福。总是什么人都有的,幸福到底是什么!?在我还没有完全理解的它是什么的时候,我却已经失去了它!
      能不能给我个机会找回我失掉的幸福......

    烟不懂得手指的寂寞

         很奇怪,喜欢烟。
      喜欢燃起它,看它在指尖慢慢的,慢慢的,一点一点化为灰烬。一丝一丝的青烟飘出,舞动,这是它的寂寞也是我的寂寞。
      可却不是手指的寂寞。
      看着烟的燃烧,便好像看见了每个人的一生。
      在不见火光的无声无息中,一点一点消耗着,在不知不觉间,就走向了尽头。无法掌控无法停止。
      这是每个人的宿命,我们必须我们不得不走向尽头。最终的最终,是一堆烟灰,风吹过,消散于无形。没有任何曾来这世上走过一回的痕迹。
      真的,了无痕迹。
      烟,无痕的燃烧着。
      寂寞,无言的弥散着。
      在这寂寞中我们腐烂着。
      手指一直在旁边冷眼看着。
      烟,是寂寞的。手指是寂寞的。我们,也是寂寞的。
      一直以来手指都是这样,默默的承受着烟在它的身上恣意跳跃,从来没有过怨言,每天看着烟点燃,然后又慢慢的化为灰烬,就这样的日复一日,年复一年,日积月累的日子里,手指已经被烟熏染成了枯黄色,烟仍旧恣无忌惮的燃了又灭,灭了又燃.....
      手指寂寞的时候只是开始它自已的僵直,当烟再次点燃的时候他有些懒散的随意支起,烟觉得很委屈,它一直想不通,自己把温暖毫不犹豫的带给了手指,却换不来手指的开心,它感觉到手指一天天的在变冷,直到有一天无力再把烟拿起.....
    April 23

    丁俊晖被火箭教育 中国神童输掉关键局难翻身

      

          北京时间4月23日凌晨,斯诺克世锦赛首轮最大焦点战役丁俊晖PK奥沙利文第一阶段的比赛在英国谢菲尔德的克鲁斯堡剧院结束,奥沙利文8-1领先丁俊晖。这场比赛引起世界各大媒体的关注。

      法新社专门撰文聚焦这场焦点之战:周日比赛的第一阶段,中国丁俊晖1-8落后两届世锦赛冠军奥沙利文,濒临世锦赛出局边缘。

      今天的克鲁斯堡剧院,两届世锦赛冠军得主奥沙利文给20岁的丁俊晖上了很好的一课。中国神童在周一的比赛中已经没有翻身希望,奥沙利文只需要再赢两局,就能击败丁俊晖顺利晋级。

      外号“ 火箭”的奥沙利文在昨天的比赛中7次拿到50分以上,其中,在第3局还拿下109分的高分。虽然丁俊晖在第6局也拿到103分,但纵观整场比赛,他鲜有上佳表现,几乎没有得到什么机会。丁俊晖在错过一系列机会去赢得第7局的比赛胜利的时候,他整场比赛最后的机会也就此葬送。

      英国通讯社:本次赛事最大热门奥沙利文在第一阶段与丁俊晖的比赛中已经取得8-1的领先。

      “火箭”吹走了丁俊晖。大师赛冠军奥沙利文重演着温布利大师赛上10比3击败丁俊晖的那幕。他以58, 50, 48, 109, 60, 63, 63,70 和 45分的成绩让初次登台的丁俊晖无技可施。

      今年北爱尔兰杯赛冠军得主以103分扳回一局,以1-5落后挽回一丝颜面,但奥沙利文在后面三局没给对手任何机会,很快取得8-1的领先,完全控制住了整场比赛。

      丁俊晖和奥沙利文将在明天下午继续自己的比赛,除非丁俊晖能打出非常漂亮的斯诺克,才能重演去年8月9-6击败奥沙利文一幕,否则两度克鲁斯堡剧院之王奥沙利文已经铁定晋级下轮。

    -----------------------------------------------------------------------------------------------------------------

    坚持看到深夜,虽然没看到两人的精彩对决,只看到一方压着一方打,比较遗憾,但从中感受颇深,感受如下:

    上帝只会眷顾那些有准备的人

    性格决定命运,气度影响格局

    为人处事要能屈能伸

    要想成功,必须要偏执一点,虽然它会暂时阻碍你的进步,但能很好的磨练你

    加油,期待着今天晚上你能有精彩的进球

    April 22

    小晖哭的时候,火箭像父亲一样搂着他

            一山难容二虎,一国难立两君,群雄逐鹿的斯诺克也一样。之前,由于火箭奥沙利文的起伏不定,加之中国神童丁俊晖的异军突起,似乎斯诺克王位也已到了禅让的临界点,甚至有人将丁俊晖和奥沙利文相提并论,但昨天温布利大师杯的决赛却给丁俊晖和他的支持者当头一棒。10:3,宣告了火箭的完美归来,而19岁的小晖因为委屈而失声痛哭。

        开场,丁俊晖镇定自若地把握着每次机会,一路打到77分才告停手,并很快就拿下首局。

    进入第二局,丁俊晖手感绝佳,完全做到了弹无虚发,在清理完全部红球后,他再逐一将彩球全部打入袋内,109:16,丁俊晖开局就打出单杆过百的骄人战绩!

        尽管丁俊晖先胜出两局,但此后奥沙利文用超凡脱俗的精彩发挥使之完全成为决赛主角,他本场比赛四杆过百,其中一杆打到了143分的惊人成绩,让球迷再次目睹巅峰期的奥沙利文时的王者风范。虽然比赛曾经一度出现有利于丁俊晖的势头,但最终丁俊晖还是以3:10输给素有“火箭人”之称的奥沙利文,获得了该项大师赛的亚军。

       比赛除了精彩,更让人难忘的是奥沙利文对丁俊晖的呵护,昔日羁傲不逊的火箭,在这个夺冠之夜,向他的接班人表现出了偶像的风度,当丁俊晖哭的时候,他像慈父般一把将其搂在怀里……

      火箭的掌声在响 小晖的眼泪在飞

       最后一局悄然结束,奥沙利文走近丁俊晖,脸上的表情很平和,然后给了丁俊晖一个拥抱,类似的场面不只出现过一次。火箭在这场比赛中,人品比球技更值得尊敬。

      观众辱骂

      火箭拔刀相助

       一路杀到决赛,丁俊晖剑锋所指,所向披靡。但即使是这样惊艳的表现,也不足以夺走“火箭”的锋芒。整个比赛的过程中,奥沙利文的拥趸兴奋异常,为“火箭”的每一个进球叫好,而丁俊晖击球的时候,有人在背后骂他,小晖受到了极大的干扰。观众的喧哗令奥沙利文也有些恼火,个性率直的他冲着观众席发火,呵斥不友好的粉丝不想看比赛就离开,但丁俊晖此时已经意兴阑珊斗志全无,结束比赛对他而言,成为了一种解脱。

      小晖哭了

      火箭好言相劝

       在比赛进行到12局的时候,丁俊晖很随意的一次击球,直接将机会送还给了奥沙利文。所有人都看得出来,他已经放弃了这次比赛。输掉这一局后,丁俊晖含着泪水走向奥沙利文,与其握手表示祝贺。奥沙利文轻轻地告诉丁俊晖:“我们还有好多局比赛没打呢,先去休息室喝杯茶吧!”

      神童领奖

      火箭带头鼓掌

       10:3,结果被定格后, 泪水在丁俊晖的眼圈里打转,在偶像奥沙利文面前,他似乎失去了横扫亨德利的神奇。泪水,终于还是流了出来,丁俊晖用毛巾不停地擦试着。在随后的颁奖仪式上,当主持人念到丁俊晖的名字时,奥沙利文带头,全场观众为这个中国男孩加油。

      小晖的147

       好比珠穆朗玛之于登山者,147分,对于每一个“斯诺克”选手来说,都是追求的至高境界,中国台球神童丁俊晖在19岁这年,完成了自己的第一个147,从此跃入巨星级别,虽然还很稚嫩,但他代表了世界台球的明天,他会是亨德利和奥沙利文的接班人,这一点已经没有人再怀疑。

       杆进147俱乐部

       在本届大师赛前,丁俊晖还一直和这个普通的阿拉伯数字无缘。要打出147分的单杆满分没有信心是不可想象的,好在他将实力和运气完美地契合,完成了这一梦想。

        由于手持外卡参赛,丁俊晖不得不通过一轮资格赛才能与高手过招。首轮比赛中,丁俊晖打出了职业生涯的第一个单杆147满分,也是大师杯有史以来第二位能够打出满分的球员,刷新了电视转播中打出这一成绩最年轻的球员。

       座大山成标杆

       奥沙利文、亨德利、希金斯、达赫迪,提起这几个人的名字,“斯诺克”运动始终因他们熠熠生辉。而他们也成为了丁俊晖必须超越的标杆。在本届比赛中,虽然丁俊晖和希金斯、达赫迪两名队员过招,但事实上,如果小晖要想在这个项目上登上至高的殿堂,也必须问一问这两人是否答应。尽管这两人的状态不及以前,但经验却是异常丰富,在以后的比赛中依然是丁俊晖最大的宿敌。

       不过,让小晖可以欣慰的是,这一次他又和奥沙利文、亨德利两位世界顶尖高手过了一回招,而且取得了一胜一负的成绩。在这两人中,亨德利虽然老迈年高,但他头上的荣誉可以砸死好多后生,他的技术和心理素质都还处在一流高手行列;而奥沙利文显然从各方面都要高于小晖,是目前水平最高的球手,毫不夸张地说,他是小晖最大的“敌人”。

        年轮回从头越

        从十岁出头开始打球,丁俊晖已经在“斯诺克”这个欧洲人统治的项目中滚打了七年光阴。这七年,对于丁俊晖来说,有欢喜,有失落也有忧伤,可以说浓缩了人生所有的酸甜苦辣。不过好在丁俊晖还年轻,还可以重新卷土而来,有时间去实现自己的梦想。所以这一次大师杯比赛对于丁俊晖来说,既是终点,又是起点,从现在起,他又开始新一轮的拼搏,直到像他的偶像奥沙利文一样伟大。

      火箭的147

       如果把奥沙利文比喻成“天才”一点也不过分,关于他的故事可以写进斯诺克运动的传奇词典,尽管他所获得的荣誉不及“台球皇帝”亨得利,然而他的魅力却无人能及。

       个147的超天才

       奥沙利文身上所拥有的,其实已不是什么球技,而是妖术,一种令凡夫俗子们望尘莫及的魔幻力量。

        虽然大多数的职业球手都有单杆破百的记录,但完成147的满分,只能属于极少数的天才;而能够挑战满分杆的最快纪录者,则只能是一个人,一个鬼才,一个浑身充满“妖术”的人。1997年,奥沙利文因为在世锦赛上打出了5分20秒的满分杆,从此,“火箭”的美誉便一直伴随着他。

       大绝活无人敌

       奥沙利文之所以是奥沙利文,是因为他有其他人无法比肩的四大本事。

       首先,他是一个击球频率最快的球手,即使是前辈吉米·怀特这样的快枪手也无法相提并论,火箭不仅击球快,准度一样可以堪称世界之最。

       其次,他的特立独行也让人称奇,在从事斯诺克这一绅士运动的同时,他还经常参加遭职业斯诺克球手蔑视的美式撞球比赛,虽然从无建树却乐此不疲。

       此外,奥沙利文还有左右开弓的绝活,本场同丁俊晖对决,火箭同样多次使用了左右开弓的“杂技”,赢得满堂彩。

       最后,火箭的乖张性格,也让他成为职业斯诺克选手的异类。火箭打顺了,上帝也拦不住,所有球手都以赢他为荣,但也只有亨德利这样的老江湖以及希金斯、威廉姆斯这样的同辈天才才能捕捉得到他性格上的弱点,大多数人和他比赛都会怯场。

       年之痒还复来

       最近七年奥沙利文的风波,比如多次弃赛,状态起伏导致他作为世界公认第一高手却连续数年无法排名世界第一。最近几年虽然拿了一些含金量较高的冠军,但是由于在更多的排名赛中名落孙山,导致排名上不去。

       其实,“火箭”的这种厌战情绪很早便已表露出来。中国公开赛时,奥沙利文在最后一刻拒绝参加,令无数喜爱他的中国球迷扼腕痛惜。不过如今,以完美姿态归来的奥沙利文将给斯诺克运动一个惊喜,他将和中国神奇小将丁俊晖一起,成为这项古老绅士运动的救世主。

      两个人的里程碑

        仰天长叹、黯然神伤……与其说丁俊晖输给了国王奥沙利文,还不如说是败给了命运的捉弄。

        这是一场两代颠峰球手的对决,如痴如醉的过程注定这场比赛没有失败者。奥沙利文依然老而弥坚,丁俊晖继续诠释着自己的神奇,至于胜负在这个颠峰时刻已经被抛到了云端。因此,我更愿意把丁俊晖的这次失利看成是一种冥冥中的注定,或者说是上帝对“神奇小子”的一种砥砺!就像1982年世界杯上的马拉多纳,没有痛彻心脾的败北,也就不能成就未来的“一代球王”。

        事实上,除了比赛的经验还逊色于世界最顶尖的球手外,丁俊晖在其它的环节上已经迈入了“斯诺克”的最高殿堂。

       亚军,对于只有弱冠的丁俊晖来说,是一种至高的神圣,是亚洲人至今无人能及的颠峰,尽管完美中带有缺憾,但在此前,它却像横亘在欧亚大陆的博斯普鲁斯海峡,将“斯诺克”的阴阳线分隔开来。不过,丁俊晖却在昨天将它作古。

       现在看来,丁俊晖和奥沙利文已经联袂开创了一个“斯诺克”时代,或者说他们未来的对话将为这项运动增添五彩缤纷,更为重要的是,在撒克逊人垄断的世袭王国里,将有一位黄皮肤的中国人也可以戏弄一把英国绅士。

      神童瞄准下一站

       回到谢菲尔德的丁俊晖,虽然时间已经很晚但还是难以入睡。谈到与奥沙利文的比赛,丁俊晖表示没能拿到冠军“挺对不起大家的”。而谈到失利的原因,丁俊晖认为自己特别想赢,所以一开场就攻得特别厉害,“节奏太快了,第十局65分的时候那个球没打中,输了那局我觉得太窝火了,后面打得就太随意了。加上罗尼打得太好了,几乎没有破绽,真是没法阻挡。”

        不过,虽然本次大师赛丁俊晖只是拿到亚军,他还是感到满意,“特别是第一次打了147分,让我很难忘。”

        记者从丁俊晖的博客上获知,他现在已经走出了失利的阴影,并表示下次碰到奥沙利文不会让他再这么轻松。

       下周还有马耳他杯,丁俊晖重拾自信说,“我一定会打出好成绩的。”马丁

      小晖让妈妈骄傲

       小晖大比分输给了自己的偶像,身在上海的丁妈妈陈习娟仍然为儿子感到骄傲,她说,“比赛永远都是残酷的,有赢也有输。小晖和奥沙利文都是顶尖选手,他们比赛关键是看临场发挥,决赛中对手发挥更好一些吧。不过,小晖这次能打到决赛表现已经非常不错了。虽然没能看到小晖夺冠,但他仍然是我的骄傲。”阿莱

      姚明安慰丁俊晖

        丁俊晖输给奥沙利文令人遗憾,但是难能可贵的是,丁俊晖能够迅速地走出失败的阴影,或许这与众多朋友的鼓励无不关系。

       姚明目前正在积极恢复当中,小巨人和丁俊晖的经纪人比较熟悉,北京时间昨天夜里,他特地从美国打来电话,向小晖的经纪人询问丁俊晖的比赛情况。得知输掉了比赛之后,姚明表示,奥沙利文是他非常敬佩的选手,小晖输给他没什么丢人的,何况小晖才不到20岁,假以时日,丁俊晖完全有机会超越奥沙利文。

    April 11

    男孩子的爱只有一次,女孩你懂得珍惜吗?

          人们长说痴男怨女,古人已经解释的很清楚了,痴男,男人对爱的痴情,对感情的专一也只有男人自己才知道。女人一辈子可爱上多个男人,而男人却可以同时爱上多个女人,可女人却不知道其实男人一辈子只爱过一个!
          男人真正纯洁的爱只有一次的,当那次爱来了,他会不顾一切,当那次爱死了,也就不会再有了,那次爱的太深,然而痛的也太深。
          所以那次之后男人的爱也就麻木了.男人以后也会爱上别的女孩,只是那种爱却已不再纯洁,包含了欲望,包含了同情,包含了怜惜~~~~~
          女人的心都是水做的,然而最毒也妇人心,所以受伤最多的是女人,伤人最深的也是女人。女人的爱可以有很多次,而男人却永远只有一次的,男人遇到那个最爱的女孩之后把所有的爱都给了她,可有多少女孩懂的珍惜。
          于是男人哭了,男人流泪了,伤心至极而绝望的泪水,慢慢的男人开始亲手去埋葬自己那唯一的爱,把它尘封在自己心底最深处的某个深渊。
        
        
          可当夜深人静的时候,他会疯狂的跳进那个深渊,妄图去寻找那次爱的痕迹,哪怕是一丝丝一点点,可结果却跟以往一样的一无所获,只留下自己独自缩在黑暗的角落孤独的一根根抽着寂寞的烟,孤独的流着伤心的泪水。
          当然女人埋怨着男人的花心的时候是否曾想过,男人最珍贵的东西也正是被你们无情的毁灭,当男人羞涩的说着我爱你的时候你珍惜了吗?当男人为你流泪的时候你帮他擦拭了吗?当男人乞求你别离开的时候你回头了吗?
          都说男人花心,可女人何曾知道,男人的花心是因为痴心,爱极而痴,痴极而痛,痛极而死.这次爱灰飞烟灭后男人对爱的心就死了,男人再也不会对女人真心的付出真正的好了,没有了心劲,没有了激情,不再相信真正的爱情,对爱总带着点玩世不恭,有些事,一辈子只有一次。
          当男人全心爱过一个人之后,该付出的付出了,全心努力的去把握过,曾试图给她想要的一切,曾试图为她而死,但回报却是无动于衷,于是在一次次寂寞的等待中,心血一点一滴的滴干了,最后心血全无,心灰意冷,当爱情失去信仰,当感情失去忠一的港湾后,对于男人来说,爱情是什么这一切就都显的无所谓了!男人的心冷了,就再也难以热起来,因为爱过一次之后已经让他失去了爱的能力。
          男人最爱的真的只有一个,男人心里最清楚,如果你是你能感觉到的吗,感觉到了,请你珍惜好吗?