由于组件提供的方式不同,所以安装的方法也是不一样的,下面就目前常见的各种形式的组件的安装方法介绍一下。

1、只有一个dcu文件的组件。dcu文件是编译好的单元文件,这样的组件是作者不想把源码公布。一般来说,作者必须说明此组件适合delphi的哪种版本,如果版本不对,在安装时就会出现错误。也正是因为没有源码,给使用者带来了不便,那就是一旦delphi版本升级,此组件就不能再使用了,当然有的作者给出了几种版本的dcu文件,用户根据需要选择使用。这样的组件的安装方法是:在component菜单中,选择install component,在对话框中的"into existing package"页中,单击“unit file name”后的“browse”按钮,在打开的文件对话框中,将“文件类型”设定为*.dcu,找到要安装的dcu文件,按ok按钮返回"into existing package"页后再按ok按钮就可以安装了。注意,此时delphi会提示dclusr40.dpk将被重建,是否继续,ok就可以了。这里是将组件安装到dclusr40.dpk包中,此包从文件名上可以看出是用户自定义组件包,先安装到这个包中吧,下面再讲有关注意事项。安装完毕会有已经将组件注册完的提示信息以及安装到哪个组件页中的信息等,到
组件面板上看看,一般会出现一个新的组件页,其中有刚安装的组件。

2、只有 pas文件或既有pas又有dcu文件的组件。这种组件因为有pas文件,也就是说作者提供了源码,这就好办多了。安装的方法和上面是一样的,在文件类型中可以设定为dcu也可以设定为pas,建议设定为pas,这样可用你的delphi重新编译一下,看是否会出现问题。delphi升级后只能选择pas 文件安装,这样才能重新编译,使得组件能适应新delphi版本。这样的组件是很值得使用的,根据心铃的经验,没有源码的组件最好不要使用,一是存在 delphi版本升级后无法使用的问题,再者当程序出现问题后用户无法调试组件来判断是否是组件中存在bug。

3、有dpk文件的组件包。带有dpk文件的组件包一般是有多个组件构成的,也就是说安装后会有多个组件供使用,如果只有一个组件作者一般不会制成dpk文件,使用上面的方式发布就可以了。对于这样的组件包,一般来说会有详细的安装说明文件,如上面提到的rxlib,由于组件复杂且安装时有先后顺序,作者不提供安装说明用户根本无法正确安装。如果没有安装说明文件,那么用下面的方法安装:在file菜单下,选择”open…”打开dpk文件(文件类型列表框中选*.dpk),在出现的package窗口中,工具栏上有install按钮,按此按钮即可进行安装。如果install按钮处于无效状态,那么先按compile按钮编译,一般来说编译之后install按钮就会处于有效状态,此时再按install按钮就可以了。

4、带有bpl文件的组件包。一般来说这也是由多种组件构成的组件包,它其实是一个动态连接库文件(dll)。对于这种组件包的安装方法是:在component菜单下选择 “install packages”,然后单击add按钮,在打开的文件对话框中找到相应的bpl文件打开返回后,再单击ok按钮就可以了。

5、activex控件的安装。要安装这类控件,需要先用regsvr32.exe注册,然后选择
component 菜单中import activex control项。在import activex control打开的窗口中,只有已经注册的activex控件才出现在列表中,选中一个然后按install按钮就可以安装了。如果事先没有用 regsvr32.exe注册也可以按add按钮找到ocx文件即时注册,注册后再进行安装。

