2007年06月04日

        工作了一段时间以后突然觉得有些迷茫。。

       不变的生活模式让人感到了厌烦。。

       那就改变吧。。。

       挑战GCT。。

      听说考试不是很难。。

      可惜自从走出校园。。我就把所有的东西都还给了老师。。

     哎,从头再来吧。。

     2007年6月4日,sunny 进入备战阶段。。

     下面是几个不错的GCT 网站,提供给和SUNNY 一样备战的战友们。。。。

     http://www.gct.edu.cn/  我在上面下载了一些学习资料,不过还没仔细看呢。。

     http://www.tekao.com/gct/index.php 

     http://www.kaogct.com/

 

  

2006年08月18日

1、插入代码段

      方法一:“Ctrl+k,Ctrl+x“

      方法二:“Ctrl+j,Tab,tab”

2,启动调试 F5

3,开始执行(不调试)Ctrl+F5

 

2006年08月17日

1、DateTime 数字型

System.DateTime currentTime=new System.DateTime();
  1.1 取当前年月日时分秒

currentTime=System.DateTime.Now;
  1.2 取当前年

int 年=currentTime.Year;
  1.3 取当前月

int 月=currentTime.Month;
  1.4 取当前日

int 日=currentTime.Day;
  1.5 取当前时

int 时=currentTime.Hour;
  1.6 取当前分

int 分=currentTime.Minute;
  1.7 取当前秒

int 秒=currentTime.Second;
  1.8 取当前毫秒

int 毫秒=currentTime.Millisecond;
(变量可用中文)
  1.9 取中文日期显示——年月日时分

string strY=currentTime.ToString("f"); //不显示秒
  1.10 取中文日期显示_年月

string strYM=currentTime.ToString("y");
  1.11 取中文日期显示_月日

string strMD=currentTime.ToString("m");
  1.12 取当前年月日,格式为:2003-9-23

string strYMD=currentTime.ToString("d");
  1.13 取当前时分,格式为:14:24

string strT=currentTime.ToString("t");
  2、字符型转换 转为32位数字型

  Int32.Parse(变量) Int32.Parse("常量")

  3、 变量.ToString()

  字符型转换 转为字符串
  12345.ToString("n"); //生成 12,345.00
  12345.ToString("C"); //生成 ¥12,345.00
  12345.ToString("e"); //生成 1.234500e+004
  12345.ToString("f4"); //生成 12345.0000
  12345.ToString("x"); //生成 3039 (16进制)
  12345.ToString("p"); //生成 1,234,500.00%

  4、变量.Length 数字型

  取字串长度:

  如: string str="中国";

int Len = str.Length ; //Len是自定义变量, str是求测的字串的变量名
  5、字码转换 转为比特码

  System.Text.Encoding.Default.GetBytes(变量)

  如:byte[] bytStr = System.Text.Encoding.Default.GetBytes(str);

  然后可得到比特长度:

  len = bytStr.Length;

  6、System.Text.StringBuilder("")

  字符串相加,(+号是不是也一样?)

  如:

System.Text.StringBuilder sb = new System.Text.StringBuilder("");
sb.Append("中华");
sb.Append("人民");
sb.Append("共和国");
  7、变量.Substring(参数1,参数2);

  截取字串的一部分,参数1为左起始位数,参数2为截取几位。

  如:string s1 = str.Substring(0,2);

  8、取远程用户IP地址

String user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString();
  9、穿过代理服务器取远程用户真实IP地址:

if(Request.ServerVariables["HTTP_VIA"]!=null){
string user_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
}else{
string user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString();
}
  10、存取Session值

Session["变量"];
  如,赋值:

Session["username"]="小布什";
  取值:

Object objName=Session["username"];
String strName=objName.ToString();
  清空:

Session.RemoveAll();
  11、用超链接传送变量

String str=Request.QueryString["变量"];
  如在任一页中建超链接:<a href=Edit.aspx?fbid=23>点击</a>

  在Edit.aspx页中取值:String str=Request.QueryString["fdid"];

  12、创建XML文档新节点

  DOC对象.CreateElement("新建节点名");

  13、将新建的子节点加到XML文档父节点下

  父节点.AppendChild(子节点);

  14、 删除节点

  父节点.RemoveChild(节点);

  15、向页面输出:Response

Response.Write("字串");
Response.Write(变量);
  跳转到URL指定的页面:

Response.Redirect("URL地址");
  16、查指定位置是否空字符

char.IsWhiteSpce(字串变量,位数)——逻辑型;   
  如:

string str="中国 人民";
Response.Write(char.IsWhiteSpace(str,2)); //结果为:True, 第一个字符是0位,2是第三个字符。
  17、查字符是否是标点符号

char.IsPunctuation(”字符”) –逻辑型
  如:

Response.Write(char.IsPunctuation(”A”)); //返回:False
  18、把字符转为数字,查代码点,注意是单引号。

  (int)”字符”

  如:

Response.Write((int)”中”); //结果为中字的代码:20013
  19、把数字转为字符,查代码代表的字符:(char)代码

  如:

Response.Write((char)22269); //返回“国”字。
  20、 清除字串前后空格: Trim()

  21、字串替换

  字串变量.Replace("子字串","替换为")

  如:

string str="中国";
str=str.Replace("国","央"); //将国字换为央字
Response.Write(str); //输出结果为“中央”
  再如:(这个非常实用)

string str="这是<script>脚本";
str=str.Replace("<","<font><</font>"); //将左尖括号替换为<font> 与 < 与 </font> (或换为<,但估计经XML存诸后,再提出仍会还原)
Response.Write(str); //显示为:“这是<script>脚本”
  如果不替换,<script>将不显示,如果是一段脚本,将运行;而替换后,脚本将不运行。

  这段代码的价值在于:你可以让一个文本中的所有HTML标签失效,全部显示出来,保护你的具有交互性的站点。

  具体实现:将你的表单提交按钮脚本加上下面代码:

string strSubmit=label1.Text; //label1是你让用户提交数据的控件ID。
strSubmit=strSubmit.Replace("<","<font><</font>");
  然后保存或输出strSubmit。

  用此方法还可以简单实现UBB代码。

  22、取i与j中的最大值:Math.Max(i,j)

  如 int x=Math.Max(5,10); // x将取值 10

  加一点吧 23、字串对比……

  23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法:

  (1)、

string str1; str2
//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如:
if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); }
  (2)、

//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.
  (3)、

//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.
  24、查找字串中指定字符或字串首次(最后一次)出现的位置,返回索引值:IndexOf() 、LastIndexOf(), 如:

str1.IndexOf("字"); //查找“字”在str1中的索引值(位置)
str1.IndexOf("字串");//查找“字串”的第一个字符在str1中的索引值(位置)
str1.IndexOf("字串",3,2);//从str1第4个字符起,查找2个字符,查找“字串”的第一个字符在str1中的索引值(位置)
  25、在字串中指定索引位插入指定字符:Insert() ,如:

str1.Insert(1,"字");在str1的第二个字符处插入“字”,如果str1="中国",插入后为“中字国”;
  26、在字串左(或右)加空格或指定char字符,使字串达到指定长度:PadLeft()、PadRight() ,如:

<%
string str1="中国人";
str1=str1.PadLeft(10,”1”); //无第二参数为加空格
Response.Write(str1); //结果为“1111111中国人” , 字串长为10
%>
  27、从指定位置开始删除指定数的字符:Remove()

  28.反转整个一维Array中元素的顺序。

har[] charArray = "abcde".ToCharArray();
Array.Reverse(charArray);
Console.WriteLine(new string(charArray));
  29.判断一个字符串中的第n个字符是否是大写

string str="abcEEDddd";
Response.Write(Char.IsUpper(str,3));

2006年08月10日

select * from test1 where a is null     找出字段a 为空的纪录

select  ifnull(a,"NULLTEST")  FORM  TEST1  如果字段a 为空输出"NULLTEST",如果不为空,输出字段本身的值

2006年02月28日
一、分页写法小例:
select first 10 templateid,code,name from template ;
select first 10 skip 10 templateid,code,name from template ;
select * from shop rows 1 to 10;  –firebird2.0支持这种写法

二、–更新字段注释
update RDB$RELATION_FIELDS
set RDB$DESCRIPTION = ‘描述信息’
where (RDB$RELATION_NAME = ‘SHOP’) and
(RDB$FIELD_NAME = ‘CREDIT_BUY’)

三、–显示字段注释
select RDB$FIELD_NAME,RDB$DESCRIPTION from RDB$RELATION_FIELDS
where (RDB$RELATION_NAME = ‘SHOP’)
and
(RDB$FIELD_NAME = ‘CREDIT_BUY’)

四、–更新表注释
update RDB$RELATIONS set RDB$DESCRIPTION = ‘描述信息’ where RDB$RELATION_NAME=’TABLE_NAME’