几点说明:
1 在拿到组件后先看是否有说明文件,一般来说在说明文件中有如何安装的指导,有些还会有组件的属性、事件、方法的使用说明,这些在使用时是非常重要的。
2 在上面的组件(包)安装操作之前,最好将 *.bpl拷贝到你的system目录中,将
*.pas、*.dcu、*.dcr、*.dp@拷贝到delphi的lib目录中再进行。
3 前面我们提到安
装dcu 组件时,选用的是已经存在的dclusr40.dpk,当然也可以选择安装到一个新的包中,如果选择新包,需要先取一个名字比如demo,事实上安装完毕后用户可以找到的是demo.bpl,而找不到demo.dpk。假如你已经将一个组件安装到dclusr40.dpk中了,还想再安装一个组件,如果再安装到dclusr40.dpk中,安装后你得到提示,原来安装的那个组件已经被取消注册,你将无法使用了。这样不就成了只能安装一个组件了吗?除非你再安装到一个新的包中才可以两个组件同时使用。当然每安装一个组件生成一个新的bpl文件也未偿不可,但bpl文件就增加许多。能否在 dclusr40.dpk中多安装几个组件呢?当然是可以的。方法如下:用file菜单下的open打开dclusr40.dpk文件,单击add按钮,在打开的对话框中选择add unit页面,按unit file name后的“browse”按钮打开组件单元文件,ok即可,用此种方法这样可添加多个组件的单元文件,添加完毕,按一下编译按钮,然后
再按 install按钮即可,如果单元文件是编译好的(dcu)可以直接按安装按钮。
4 组件的删除。光会安装可不行,还要会删除呀。很简单,在component菜单下,选择install packages,在列表中找到安装所在的bpl,按remove按钮,ok!再把bpl文件删掉就彻底了,如果不删除bpl文件,下次可以按安装bpl 组件的方法再安装使用。
posted @ 2010-03-15 11:08 Talo 阅读(44) | 评论(0) |  编辑
邂逅若是不美,就没有这般的煎熬与难奈,也因为邂逅是美,才让你我心绪颤动回荡…
  我们怎麽啦?我们到底怎麽啦?
  落叶别离了枝头,飘飘然随风出走,几经翻滚荡漾后,滴落水面欲寻沉浸…
  花叶的褐,是苦涩熬煮的落寞。花叶的红,是放纵肆意的轻狂。
  花叶的黄,是沉溺温存的幸福。花叶的绿,是逐梦迷惘的青春。
  水影与花,花与水,轻触的瞬间,纠缠交错出那般华丽魅惑的曲线,摇曳交响着轮回所包覆的偶然的爱;轻触的瞬间,那是一种极为细腻的音声,一种你我邂逅的分泌情愫音声,演奏出这场美丽的邂逅…
  我们怎麽啦?我们到底怎麽啦?
  相信懂升哥的你,必定“听”得到这般的色彩;也相信懂升歌的你,也必定“看”得见这般的声音。
  从视觉进入到听觉,陈升诠释着他眼与心中的世界,带领我们进入他“我们怎麽啦?”的音乐国度中。二十年的音乐创作积累,不过是几个秋的过去,不过是多少个美丽与哀愁,未曾停下脚步的他依然…
  时序来到的2008 我们怎麽啦?
  点出在这样一个价值混沌杂乱的年代,超速失序的时空,让我们失焦而无感…五十的陈升,用着其反骨与不妥协的敏锐度,转化成曲吟唱成词,来喧泄来调和失衡与平衡间的拉扯…
  我们怎麽啦?
  那逝去的美好时光,只能在梦里品尝那份优雅,只能在超现实的世界中执意拼贴; 古老的戏曲揉融着过去与现在当下的时空,编织往返记忆深处的线条,凝结出今日的思念气味…
  我们怎麽啦?
  爱与分离是一对喜欢谈恋爱的词组,亘古以来难分难舍,没有人可以逃得过…这般的纠缠,何其轻淡,存在于你我相互交会的眼神;何其短暂,存在于你我闪念间的幻象。没有偶然的世界,轮回也成就不了你我的爱恋,那美丽的邂逅…
  我们就这麽啦! 提“升”细细聆听这存在你我当下的生活…
    《诗经·国风·郑风·野有蔓草》“野有蔓草,零露漙兮。有美一人,清扬婉兮。邂逅相遇,适我愿兮。 野有蔓草,零露瀼瀼。有美一人,婉如清扬。邂逅相遇,与子偕臧。”
  “邂逅”来源于此诗
  “邂逅”这个词主要是指偶然的、不期而遇的
  它主要指相遇的偶然性,可以用作对事件、人物的相遇,但人们经常用这个词来指带男女相遇,通常带有男女之间情分、缘分的含义。
很多人把“邂逅”片面理解为双方此次相遇前是不相识的,这是不全面的。
  现在这个词被经常使用在男女异性相遇之间,这里有必要强调一下,同性之间也是可以使用“邂逅”这一词的。
  同样邂逅是遇见的意思
  但是
  遇见一个人,可以是熟悉的,认识的,或是陌生的。
  邂逅一个人,便只能是陌生的,素未谋面的人。
  本来邂逅是偶然相遇的意思,那么也就是偶然的遇见了。可是感情丰富的我们不该只局限在字面的意思,不是吗?邂逅是包含了浓浓情感的,是“暗里回眸深属意”的感觉,是不期而遇的感觉,也或许之后,便是一种伤感,落寞,留恋,想念的感觉。邂逅的过程,对邂逅的幻想通常都是美妙的,可是邂逅之后的结果呢,多半就不那么令人满意与开怀了。
  不过,我们不都该在意过程,而不是结果吗?
  总之,邂逅是种美丽的感觉...
posted @ 2010-02-09 11:17 Talo 阅读(5) | 评论(0) |  编辑
问起SHTML和HTML的区别,如果用一句话来解释就是:SHTML 不是HTML而是一种服务器 API,shtml服务器动态产成的html.

  虽然两者都是超文本格式,但shtml是一种用于SSI技术的文件。 也就是Server Side Include--SSI 服务器端包含指令。 如果Web Server有SSI功能的话(大多数(尤其是基于Unix平台)的WEB服务器如Netscape Enterprise Server等均支持SSI命令)。
会对shtml文件特殊招待。 先扫一次shtml文件看没有特殊的SSI指令现在。
有就按Web Server设定规则解释SSI指令。 解释完后跟一般html一起掉去客户端。

shtml
  使用SSI(Server Side Include)的html文件扩展名,SSI(Server Side Include),通常称为"服务器端嵌入"或者叫"服务器端包含",是一种类似于ASP的基于服务器网页制作技术。

SSI工作原理:
  将内容发送到浏览器之前,可以使用“服务器端包含 (SSI)”指令将文本、图形或应用程序信息包含到网页中。例如,可以使用 SSI 包含时间/日期戳、版权声明或供客户填写并返回的表单。对于在多个文件中重复出现的文本或图形,使用包含文件是一种简便的方法。将内容存入一个包含文件中即可,而不必将内容输入所有文件。通过一个非常简单的语句即可调用包含文件,此语句指示 Web 服务器将内容插入适当网页。而且,使用包含文件时,对内容的所有更改只需在一个地方就能完成。

因为包含 SSI 指令的文件要求特殊处理,所以必须为所有 SSI 文件赋予 SSI 文件扩展名。默认扩展名是 .stm、.shtm 和 .shtml

Web 服务器在处理网页的同时处理 SSI 指令。当 Web 服务器遇到 SSI 指令时,直接将包含文件的内容插入 HTML 网页。如果“包含文件”中包含 SSI 指令,则同时插入此文件。除了用于包含文件的基本指令之外,还可以使用 SSI 指令插入文件的相关信息(如文件的大小)或者运行应用程序或 shell 命令。

  网站维护常常碰到的一个问题是,网站的结构已经固定,却为了更新一点内容而不得不重做一大批网页。SSI提供了一种简单、有效的方法来解决这一问题,它将一个网站的基本结构放在几个简单的HTML文件中(模板),以后我们要做的只是将文本传到服务器,让程序按照模板自动生成网页,从而使管理大型网站变得容易。

所以,利用SHTML格式的页面目的和 ASP 差不多,但是因为是 API 所以运转速度更快,效率更高,比ASP快,比HTML慢,但由于可以使用服务器端包含,因此使页面更新容易(特别是批量更新banner,版权等),想象一下吧,你有一段 HTML,要在中间穿插一些特殊的服务端脚本,比如插入其他 HTML 段落,你选择 ASP 来完成这个任务,但是如果任务更繁重,需要更多的时间,比如 5 s,这个时候你不用 ASP 而用 SHTML,或许处理时间就只用 4 s 了.