五、–查询所有的表和视图(包括系统表和系统视图)
SELECT RDB$RELATION_NAME FROM RDB$RELATIONS;

六、–查询所有的用户表和用户视图
SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0;

七、–查询所有的用户表
SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0 AND RDB$VIEW_BLR IS NULL

八、查所有用户表、用户视图所有字段及相关定义
  SELECT a.RDB$RELATION_NAME, b.RDB$FIELD_NAME, b.RDB$FIELD_ID, d.RDB$TYPE_NAME,
  c.RDB$FIELD_LENGTH, c.RDB$FIELD_SCALE
  FROM RDB$RELATIONS a
  INNER JOIN RDB$RELATION_FIELDS b
  ON a.RDB$RELATION_NAME = b.RDB$RELATION_NAME
  INNER JOIN RDB$FIELDS c
  ON b.RDB$FIELD_SOURCE = c.RDB$FIELD_NAME
  INNER JOIN RDB$TYPES d
  ON c.RDB$FIELD_TYPE = d.RDB$TYPE
  WHERE a.RDB$SYSTEM_FLAG = 0
  AND d.RDB$FIELD_NAME = ‘RDB$FIELD_TYPE’
  ORDER BY a.RDB$RELATION_NAME, b.RDB$FIELD_ID
九、查找某表的所有字段及相关定义
  SELECT A.RDB$FIELD_NAME, B.RDB$FIELD_TYPE, B.RDB$FIELD_LENGTH, B.RDB$FIELD_PRECISION, B.RDB$FIELD_SCALE
  FROM RDB$RELATION_FIELDS A, RDB$FIELDS B
  WHERE A.RDB$RELATION_NAME = ‘tablename’
  AND A.RDB$FIELD_SOURCE = B.RDB$FIELD_NAME
  ORDER BY A.RDB$FIELD_POSITION
十、查找某表的主键定义字段
  select A.RDB$FIELD_NAME FROM RDB$INDEX_SEGMENTS A, RDB$RELATION_CONSTRAINTS B
  WHERE B.RDB$CONSTRAINT_TYPE = ‘PRIMARY KEY’
  AND B.RDB$RELATION_NAME = ‘tablename’
  AND A.RDB$INDEX_NAME = B.RDB$INDEX_NAME
  ORDER BY A.RDB$FIELD_POSITION
十一、查找某表的外键定义  
  select r1.RDB$CONSTRAINT_NAME, rind.RDB$FIELD_NAME, r2.RDB$RELATION_NAME
  FROM RDB$RELATION_CONSTRAINTS r1, RDB$RELATION_CONSTRAINTS r2, RDB$REF_CONSTRAINTS ref, RDB$INDEX_SEGMENTS rind
  where r1.RDB$RELATION_NAME = ‘tablename’
  and r1.RDB$CONSTRAINT_TYPE = ‘FOREIGN KEY’
  and r1.RDB$CONSTRAINT_NAME = ref.RDB$CONSTRAINT_NAME
  and ref.RDB$CONST_NAME_UQ = r2.RDB$CONSTRAINT_NAME
  and r1.RDB$INDEX_NAME = rind.RDB$INDEX_NAME
十二、触发器的控制
update RDB$TRIGGERS set RDB$TRIGGER_INACTIVE=1   where RDB$TRIGGER_INACTIVE=0
十三、选出所有含有外健的子表
select  distinct  rdb$relation_name  from  rdb$relation_constraints   where rdb$constraint_type=”FOREIGN KEY”;
2005年07月15日