posted @ 2009-07-15 11:16 Talo 阅读(299) | 评论(0) |  编辑

编程到底需不要数学知识,数学知识对编程有多大的用处,类似这样标题的讨论,在网络上已经不知道被讨论多少次了。前两天又在老同事小白的blog上看到了他的看法。以前正方总是喜欢拿算法与效率来表明数学很重要的立场,反方或是最近普遍的观点是要依照需求。两方都没错,我也有一点小心得跟大家分享。
    先来谈谈「数学」在大家的心中是长什么样子。我大学时念的是辅大应数,会选应数的原因是一、我的分数上不了资工,二、应数又跟纯数不一样,是比较偏计算机应用的(事实上不是这么回事),应数的全名是应用数学。三、高中时一位要好且计算机很强的同学也是念辅大应数,所以我就这样进了数学系。在一般人眼中是个很硬的科系,那几年全校1/2的名单中,数学系就占了一半。数学系所学的数学,跟一般人所会用到的数学不太一样。除了几门工科必备的微积分、线性代数、机率统计外,剩下的都是高深且抽象的数学理论,像是高等微积分、高等代数、几何学(不是三角形、正方形那种简单几何)、拓扑学等。这几门课程跟本像天书一样,非常的抽象(无法画在直角坐标系上),我能毕业也算是一种奇迹啊~~我真怀疑我那学念到博士班的同学们,他们的脑袋是不是跟我长得不一样。 
  
    研究所顺利考上的向往已久的资工所,成为名符其实的本科系学生,本以为可以不用再玩数学了,但我发现我错了,是不用再玩那些抽久的高等数学没错,但线性代数、机率统计、离散数学等…用了更多的数学,我想不出来有哪门资工研究所的课没用到数学的。而且你最后的硕士论文要写出来,数学更是不能少的。你以为玩网络不需要数学?大错特错,里面一堆机率统计的东西。电机需要数学吗?当然需要!最基本的傅利叶转换就够搞死你了,所有工科的系所都逃不了数学的魔掌。就算你到了管理学院,会计系要数学、经济系要数学、连心理系有些领域也需要数学。虽然所需要的数学不尽相同,但都在数学的领域里。我开始后悔当年没把数学念好,博士班念到一半念不下去了,其中一个原因是我数学太烂了。
 
写程序需要数学吗?要看程序的目的?那我们就像讨论一个简单的程序,算出1加到100的总和。

完全以程序结果为导向的人,或是训练有素的程序女/男工,甚至有时连我都会很直觉的写出这样的程序:

int sum = 0;
for (int i=1; i<=100; i++)
       sum += i;
上面这个程序片段还算很容易让人一眼就看懂,可是我们明明国中时就学过了这种数列级数的算法了,怎么还会写出上面这么笨的程序呢?

int sum = ((1 + 100) * (100 - 1 + 1)) / 2;或更精简的

int sum = (101 * 100) >> 2;
这个例子已经被说烂了,我们来来看另一个例子,计算1加到10000,奇数和偶数的总和。用循环的话,一样很直觉得就写出来了:
 
int oddSum = 0;
int evenSum = 0;
for (int i=1; i<=10000; i++)
{
       if (i % 2 == 0)
              evenSum += i;
       else [Page]
              oddSum += i;
}很简单的程序吧!可是我们稍稍的用我们有12年(国小到高中)的数学背景想一下,你可以写出更精简的程序:
 