****摘抄**************************** 对一名软件开发人员而言,计算机语言只是手段,开发平台是工具,而技术才是真正的实现。所以任何一位在软件开发领域奋斗的朋友,都应努力把握目前软件开发的主流技术与知识,才能在这个领域中立于不败之地。 多层模式(N Tier) 从事过Windows下MIS程序开发的人,都很清楚C/S是怎样实现的,在此笔者并不是要抛弃两层模式,只是希望通过笔者的描述帮助大家建立概念及了解三层结构带给我们的是什么空间。 误解一:C/S退出历史舞台了 笔者以为,C/S并没有到这么惨的地步,任何一个项目或任何一种方案,都要分析一下它实现的是什么东西,并且它将要面对的最终用户是什么性质。比如开发一个在Windows下运行的程序,或开发一个在局域网内并且只针对少量用户的程序,或者一个管理程序、后台运行程序,未必一定强求使用多层模式,因为它并不能给你带来什么,反而会增加你的工作量与维护量。 我们不应该单纯追求技术的先进性,而要追求实用技术,当你要实现一个方案时,你要分析项目的性质及最终用户,然后再寻找能解决你问题的最实用手段。因为用户并不关心你采用多么先进的技术,用户关心的是可靠(Reliable)、快速(Rapid)、方便(Convenient)。 误解二:多层模式只适用于大型项目 这是常见的一种误区,包括笔者自己,在进入N Tier领域之前都是这种想法。但随着对N Tier了解的不断深入,才发现这种理解是错误的。具体的选择应根据项目的特点及面向的最终用户群性质来决定。 如果你的项目运行在广域网,就必须考虑数据的安全以及带宽问题,或者当你面对的是普通用户,他们不可能完成复杂的程序设置、安装等工作,或者简单地讲,如果你要实现一种零成本或者最小成本的最终用户维护,你就必须考虑采用N Tier的B/S模式来开发该系统。 我们习惯把N Tier模式称作三层结构体系,因为N Tier实际上是三层结构的变体。正确理解三层结构对于程序员而言非常重要,因为这里面包含着许许多多的理论和技术背景,融合了多少天才式人物的奋斗,才有了我们今天成熟的N Tier开发基础。 三层结构的技术实现手段 要开发一个三层结构,这些技术是必不可少: 中间件、通信协议以及交易模式。 中间件 中间件是构造应用服务器不可缺少的。目前在Window平台下通用的三层结构中间件有下面几种: Midas、CORBA、COM/DCOM/COM+以及Asta。 Midas是Borland公司从Delphi 3开始达到应用级的产品,功能强大,也是Borland公司的旗艇产品,可应用在Windows及Linux下; CORBA是OMG(对象管理组织)推出的产品,有强大的跨平台能力; COM/COM+是Microsoft的拳头产品,也是每次Microsoft都要宣传的理念之一,目前已整合到操作系统中。它的结构非常庞大,如果把Midas比喻成一只野马,那COM+就像是一头狮子。狮子看起来比野马强壮很多,但要驯服它却很不容易。最后一个是Asta中间件,可能大家不太熟悉,实际上从1997年开始Asta公司就致力于发展这个产品。它内嵌了Socket连接,有强大的“消息”开发机制。 通信协议(或连接方式) 通用的中间件连接模式有TCP/IP(如Socket)、DCOM、CORBA等。程序员经常会把DCOM与COM混淆,实际是有区别的,COM只是一种服务提供,而DCOM才能使COM真正发挥它的魅力,DCOM在COM的基础上增加了分布的概念。目前,微软又新推出了.NET,对DCOM进行了发展和完善。 Midas既可使用DCOM连接,也可使用Socket连接,Borland公司在Delphi 5中对Midas进行了核心性的改造,所以要使用Midas,一定要看Delphi 5以上版本的书籍。 COM/COM+只能使用DCOM连接,CORBA使用自己的连接协议。这里笔者还想提一下DCOM,DCOM连接虽然优点很多,但设置过于复杂,所以连Microsoft也承认其缺陷。Microsoft在.NET平台中将首推SOAP连接协议,SOAP是建立在HTTP上层的协议,主要为了适应XML的发展,目前已得到许多大公司的支持(如IBM、Oracle等)。 交易模式 最著名的是MTS,它的英文全称是Microsoft Transaction Server,交易模式实现的功能非常多,比如,多段提交模式,其Pooling技术,也就是缓冲池技术,让数据提交更加安全、快速。很难想像,如果没有交易模式,三层结构要做什么:你要自己动手写大量的代码实现事务机制,如果解决得不好,还降低了程序的可靠性与速度。而MTS是建立在系统层的,可以帮助你解决许多本应在程序里解决的东西。还有一点要记住,目前市面上Windows开发平台上,只有Delphi与VC才能真正发挥MTS的功能。 三层结构编程要点   对此笔者不想讲太多理论,只给大家一句经典名言,这句话每个程序员都应该牢牢记住:All business logic in the Middle Tier(所有的商业逻辑处在中间层上)。如果不这样,你开发的三层结构程序就不专业,或者只是C/S模式的翻版产品。这句话虽然很简单,要达到这一境界却需要大量的经验积累。   另一个要领是: 一定要尽量减少应用服务器与前台程序的数据传递量以及Round Trip。因为如果你的三层结构存在频繁的Round Trip,那么你开发的应用服务器效率一定非常低下,当同时进入10个连接时,你就会发现应用服务器接近瘫痪。   在开发三层结构的系统时,应该养成一种好习惯,就是在系统分析或者设计报告中,较为详细地描述如何解决商业逻辑、如何有效降低数据传递量,以及只使用必要的Round Trip。只有这样,别人才能与你一起探讨你的解决方案是否合理,是否有更有效的实现方式。同时,经过不断归纳,提高自己的系统分析能力。   在开发大量用户连接的应用服务器时,多线程技术是必要的,否则当应用服务器在处理一个用户的请求时,另一用户只能等待,如果这种等待的时间太长了,用户就会对软件失去信心。还有一个是分布式的概念,你可以根据商业逻辑来切分,开发并发布多个应用服务器解决不同的商业逻辑;或者你可以将运行应用服务器的多个进程分布在不同的服务器中,并根据访问流程自动引导用户到合理的应用服务器中。   正是因为三层结构比C/S复杂,所以你要成为三层结构的高手,一定要经过一段较长的时间和大量项目的锻练。但三层结构体现了一个开发人员与系统人员的专业素质,因为它涉及太多东西: 技术工具的选型、模块化和组件化思想、前后台功能的分割等等。从真正意义上来讲,只有三层结构的项目才能完整反映软件项目的每个过程。 B/S模式与发展   主流的软件架构B/S与N Tier模式都有一些缺点,所以现在出现了许多B-N Tier的系统,就是基于Web浏览器的多层结构开发模式,它吸收了两者的优点。   我们知道单纯的B/S方式,虽然很令人兴奋,并且最终用户使用成本几乎为零,但它存在许多不足,它的功能较弱,无法非常容易地实现你的理念。比如你要实现一种商业模型,你会发现实际上Web方式是不安全、不可靠的,比如,用户可通过页面回退或前进来改变你所有希望的结果、报表制作能力不足等。   为什么Web会造成逻辑实现上的困难?因为它是基于Stateless(无状态)的。打个比方,Stateless就是这样一种情形:你与你的用户中间有一道墙,你并不知道墙另一边的用户长得什么样子,甚至是男是女你都不知道,然后你通过墙上的一个小窗递给他一件礼物,至于礼物最终的流向,你也一无所知,这就是Stateless。所有基于HTTP的东西都是Stateless的。而Socket的魅力就在于它是有状态的。   笔者以为现在发展起来的ASP、jsP、Java技术,都是在弥补HTTP协议存在的无状态缺陷,但即使有了这些工具,仍会觉得网页编程无法随心所欲,因为这些技术再先进,也无法解决HTTP协议基于Stateless的事实。   也许有人会问,这些动态网页开发技术是如何在一定程度上避免了Stateless的弊端的?以基于IIS的ASP技术来说,它使用Session变量来实现State。但是不管什么技术,最终都落在了COOKIE上,也就是使用COOKIE来保留客户端状态。   这里还要提一下Socket。Socket目前应用十分广泛,ICQ、QQ等即时通讯软件,还有许多网络工具,大都基于Socket,因为Socket协议是有状态的,所以才能做到这一点。可以这么说,是Socket让网络生活更精彩! 目前基于Web的多层结构采用的底层技术主要有SOAP+State类协议或者HTTP+State类协议。这里有一个Delphi程序员的好消息,从Delphi 6开始引入WebSnap包(一种Web Provider产品),它的设计者被Borland公司称为Borland历史上最伟大的工程师之一。它同时支持HTTP与SOAP协议,也采用了一种类似Session变量的模式来实现有状态(State)。它可以说是目前市面上最强大的基于平台的Browse/Server开发工具之一,其不足是它还不能称为完全的RAD工具,而且门槛较高。为什么不是ASP或者ASP.NET呢?笔者认为ASP不是基于平台的,它是基于脚本语言的,它的运行效率不高,而且它的调试困难。在Delphi 7中还引入了IntraWeb控件包,笔者以为它是一种真正意义上的网页RAD开发工具,与WebSnap配合更会如虎添翼。   Web Provider、逻辑组件、多线程处理、交易机制、消息流转等组合在一起是N Tier开发的最高境界,笔者以为是大型商业软件架构的首选。笔者在前面很少提到消息机制,主要是怕大家混淆了概念,消息机制并不一定在所有的多层结构中都存在,而且,如果要实现消息机制,必须寻找实现手段(比如使用Socket),否则,如果在程序中强制实施大量消息流转(比如使用定时器监控和消息数据表方式),无论是效率还是实现的复杂性来讲都是要考虑的问题。 软件开发人员的选择   笔者愿意把软件设计看成音乐艺术,它有许多流派,也有主流,但并不意味着别的思想被彻底抛弃。比如单层结构或C/S方式,许多人仍然在用,而且很擅长。笔者不鼓励读者抛弃这些传统的东西,笔者的意思是要扩大眼界,开放思想。而多层反映的是一种集成的思想,以安全、高效、图形方式整合系统,以组件思想逐步构架整个公司的商业逻辑,并降低最终用户使用成本。其最核心的思想是集中,所有中间层是集中的,可以在不同的服务器上运行不同的商业逻辑组件(比如.NET),但这个逻辑组件一定是提供给所有前端程序使用的。现在许多企业都在走系统集中的道路,集中可以带来无限的好处,但没有软件平台的支撑,集中是非常肤浅的。我们追求的不单纯是机器的集中,机器的集中会同时带来网络带宽的压力,只有应用集中了,才能最终达到合理配置资源的目的,这也是为什么我们要用多层体系、要用分布式思想来构建企业应用的真正原因。   笔者以为,在软件开发的今天,作为一名专业人员,如果总在单层或C/S构架下,永远形成不了系统思想,只有多层体系才能真正体会软件生命周期的理念,从需求分析形成商业逻辑到系统设计、数据库结构设计、组件化程序编写、测试、推广,一个好的N Tier系统一定要踏实地做好各个阶段的工作。这不像程序语言的变化或者开发环境的简单变换,因为它是一种开发思想与开发模式的完全变革,所以它也一定是一个过程,不可能要求自己在一两个月内就能真正体会并开始驾驭N Tier模式,但商业模式变了,开发思想也要变,你必须也只能让自己去适应新的思想,才能成为一名更加专业的开发人员。一旦你进入了N Tier的殿堂,并熟练掌握了这种开发模式,就会发现你开始逐渐形成了软件开发的系统思想,并且在这个领域上越走越在前面,开发也会越来越有激情。&nbs

2005年07月09日

……纪录点点滴滴

查找替换自定字符串中的子字符串

function Replacing(S,source,target:string):string;
var site,StrLen:integer;
begin
  while pos(source,s) >0 do
  begin
    site:=pos(source,s);
    StrLen:=length(source);
    Delete(s,site,StrLen);
    Insert(target,s,site);
  end;

  Result:=s;
end;

 

2005年07月07日

1)不错的异常纪录工具http://clevercomponents.com/articles/article012/exwatcher.asp

如果你需要纪录程序中发生异常的具体信息,你可以去这个网址看看,还不错!

2)设定可选参数

function example(a:integer;b:string;e:exception=nil):integer;

 这样就可以把参数e设定成可选的了

2005年07月04日

运行期包中应当只包含所需要的单元。那些属性编辑器和组件编辑器的单元应当放在设计期包中。注册单元也应当放在设计期包中。

包的命名遵循下列模式:
iiiLibvv.pkg—设计期包
iiiStdvv.pkg—运行期包
其中,iii代表一个3字符的前缀,用于标识公司、个人或其他需要标识的事情。vv代表包的版本号,其中也包含了Delphi的版本号。
注意包名称中的lib或std分别表示这是设计期包还是运行期包。例如,
DdgLib50.pkg—设计期包
DdgStd50.pkg—运行期包