int sum = (10001 * 10000) >> 2;
int evenSum = 5001 * 5000;
int oddSum = sum - evenSum;什么?看不懂?!sum应该知道怎么算出来吧?就刚刚第一个例子是1加到100,现在改加到10000而已。evenSum呢?简单的推理一下,1到10000之间的偶数总和是是2+4+6+...+10000,把它们全部除以2的话会变成1+2+3+...+5000,所以1到10000偶数的总和不就是1加到5000的两倍吗?
1加到5000是:
(5001 * 5000) >> 2两倍就不用除那个2了,所以不就是上面那个算式了吗! 

    那1到10000奇数的总和不就是全部的总和减掉偶数的总合吗!稍微动一下脑袋,可以让你的程序变得很有效率。怕别人看不懂?是不会加个批注在程序代码里面喔! 

    相信聪明的你,很容易就可以分析出来这两个例子的两种写法,在效能上迶多大的差异,但这不是我在这里想要表答数学是如何如何增加效率的。我想要表答的是,我们明明辛苦了12年,学了一堆的数学,为什么我们要放弃这样的基本训练?我们笑美国人的数学不好,请问你又用了多少的数学来帮助你的生活和你的工作?学了又不用,那不如从小学开始就分科系好了,不喜欢数学、怕数学的,就选完全用不到数学的科系。 
  
    我今天不是要大家在写程序是时钻研那种算法、功式等,去计较那些在现在动不动在2GHZ, 3GHZ,双核心、四核心之下,所省下的那微小的效率。而是你的态度!你宁愿多打一些code,也不愿动一下脑筋,如果你的态度是这样子的话,那也是活得下去啦,不过你的水平就不过如此而已。 
  
    你会反驳说,需要用到算法、要讲求效率时,我再去研究一下就好了,干嘛说的很严重似的。今天我们一时兴起,要去爬阳明山,没问题啊,那种程度的山,只要双脚健全走得动的人都能爬。如果换成现在流行的登山步道呢?这需要一点点体力才行。如果你要去爬台湾百岳呢?合欢山的东峰算是最简单的吧?开车到山脚下,穿个好一点的鞋子、好一点的衣服、多一点的体力,也还不是太大的问题。那爬玉山呢?虽然现在爬玉山已经很方便了,连行李都可以请人帮你背,但平常没有一些训练,要爬上去不是那么容易的事。你要站在世界的最高点,去挑战圣母峰,那全世界没几个人办得到,而且办到的人事前可是经过了严格的训练。 

       你想把自己摆在什么位置?你想要成就到什么样的高度?如果你只想在小小的台湾,在二、三流的公司里,打打项目游击战,赚个还算可以的薪水,那的确,你不怎么需要数学,连软件工程的理论也不太需要,最重要的唬弄客户的技术纯熟就可以了。去年去了101的37楼面试后,我才知道我了不起只爬到阿里山而已,要登上MountainView这座山,我必需十倍努力才行。而这个努力不是我在面试前,看看什么教战手册、写写网络上的考古题我就能够通过的,而是必需把一些数学的训练熟到变成很自然的反应才行。简单的问你就好了啦,上面那个用循环写的1加到10000的那个例子,如果10000改用n的话,那需要多少时间,用大O(big O)来表示。如果你不能很快的推论出是O(n)的话,那你的履历连投都不要投,在37楼问的问题比这难多了,而且你没几分钟的时间可以作答。去年那次,是我第二次后悔当初没把数学学好。 [Page]

    为什么Google会这么重视算法和效率?应该说世界级的大公司都重视,Yahoo、微软、YouTube…,因为你写的程序不是给几十个人、几百个人用而已。而是同一时间有几百万,甚至上千万人使用。一个人慢0.1秒好了,一百万人就10万秒,超过一天耶。浏览一个网页,慢个几秒钟你都不能忍受了,更何况是一天。你说能不计较算法和效率吗?! 
  
    你想过什么样的生活是你自己决定的,但你想要当个世界级的软件工程师的话,把学数学就当作是一种修行吧!不要怕没地方用,因为你时时刻刻都可以用到它。当你的修行到了某个程度,要挑战高山,就比别人容易多了。 
  
    好好好,不想深入就算了,但你不觉得放弃12年的数学训练很可惜吗?至少花点脑筋用一下嘛~~,大家都多少用一点,软件的水平就会慢慢提升了,你说是吗?