2005年02月23日

学习DELPHI 的日记

200486      星期五                           

记下积攒的代码,以备查询方便。

1,  按钮状态的设定

代码如下:

procedure TfrmSkillInfo.DataSource1StateChange(Sender: TObject);

begin

 if DataSource1.DataSet<>nil then

  //DataSource1.State处于编辑或插入状态时,添加按钮、修改按钮、删除按钮,同时失效

   begin

       BtnAdd.Enabled:=not (DataSource1.State in [dsEdit, dsInsert]);

       BtnModify.Enabled:=BtnAdd.Enabled;

       BtnDelete.Enabled:=BtnAdd.Enabled;

       BtnSave.Enabled:=not(BtnAdd.Enabled);

       BtnCancel.Enabled:=not(BtnAdd.Enabled);

     end;

end;

 

 

 

 

 

 

 

 

 

 

2,使用非DB控件ComboBox1,使它的下拉列表中显示数据库中某表中某一列的内容。

代码如下:

ADODataSet2.First;

  while not ADODataSet2.eof do

 

  begin

     ComboBox1.Items.Append(ADODataSet2.FindField(‘Name’).Asstring);

     ADODataSet2.Next;

  end;

3,通过设定主窗体的WindowsMenu属性,来实现类似Word文档中主菜单‘窗口‘的功能

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2004.9.17                           星期五               中雨转多云                 

 

 

今天接触了一种新的类:Tregistry

通过查帮助,了解到以下信息

Use TRegistry to encapsulate access to the Windows system registry in an application. 在一个应用程序中,利用Tregistry类来压缩访问WINDOWS系统的注册表)。The registry is a database that an application can use to store and retrieve configuration information.注册表是一个为应用程序存储信息或重新构建信息的资料库)。 Configuration information is stored in a hierarchical tree.(构造信息被存放在一个等级树中)。 Each node in the tree is called a key. (树中的每个节点被叫作一个键)。Every key can contain subkeys and data values that represent part of the configuration information for an application.(每个健能够包括若干个子键和数据值用来描述应用程序的部分构造信息)

 

 

 

All keys that an application creates, opens, reads, or writes are subkeys of predefined root keys. (所有应用程序创建,打开,读取,写入的健都是预先设定的根健的子键)。By default, a TRegistry object is created with a root key of HKEY_CURRENT_USER.(通过默认值,一个带有根键HKEY_CURRENT_USER的注册表对象被创建)

 

 

 

Only one key is accessible at a time in a TRegistry object.(在注册表对象中每次只有一个键是可操作的。) To determine the key that is currently accessible, read the value of the CurrentKey property.(可以通过读取当前键的所有权来确定此键是当前可操作的。) TRegistry methods enable an application to open, close, save, move, copy, and delete keys.                     

One or more data values containing actual configuration information can be stored in a key. (几个键可以储存一个或多个包含实际的构造信息的数据)。TRegistry methods enable an application to query a key to see if it contains data, to read data in a key, and to write data to a key.

 

 

以下是一段写注册表的程序:

 

function WriteRegist(section,keyname,keyValue : String) : Boolean;

var MyReg : TRegistry;

begin

 

   result := False;

   MyReg := TRegistry.Create;

 MyReg.RootKey := HKEY_LOCAL_MACHINE;//HKEY_LOCAL_MACHINE  可以理解为本机参数。 约定成俗的。HKEY_CURRENT_USER 本机用户参数。

 

   try

      if not MyReg.OpenKey(‘\SOFTWARE\’,FALSE) then  // {False because we do not want to create it if it does not exist}如果键能顺利打开则返回true,否则返回false

 

         begin

            Application.MessageBox(‘Windows98/2000的注册表有问题,建议重装系统.’,”,MB_OK) ;

            exit;

         end;

 

 

      if not MYReg.KeyExists(section) then MyReg.CreateKey(section);//判断键名为section的键是否存在

 

      MyReg.OpenKey(‘\SOFTWARE\’+section,False);

 

 

      MyReg.WriteString(keyname,keyValue);

      MyReg.CloseKey;

 

 

      result := True;

   finally

     MyReg.Free;

   end;

end;

N40的作用是设定界面风格

 

procedure TfrmMain.N40Click(Sender: TObject);

begin

   if ColorDialog1.Execute then

   begin

      frmMain.Color := ColorDialog1.Color;

      WriteRegist(SECTION,’MainColor’,Inttostr(ColorDialog1.color));

      frmMain.WindowState := wsNormal;

      frmMain.WindowState := wsMaximized;

   end;

end;

给窗体加上各种颜色的小点点

 

procedure TfrmMain.FormPaint(Sender: TObject);

var    x, x1, y1: Integer;

begin

  Randomize;//初始化随机函数,function Random [ ( Range: Integer) ];

 

其中,参数Range为一整数,

 

该函数返回值也为整数,其范围为:

 

        0< =Random(Range)< Range   (指定Range)

 

  0< =Random< 1   (不带参数Range)

 

 

 

  for x := 1 to 8*(sender as TForm).ClientWidth do

  begin

    x1 := Random((sender as TForm).ClientWidth);

    y1 := Random((sender as TForm).ClientHeight);

    (sender as TForm).Canvas.Pixels[x1, y1] := Random($FFFFFFFF);

  end;

end;

 

 

 

Delphi中随机函数Random应用两则

 

十堰市东风汽车公司技术中心
杨中明

 

-1. 自动随机出题

 

—- 你也许有这样的经历:孩子刚上学,数学老师要你每天给出10或者20道算术题,作为你孩子的家庭作业,你是否有点烦?别着急,电脑可帮你忙!

 

Delphi中,有一随机函数,是这样定义的:

 

function Random [ ( Range: Integer) ];

 

其中,参数Range为一整数,

 