posted @ 2009-07-06 16:37 Talo 阅读(2667) | 评论(46) |  编辑
MySQL5.0的JDBC驱动程序(转)
2008-10-19 16:58

语法

Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://host:port/database","user","password");

编程

1、用DriverManager登记mm.mysql
mm.mysql的class名为org.gjt.mm.mysql.Driver,登记时必须写成
Class.forName("org.gjt.mm.mysql.Driver").newInstance();

2、jdbc url参数说明
url格式:jdbc:mysql://[hostname][:port]/dbname?param1=value1&m2=value2...
参数名 取值 缺省
user 数据库用户名 无
password 数据库用户口令 无
autoReconnect 当数据库连接丢失时是否自动连接,取值true/false false
maxReconnects 如果autoReconnect为true,此参数为重试次数,缺省为3次 3
initialTimeout 如果autoReconnect为true,此参数为重新连接前等待的秒数 2
maxRows 设置查询时返回的行数,0表示全部 0
useUnicode 是否使用unicode输出,true/false false
characterEncoding 如果useUnicode,该参数制定encoding类型,建议使用8859_1 无

提示
同时使用useUnicode,characterEncoding,能解决数据库输出时的中文问题
如:jdbc:mysql://localhost/test?user=root&password=123&useUnicode=true&characterEncoding=8859_1

实际例子,举一个简单的例子
这个jsp例子使用一个库,该库只有一个表(地址簿)

create database addressbook
use addressbook
create table addressbook (id int auto_increment primary key,name varchar(30),address varchar(255),phone varchar(20));

插入记录
insert into addressbook (name,address,phone) values (@#jjx@#,@#zhejiang yuyao@#,@#0574-2222222@#);

jsp代码:代码中使用了absolute,ResultSet.TYPE_SCROOL_SENSITIVE等的目录是为了测试mm.mysql是否符合jdbc 2.0的规范
<%@ page import="java.sql.*" %>
<%
out.println("通讯录!");

try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();

}
catch (Exception E) {
out.println("Unable to load driver.");

}

try {
Connection C = DriverManager.getConnection("jdbc:mysql://localhost/addressbook?user=root&password=jjx&useUnicode=true&characterEncoding=8859_1");
Statement s=C.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs=s.executeQuery("select * from addressbook");
out.println("<table border=1>");
int i=1;
for (i=10;i<20;i++)
{
if (rs.absolute(i))
{
out.println("<tr><td>");
out.println(rs.getString(1));
out.println("</td>");
out.println("<td>");
out.print(rs.getString(2));
out.println("</td>");
out.println("<td>");
out.print(rs.getString(3));
out.println("</td></tr>");
}
else
{
break;
}

}
out.println("</table>");
rs.close();
s.close();
C.close();


}
catch (SQLException E) {
out.println("SQLException: " + E.getMessage());
out.println("SQLState: " + E.getSQLState());
out.println("VendorError: " + E.getErrorCode());
}

%>

posted @ 2009-06-07 12:57 Talo 阅读(631) | 评论(0) |  编辑
     摘要: use testif (object_id('tbl_cursor') is null)begin--select i_id,s_user,s_pass into tbl_cursor select i_id,s_user,s_pass from test01--这是错误的select i_id,s_user,s_pass into tbl_cursor from test01select * i...  阅读全文
posted @ 2009-06-03 19:03 Talo 阅读(113) | 评论(0) |  编辑
     摘要: 游标 游标 游标 游标 游标  阅读全文
posted @ 2009-06-03 16:50 Talo 阅读(45) | 评论(0) |  编辑
     摘要: 在电脑加入域的情况下,使用ADOConnection控件配置数据源时,在“选择或输入服务器名称”里只能识别“.”,而其他的IP地址以及机器名都不能解析(识别:找不到服务器地址),即在“在服务器上选择数据库”里找不到可选的数据库。  阅读全文
posted @ 2009-06-03 10:44 Talo 阅读(131) | 评论(1) |  编辑