该函数返回值也为整数,其范围为:

 

        0< =Random(Range)< Range   (指定Range)

 

  0< =Random< 1   (不带参数Range)

 

—- 下面的过程for循环里第一条语句:在屏幕上输出九九表内乘法的随机题;第二条语句:在屏幕上输出一百以内的加法随机题。稍加修改,增加一些条件语句你即可得到得减法、除法及四则混合运算的随机题。当然,你也可以直接将结果输出在打印机的画布(Canvas)上,打印给你的孩子做。

 

procedure TForm1.Button1Click(Sender: TObject);

 

var

 

     I: Integer;

 

 begin

 

   Randomize;

 

   for I := 1 to 10 do begin

 

     Canvas.TextOut(20,I*20,

 

 IntToStr(Random(9)+1)+’×’+IntToStr(Random(9)+1)+’=');

 

     Canvas.TextOut(220,I*20,

 

IntToStr(Random(100))+’+'+IntToStr(Random(100))+’=');

 

   end;

 

 end;

 

—- 2. 随机产生体育彩票号码

 

—- 时下体育彩票在全国范围内风行,朋友们买彩票都嫌挑选号码较为头痛,要求我在电脑上想点办法。我想这无非是产生随机数,于是用Delphi的随机函数Random编写了一段程序,具体实现方法见如下程序(SportUnit.pas)。

 

unit SportUnit;

 

interface

 

uses

 

  Windows, Messages, SysUtils, Classes, Graphics,

 

Controls, Forms, Dialogs,

 

  StdCtrls, Buttons, ExtCtrls;

 

 

 

type

 

  TForm1 = class(TForm)

 

    Label1: TLabel;

 

    Label2: TLabel;

 

    Label3: TLabel;

 

    Label4: TLabel;

 

    Label5: TLabel;

 

    Label6: TLabel;

 

    Label7: TLabel;//以上用于放置七位号码

 

    BitBtn1: TBitBtn;

 

    BitBtn2: TBitBtn;

 

    BitBtn3: TBitBtn;

 

    Timer1: TTimer;

 

    Label8: TLabel;

 

    Timer2: TTimer;

 

    procedure BitBtn1Click(Sender: TObject);

 

    procedure BitBtn2Click(Sender: TObject);

 

    procedure Timer1Timer(Sender: TObject);

 

    procedure BitBtn3Click(Sender: TObject);

 

    procedure Timer2Timer(Sender: TObject);

 

  private

 

    { Private declarations }

 

  public

 

    { Public declarations }

 

  end;

 

 

 

var

 

  Form1: TForm1;

 

 

 

implementation

 

 

 

{$R *.DFM}

 

 

 

procedure TForm1.BitBtn1Click(Sender: TObject);

 

 begin

 

  timer1.Enabled:=True;

 

  timer2.Enabled:=True;

 

 end;

 

 

 

procedure TForm1.BitBtn2Click(Sender: TObject);

 

begin

 

   timer1.Enabled:=false;

 

      timer2.Enabled:=false;

 

end;

 

 

 

procedure TForm1.Timer1Timer(Sender: TObject);

 

begin

 

 Randomize;

 

   Label1.Caption:=IntToStr(Random(10));

 

   Label2.Caption:=IntToStr(Random(10));

 

   Label3.Caption:=IntToStr(Random(10));

 

   Label4.Caption:=IntToStr(Random(10));

 

   Label5.Caption:=IntToStr(Random(10));

 

   Label6.Caption:=IntToStr(Random(10));

 

        //随机产生0-9整数

 

   Label7.Caption:=IntToStr(Random(5));

 

        //随机产生0-4整数,第七位为特别号

 

   Application.ProcessMessages;

 

        //处理Windows消息,属简单多线程

 

end;

 

 

 

procedure TForm1.BitBtn3Click(Sender: TObject);

 

begin

 

close;

 

end;

 

 

 

procedure TForm1.Timer2Timer(Sender: TObject);

 

begin

 

Label8.Caption:=FormatDateTime(‘yyyy"年"m"月"d

 

        "日"dddd’,date)+’   ‘+TimeToStr(time);

 

end;

 

 

 

end.

 

 

 

—- 此程序段中的定时器Timer2只为显示时间秒而定义,按钮 BitBtn1和 BitBtn2可以只用一个(求逆反运算即可),所以该程序段还可优化精简。

 

Listbox 的用法

 

删除鼠标点重的行:

 

L i s t B o x 1 . i t e m s . D e l e t e ( L i s t B o x 1 . I t e m I n d e x )