« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
| 公告 |
暂无公告... |
Blog信息 |
blog名称:fermos_blog 日志总数:73 评论数量:261 留言数量:30 访问次数:396675 建立时间:2005年3月27日 |

| |
VFP中多条件数据查询程序的实现 软件技术
fermos的博客 发表于 2005/9/8 7:51:03 |
VFP中多条件数据查询程序的实现
http://www.pcdog.com 2004-12-1 PCdog收集
下一页 1 2
摘要:本文通过具体的实例,介绍了多条件数据查询的设计方法,提供了用于条件输入控件的控制和数据类型匹配的解决方案。
关键词:数据库,多条件查询,数据匹配
数据查询是用户使用各种软件来管理数据的目的之一,也是各种数据库程序设计的重点。用户希望能方便有效快速地找到他们所需的信息
,为各种事务处理提供有力的支持。所以,数据查询作为信息管理软件设计中要实现的一项重要功能,必须具有良好的数据界面和方便的操作及灵活的查询功能,这也是信息管理软件开发人员所追求的目标。
1 用VFP系统命令进行查询操作的不便之处
在Visual FoxPro数据管理系统中,设置了查询命令和查询向导,可以进行数据库表记录的选择、分组查询、多表查询及查询结果数据的输出等功能,能够产生独立的查询文件,通过调用该文件可得到所需要的数据。但这些分散的功能命令和文件不适用于数据库应用程序的查询操作,使用这种方式设计的数据库应用程序,用户必须熟知VFP系统命令、操作、数据类型的匹配方式及各种数据表之间的关系才能有效的查询到自己所需的信息,这给用户进行数据查询操作带来极大的不便。如果能把数据库表文件的选择、查询结果输出字段的选定、不定数量查询条件的输入、条件表达式中数据类型的匹配及查询结果的输出等操作容为一体,设计在一个查询程序中,则查询操作将变得非常方便灵活而且简单。
2 查询程序的设计
为了使查询程序具有良好的交互功能和方便操作,可使用如图1所示操作界面。在此查询程序中,查询操作只需要在窗口提供的数据库表中选择所要查询的数据表,在选择字段项的列表框中选定要显示的数据字段,在选择条件项中设置查询的数据条件,最后点击查询按钮,则查询结果数据将按图2所示的表格列出。其中,图1 中选定的字段将作为图2 中的表格标题,图2表格中的数据为图1选定的数据表中符合条件的数据记录。图1中输入的条件为:来款日期为1999年10月以后且来款单位含有"宝钢"的记录,并在图2的表中显示出来款日期、来款单位、来款数和室别。
2.1 控件设置
在图1所示查询窗体上设置Option控件、ListBox控件组、条件设置控件组。
Option控件用于选择当前所要查询的数据库表。
ListBox控件组分别用于源数据表的字段列表和被选择字段名列表。选择项ListBox控件作为查询数据表中的字段名,被选项ListBox控件作为查询结果显示的字段名,这将作为如图2 所示的查询结果表格标题。 条件设置控件组由ListBox、ComboBox及CommandButton按钮等组成,完成数据表字段选择、关系运算符选择和条件表达式输入等功能,多个条件无逻辑运算符时默认为"AND"操作,否则使用"OR"按钮插入"OR"操作符。TextBox作为条件表达式输入控件,其中的数据类型(字符、数值、日期型数据)都直接输入,不使用定界符,在程序内部进行数据类型转换处理,这样可避免了不同类型数据的定界符输入。
2.2 条件输入的制作方法
查询条件项的操作是输入查询的条件表达式。它应满足字段选择和关系操作运算符选择的灵活性和稳定性,即字段名称应是数据表中的字段名,否则进行查询操作时字段名称可能产生不匹配的问题,因此最好使用下拉列表框来控制。基于同样的理由,关系操作运算符也由下拉列表框来控制。
图1所示的条件输入控制项由ComboBox、TextBox及CommanButton组成。其中两个ComboBox控件分别用作条件变量的字段名和关系运算符(>、<、=、Like、$等)的选择,TextBox控件用作条件表达式中的数值项的输入。每输入完一个查询条件后,单击"插入"按钮将此条件加入ListBox中,作为ListBox的一行显示,同时,条件输入控制项下移一行,等待下一个条件表达式的输入。为了使ListBox控件的选择、修改、插入和删除等操作更为灵活,使用临时数据表itemadd存放条件表达式,一个条件作为一个记录项,并与ListBox绑定。当条件输入完毕后,若单击窗体其他位置,条件输入控制项将隐藏。若要修改某个条件行时,鼠标点击ListBox的该行,条件输入控制组自动移到当前行显示,等待进行数据修改。该操作通过MOVE方法来实现,以下程序段是插入按钮和删除按钮的代码。
插入新条件:
select itemadd &&插入一个新条件 insert blank this.parent.listxztj.setfocus &&设置焦点为ListBox this.parent.listxztj.selected(curec)=.T. &&在插入记录之后选定ListBox中的该项 topToindex=curec-this.parent.listxztj.topindex if topToindex<=4 &&4为列表区的行数,如果条件项数在4项内 clisthigh=thisform.clistop+topToindex*thisform.rowleng &&行高 this.parent.listxztj.setfocus this.parent.comBtjzd.move(36,clisthigh) this.parent.comnot.move(148,clisthigh) this.parent.comupdn.move(367,clisthigh) this.parent.combcondit.move(170,clisthigh) this.parent.textexam.move(263,clisthigh) *关闭输入方式 this.parent.comnot.visible=.F. &&隐藏输入条件项 this.parent.comupdn.visible=.F. this.parent.combcondit.visible=.F. this.parent.textexam.visible=.F. else &&条件项数超过4项,使ListBox的滚动条上移一行 this.parent.listxztj.setfocus this.parent.listxztj.selected(recc("itemadd"))=.T. keyboard "{dnarrow}" this.parent.comnot.visible=.F. this.parent.comupdn.visible=.F. this.parent.combcondit.visible=.F. this.parent.textexam.visible=.F. endif this.parent.combtjzd.setfocus 删除按钮的代码如下:
curec=recno("itemadd") &&curec为在ListBox中选择的当前记录号 dele pack if recc("itemadd")=0 &&当itemadd库中无记录时 insert blank this.parent.combtjzd.setfocus this.parent.listxztj.listindex=recno("itemadd") this.parent.listxztj.selected(recno("itemadd"))=.T. return endif if curec>recc("itemadd") go recc("itemadd") else go curec endif this.parent.listxztj.selected(recno("itemadd"))=.T. topToindex=recno("itemadd")-this.parent.listxztj.topindex if topToindex<=4 &&4为列表区的行数 clisthigh=thisform.clistop+topToindex*thisform.rowleng this.parent.listxztj.setfocus this.parent.comBtjzd.move(36,clisthigh) this.parent.comnot.move(148,clisthigh) this.parent.comupdn.move(367,clisthigh) this.parent.combcondit.move(170,clisthigh) this.parent.textexam.move(263,clisthigh) endif this.parent.listxztj.listindex=recno("itemadd") this.parent.listxztj.refresh this.parent.combtjzd.setfocus
2.3 数据类型的匹配问题
Visual FoxPro中,数据常量依其类型不同而使用不同的定界符。输入时,TextBox必须输入相应的数据类型定界符,否则在查询操作过程中将产生数据类型不匹配的错误而得不到所需要的数据。因此,在查询按钮编写如下程序段对数据类型的匹配问题加以解决。
tjtext=dnam+"."+field(nfield) &&nfield为字段名变量,dnam为数据表 zdtype=type(tjtext) &&求条件字段的数据类型 select itemadd do case &&对不同的数据类型进行不同处理 case zdtype="C" &&数据为字符型,加上定界符[ ] if alltrim(itemadd.tj)<>'$' tjtext=tjtext+" "+alltrim(itemadd.tj)+[ ']+alltrim(itemadd.sl)+['] else tjtext=[ ']+alltrim(itemadd.sl)+[']+alltrim(itemadd.tj)+tjtext endif case zdtype="D" &&数据类型为日期型,使用ctod()转换为日期型 tjtext=tjtext+alltrim(itemadd.tj)+"CTOD(["+alltrim(itemadd.sl)+"])" case zdtype="N" &&数据类型为数值型,可直接使用 tjtext=tjtext+alltrim(itemadd.tj)+alltrim(itemadd.sl) endcase 程序段中,tjtext为字符表达式,存放多个条件项,在以上程序段未尾的SQL语句中作为操作条件:
select &cxtj from &dnam where &tjtext into table cxtemp
其操作结果就是依tjtext中的条件表达式来选定的查询结果,cxtj为查询结果中要输出的字段列表,即将选择字段控制项中的被选字段用","连接起来的字符串。cxtemp为存放查询结果的临时表,为数据显示提供数据源。
2.4 查询结果的显示
一般用户习惯于使用表格形式来显示数据,因此,在查询到数据结果后,使用Grid控件来显示数据较为合式,如图2所示。若采用前期绑定方式将Grid控件预先设置在form中,由于查询数据结果输出的字段名和字段数的不确定性,致使Grid对表中数据的显示出现数据列宽度的不确定,显示后的数据表格需要调整其宽度才能清楚地浏览到所有信息。所以Grid表格的建立放在数据查询已结果产生,且建立了临时表单cxtemp后,采取后期绑定方式,在程序中添加Grid控件,并设置其宽度、高度、显示方式等属性。选定工作区为cxtemp后添加Grid控件,使Grid控件默认的绑定数据源为cxtemp,程序如下:
select cxtemp &&cxtemp为查询结果临时表,由SQL语句生成 go top thisform.pagfrcx.activepage=2 thisform.pagfrcx.paglist.addobject('gridcx','grid') thisform.pagfrcx.paglist.gridcx.visible=.t. thisform.pagfrcx.paglist.gridcx.left=0 thisform.pagfrcx.paglist.gridcx.top=20 thisform.pagfrcx.paglist.gridcx.width=546 thisform.pagfrcx.paglist.gridcx.height=268 thisform.pagfrcx.paglist.gridcx.deletemark=.F. thisform.show
3 结语
本文详细说明了数据表查询程序设计过程中条件输入控件组的设计、数据类型的匹配问题解决及查询结果的输出设计等方法。这些都是从简化查询操作及提高查询的灵活性等要求为出发点进行的设计。当然本文仅对单表查询进行说明,对于多表查询、分组查询及计算没有说明,若要进行复杂操作,还需做进一步的设计。
下一页 1 2
|
|
Visual FoxPro 9中新的数据处理方式 软件技术
fermos的博客 发表于 2005/9/8 7:46:18 |
Visual FoxPro 9中新的数据处理方式
http://www.pcdog.com 2004-12-1 PCdog.com
下一页 1 2 3
Visual FoxPro 9.0与以前的版本相比,在数据引擎上做了很大的改进。从增强的SQL语言到支持新的数据类型和索引都作了增强,本文阐述了这个最新版本作为一个成熟开发平台的魅力。
数据引擎的改变主要体现在以下5个方面:
· 增强的SQL语言:取消了很多硬编码的限制,增强了子
查询和关联查询的支持,支持更复杂的表达式,以及增强了对UNION的支持。
· 性能方面:加入了一个全新的索引方式,增加了过滤型索引的性能,提高了了TOP n ,MIN()/MAX()以及LIKE这些查询子句的性能。
· 命令和函数:对数据操作的更具灵活性,增强对SQL中showplan的支持,增加ICASE()来代替IIF()函数。
· 新的数据类型:支持VarChar、VarBinary和BLOB等新的数据类型,并提供相应的类型转换函数:CAST()。增强了现有函数对数据类型的控制和转换能力
· 远程数据:增强了事务控制的能力,游标机制使得代码逻辑更加清晰,并且对CursorAdapter作了加强,使开发者只需数行代码就可以方便地访问远程视图。
由于提供了与SQL Server强有力的互操作性,Visual FoxPro 9对客户端/服务器模式做了很大的改进。通过支持新的数据类型,并取消了SQL语言的诸多限制,同一套代码可同时运行在本地数据引擎和SQL Server这两种不同的数据源上。
以上是大致的描述,下面让我们深入剖析这些新增功能。
SQL子查询的增强
如果要用一句话来表示SQL子查询的增强程度,那就是:“太多了”!SQL语句中再没有了元素数量的硬编码限制。一个简单的SELECT语句能包括更多的表、连接、子查询、嵌套子查询和联结。
SQL语句中的IN子句中再也没有数量限制。在以前的版本中IN实际被映射到了一个名字INLIST()函数中,但现在这种依赖取消了。这个改变使得IN子句能使用更多的参数来生成非常复杂的SQL语句。与原来版本不同,只要找到相应记录,Visual FoxPro 9会自动停止计算IN子句中的表达式,这将带来性能的提高。
完全无限制?
IN参数表的元素也不是完全无限的,它的最大数量等于函数SYS(3055)的返回值,而这个函数的返回值与实际可用内存有关,因此如果你的可用内存越大,那么IN子句支持的元素就越多。无硬编码的限制并不等于完全无限制。像可用内存以及表达式的复杂性都能决定是否能运行一个非常长而且复杂的语句,你要花很大的功夫才能找出它们在你的机器上的真实极限。
增强的子查询功能
子查询在SQL语言中是一个很有用的功能。它一般处于WHERE子句中的右边,充当一个选择器的作用。在Visual FoxPro 9中,子查询还可以处于SELECT的参数列表中(称为投影)以及FROM子句中(称为派生表)。
当你使用投影时,如果子查询没有返回任何记录,那将返加一个空值(NULL)。投影还允许互相关联,以后我们会讲到这点。 以下使用投影的SQL语句的一个例子:
SELECT ; C.CustomerID, ; C.CompanyName, ; (SELECT YTD_Sales FROM Sales_02 WHERE ; C.CustomerID = Sales_02.CustomerID) AS Y02,; (SELECT YTD_Sales FROM Sales_03 WHERE ; C.CustomerID = Sales_03.CustomerID) AS Y03,; (SELECT YTD_Sales FROM Sales_04 WHERE ; C.CustomerID = Sales_04.CustomerID) AS Y04 ; FROM Customers C 这个SELECT语句返回最后三个会计年度的客户ID和公司名称。
使用投影的限制是子查询只能查询一个字段,并且子查询返回的记录数不能大于1。
投影的另一个有价值的使用方法是它可以成为表达式的一部分,如下所示:
SELECT ; C.customerID, ; C.companyname, ; SUM(D.quantity*D.unitprice) AS CustTotal ,; (SUM(D.quantity*D.unitprice) / ; (SELECT SUM((quantity*unitprice)-discount) ; FROM OrderDetails D2) ; )*100 AS PctTotal ; FROM Customers C ; INNER JOIN Orders O ; ON C.customerID = O.customerID ; INNER JOIN OrderDetails D ; ON O.orderid = D.orderid ; GROUP BY C.customerID, C.companyname, O.orderID ; ORDER BY pctTotal DESC 这个SELECT语句返回客户ID、公司名称、销售额以及销售额占总销售额的百分比。
注意在以上语句中,子查询充当SELECT列表中的一个复杂表达式,并且它还包含一个聚集函数SUM(),这里我们可以看到使用它的灵活性。
子查询的另一种使用场景即派生表,实际你可以将它看作一个逻辑表。
考虑以下的例子:
SELECT ; C.customerid, ; P.product_count AS p_count; FROM Customers C, ; (SELECT c2.customerid, ; COUNT(DISTINCT D.productID) AS p_count ; FROM Customers C2 ; INNER JOIN Orders O ; ON C2.customerid = O.customerid ; INNER JOIN OrderDetails D ; ON O.orderid = D.orderid ; GROUP BY c2.customerid) AS P ; WHERE C.customerID = p.customerID ; AND P.p_count >= ; (SELECT (COUNT(*)*.50) FROM Products) ; ORDER BY p.product_count DESC 这个SELECT语句返回客户ID、所有购买了50%产品的客户,以及它们所购买的产品数量。
观察以上的语句,你可以发现派生表有一个名为“P”的别名,这与普通字段别名的语法一样――都必须用AS子句来表达。而且这个子查询很复杂(在本例中,它关联了两个表),这个派生表还可以作为WHERE子句的一个条件或者将它放在ORDER BY子句中。
与投影不同,派生表能返回多个字段以及多条记录,但它不能相互关联。另外,所有的子查询都会在主句中的SELECT执行之前运行。
子查询还可以充当UPDATE语句中的SET列表。但SET子句只允许使用一个子查询,并且当SET子句使用子查询后,那WHERE子句中就不允许再使用子查询了。
更好的关联支持
新版本中的UPDATE语句和DELETE语句支持关联。这样,一条语句可以引用不同的表,如下所示:
DELETE products ; FROM mfg ; WHERE mfg.productID = products.productID; AND mfg.discontinued = .t. 这个DELETE语句删除mfg表中所有不再生产的产品。
另一个关联UPDATE语句示例如下:
UPDATE products ; SET unitprice = mfg.msrp *.90 ; FROM mfg ; WHERE mfg.productID = products.productID 这条UPDATE语句将零售产品的价格打了九折。可能你会问:它支持子查询吗?当然支持。但使用的时候要格外小心。因为如果子查询没有返回任何记录,那将会返回一个值为NULL的空记录。而这恰恰不是你所希望得到的结果。如下所示:
UPDATE products ; SET unitprice = ; (SELECT ( msrp *.90 ) ; FROM mfg ; WHERE mfg.productID = products.productID) 这条UPDATE语句的作用与上条基本相似,但如果子查询中的产品没有找到的话,那unitprice将被置为NULL。
视图与查询设计器
尽管新版本增强了子查询功能,但不幸的是在视图与查询设计器中并不支持这种增强功能。并且由于SQL中的IN子句中的元素数目取消了硬编码的限制,但视图与查询设计器中并不知道,因此如果你使用设计器,那IN子句还是只支持24个元素。
增强的UNION操作符
由于联结的数量没有了硬编码的限制,你可以在INSERT INTO子句的结果集中使用UNION。也可以在使用UNION的同时使用ORDER BY子句。
性能
不管你是访问远程数据还是依赖于它强大的本地数据库引擎,Visual FoxPro始终将性能考虑在第一位。Visual FoxPro 9进一步地增强了数据引擎的功能。
二进制索引
这种新型的索引使用方法如下:
INDEX ON DELETED() TAG DELETED BINARY
这种索引能与任何非空的逻辑表达式一起使用。除此之外,FOR表达式、ASCENDING、DESCENDING、UNIQUE或CANDIDATE关键字不能与它一起使用。
二进制索引并不支持SET ORDER TO命令,而且INDEX ON命令会将当前的order设为0。但你可在Seek语句中使用二进制索引。
二进制索引最大的优势在于它的索引文件大小。以一个包含800万条记录的表为例,它的二进制索引文件的大小差不多为表大小的三十分之一。尺寸越小意味着在执行APPEND和REPLACE操作时I/O处理速度越快,但遗憾的是所有的Rushmore优化技术目前都还不支持二进制索引。
如果SQL语句返回的记录起过表中总记录的三分之一的话,那Rushmore将得到很好的发挥(当所有的记录都命中的话会提高92%的速度)。如果SQL语句返回的记录低于总记录的三分之一,那Rushmore将变得很慢(如果没有记录命中的话会降低两倍的速度)。
在Visual FoxPro 9中,将DELETE语句设置为二进制索引是一种增强性能的简单方法。但要注意版本的问题,因为以前的版本并不支持这种新的索引方式。
Rushmore优化技术
新版本中有使用了大量的Rushmore优化技术,例如对TOP N[PERCENT]作了优化,这样便能提供更好的性能。它一般与ORDER BY子句配合使用,返回前N个或者前百分比数目的记录。在Visaul FoxPro 9中它减少了内排序操作和文件I/O操作,使得执行这种类型的语句占用更少的内存,并且正如此语句所言,它只返回确切的前N个记录。
在以前的版本中,如果要统计一个班级总分排在前十名的学生,但中间存在并列名次的话,那结果会返回多于10个的记录。
在适当的情况下,Visual FoxPro 9将在FOR DELETED()子句和FOR NOT DELETED()子句中使用过滤索引来对MIN()和MAX()这两个聚集函数进行优化,可以提高MIN()和MAX()的计算速度。
如果LIKE模糊查询语句中的条件以“%”为结尾,那查询速度也将得到很大提高(请注意,“%”只能出现在查询条件的结尾,而不能出现在其它地方,否则优化无效)。这种优化的结果等同于普通WHERE子句查询的速度。
更多的智能索引技术
Visual FoxPro 9比以前的版本更智能化,它充分地让索引获得Rushmore的优化技术,如下所示:
INDEX ON DELETED() TAG DELETED
以上语句自动对NOT DELETED()和DELETED()条件进行优化,不用你添加一条INDEX ON NOT DELETED()来实现。
这里有个特例,就是当索引过过滤表达式采用了FOR NOT DELETED()作为Rushmore的优化,并且SET DELETED设为ON的话,那就无须为 NOT DELETED()作优化。
命令和函数
一些新的命令和函数得到扩展,能够更好地控制Visual FoxPro将读取或写入数据到磁盘中去。
数据访问与提交的细粒度控制
在Visual FoxPro中,
SET REFRESH命令后的第二个参数控制当前内存中数据刷新到磁盘中的间隔时间,原来的版本只能以整数作为最小单位,但现在可以为小数。你还可以将它指定为“?1”,这样可以强迫Visual FoxPro每次只从硬盘中读取数据,从而降低数据丢失的风险,并且这个时间的最小值可以设为“.001”。
如果你将这个值设得过低的话,可能会降低性能,特别是当请求增多,或是跨网络存取数据库时尤其如此,因此要小心谨慎地使用它。
SYS(1104)函数用来清理程序与数据的内存缓冲区,以及数据表的缓冲区。在Visual FoxPro 9中,SYS(1104)的第二个参数用来指定要清理的工作区或者别名,当一个应用打开了很多表时,如果调用SYS(1104),那清理所有的表缓冲区将会很耗时,有了这样的一个参数可以对它进行更好的控制,从而加快系统的响应速度。
FLUSH命令系列可以将对于表、索引、文件的的有修改全部回写到磁盘中去,在Visual FoxPro 9中,FLUSH命令被扩展为两个步骤:先指定要刷新的区域,然后调用FlushFileBuffers函数进行刷新。
尽管你可以通过指定要刷新的文件名、工作区或者表的别名来精细地控制回写的粒度,但有时Visual FoxPro 9回写数据到磁盘后,操作系统仍然不会真正地回写,而是将它继续保留在系统缓冲区中,这时你可以用FORCE关键字强制将系统缓冲区的内容回写到磁盘中。
以下是FLUSH命令的一些用法:
FLUSH "c:\data\customers.dbf" FLUSH "c:\data\customers.dbf" FORCE FLUSH IN 1 FORCE FLUSH IN customer FORCE FLUSH "c:\test.txt" FORCE FLUSH FORCE 在以前的版本中,如果你使用SELECT语句的话,那么数据全部将从磁盘中取得。这意味着如果你想查询一些保存在表缓冲区中的未回写的数据的话,你必须编写一个额外的过程来完成这个功能。现在的版本通过使用SET SQLBUFFERING和SELECT ... WITH(Buffering =<表达式>)使得你可以方便地控制数据到底是从磁盘中取得还是从表缓冲区中获得,如下所示:
SELECT * FROM Customer WITH (BUFFERING = .t.) SELECT * FROM Orders WITH (BUFFERING = lUseBuffer) SELECT DISTINCT c.city, o.shipcity ; FROM customers C WITH (BUFFERING=.T.) ; JOIN orders O WITH (BUFFERING=.T.) ; ON c.customerID = o.customerID 请注意每个表都要给出一个相应的WITH BUFFERING子句,如果不指定的话,Visual FoxPro 9将使用SET SQLBUFFERING中指定的值(缺省为 .f.)。
这是要提醒你的是只有Visual FoxPro 9本地数据才支持缓冲,如果你使用其他的诸如SQL Server等后端数据库做为数据源的话则存在缓冲管理。
CAST()函数
新的CAST()函数模仿的是SQL Server的一个同名函数。它可以在SQL语句中使用,也可以在普通命令中使用。如果在SQL语句中使用它的话,那你的SQL代码更遵循于TSQL规范。正如它的名字所指示的那样,这个函数将一个数据类型转化为另一个数据类型。
SQL语句中使用CAST()函数的语法如下:
SELECT CustomerID, ; CAST(nAmount*nRate AS N(8,2)) ; FROM SALES SELECT CustomerID, ; CAST(nAmount*nRate AS B NOT NULL) ; FROM SALES SELECT CustomerID, ; CAST(nAmount*nRate AS C(10)) ; FROM SALES SELECT foo.*, ; CAST(NULL as I) AS IntegerField ; FROM foo ICASE()函数
另一个名为ICASE()的函数模仿了TSQL的CASE分支。它有点类似于IIF()函数,但它的有价值之处在于它不像IIF()函数那样会形成丑陋并且冗长的代码。
ICASE()函数需要指定相应的“条件/结果”参数对才能工作。第一个参数是条件表达式,如果条件表达式为True的话,那第二个参数就会执行;如果条件表达式为False的话,那第二个参数就会被忽略,转而执行下一个条件/结果参数对。如果参数配对错误,那么系统会报#11错误。
以下是ICASE()函数的使用示例:
nHour = HOUR(DATETIME()) ? ICASE( nHour = 8, "breakfast" , ; nHour = 10, "caffeine" , ; nHour = 12, "lunch" , ; nHour = 15, "caffeine" , ; nHour = 18, "dinner" , ; "snack" ; ) ICASE()中最多能允许100个条件/结果参数对。
SYS(3092):输出到文件
这个新的SYS()函数要与SYS(3054)函数一起协同工作,你可以用SYS(3092)函数为SYS(3054)函数的输出指定一个文件名,于是结果将输出到这个指定文件中去。
以下示例解释了如何将这两个函数结合使用:
SYS(3054,12,"dummyVar") SYS(3092,"ShowPlan.txt") OPEN DATABASE HOME(2)+"Northwind\Northwind" SELECT * ; FROM Customers INTO CURSOR temp1 SELECT * ; FROM summary_of_sales_by_year ; INTO CURSOR temp2 SYS(3092,"") CLOSE DATA ALL MODIFY FILE Showplan.txt NOWAIT 如果你在SYS(3054)的第三个参数不指定具体的变量名,那结果将输出到当前的窗口中去。
新的数据类型
为了更好地与SQL Server兼容,Visual FoxPro 9增加了三个新数据类型:VarChar、VarBinary和BLOB。这些数据类型可以在本地数据库中作为字段类型,也可由CAST()函数创建或者由远程数据取得。
VarChar
它是一种字符型数据类型,但不像普通字符串那样长度不够的时候会以空格被补齐,而是将其截取。这有点类似于SQL Server中的SET ANSI_PADDING ON命令。如果VarChar中本身有空格的话则不会被截取。假如在一个表达式中将VarChar和Character两种数据类型混合计算,那结果会是VarChar类型。
VarChar在Visual FoxPro中是一个定长域,它的最大长度限定为255个字符。但在SQL Server中,一个VarChar域的最大长度可以达到8060字节。
VarBinary
VarBinary与VarChar有些类似,如果没有达到最大长度的话,多余的域不会被填充,而是被截取。但它们的本质区别在于FoxPro不会为VarBinary类型作任何代码页的转换。以下是这两种数据类型的比较:
BLOB
BLOB数据类型没有固定的长度限制,与Memo类型有些相似。它被存储在以.FPT结尾的文件中,被.DBF文件引用。BLOB字段与Memo字段有相同的限定条件,并且他们都不支持索引。
与VarBinary数据类型一样,Visual FoxPro 9不会将BLOB类型作代码页转换,而是保持它原始的二进制格式。
BLOB数据类型的设计意图旨在取代最初的Gerneral字段。如果图形或者其它一些媒体类型以BLOB的格式存储,可用Image控件的PictureVal属性对它们进行浏览。
MEMO与BLOB类型的数据不能直接修改,如果直接修改的话,那只会显示它们的16进制的映像。
在以前的版本中,Visual FoxPro在建表语句CREATE TABLE创建字段类型时,一般用字段名称的第一个字母来取代。但随着数据类型的增多,像Character和Currency这两种字段类型如果采用第一个字母的简写方式的话会导致同名冲突。现在的版本可以同时支持字段类型的全称、全称的简写、第一个大写字母等多种方式,表1列出了所有的数据类型。
表1: 下面是FoxPro所有的数据类型的全称和字母缩写。
数据类型
全称
字母缩写
Character
Char, Character
C
Date
Date
D
DateTime
Datetime
T
Numeric
Num, Number
N
Floating
Float
F
Integer
Int, Integer
I
Double
Double
B
Currency
Currency
Y
Logical
Logical
L
Memo
Memo
M
General
General
G
Picture
Picture
P
VarChar
Varchar
V
VarBinary
Varbinary
Q
BLOB
Blob
W 与新引进的二进制索引一样,如果要使用新版本中的数据类型,那你必须升级到Visual FoxPro 9。否则就不能使用这些新的数据类型。
远程数据
Visual FoxPro以前的版本对远程数据有很强大的支持,但新版本中为操作及取得远程数据提供了更强大的控制功能。
事务和连接
一个名为DisconnectRoolBack的新属性被加入到了新版本,当事务处于挂起状态或连接断开时可以用它来将事务回滚。SQLSetProp、SQLGetProp、DBSetProp和DBGetProp函数都支持这个新属性。
SQLIdleDisconnect()是一个新增加的函数,它可用来临时地终断一个连接。在大多数情况下,它通过一个IdleTimeOut的属性来控制连接超时的时间。但在多线程运行环境中是不允许线程处于空闲状态的,在这种情况下调用此函数将真正释放这个连接。
游标处理
通过调用CursorGetProp()函数可以取得两个新的属性:RecordsFetched和FetchlsComplete。这些属性能让你知道目前已经处理了多少条记录,以及什么时候可以将所有的记录处理完。
RecordsFetched的值不会影响游标中的记录数目。并且如果在查询中设置了过滤表达式的话,那么过滤表达示将会被忽略掉。 如果你想在查询或更新的SQL语句中知道实际处理记录的数目,那可以调用SQLEXEC()和SQLMORERSULTS()函数,并通过一个名为aCountInfo的二维数组作为它们的参数,当函数调用后,此二维数组将包含表别名以及实际处理记录的数目。
对CursorAdapter和XMLAdapter的增强
关于对CursorAdapter和XMLAdapter的增强足以用长篇大论来描述。但限于篇幅,我们只描述一些显著增强功能。
CursorAdapter作了很多的改动,使得它现在看上去像一个远程视图。这些增强如下:
· 支持时间戳域。这允许UPDATE或DELETE语句可以在WHERE条件中以时间戳作为条件进行数据更新。
· 支持自动更新。这项特性可以使得当使用INSERT或UPDATE进行远程数据更新时,CursorAdapter能够自动地刷新。当你使用自动序号字段、缺省字段或时间戳时这项特性变得非常有用。
· 根据你的需要进行记录刷新。CursorAdapter中添加了一些新的属性和事件使得你能及时地刷新本地或远程视图,其功能与REFRESH()类似。
此外,CursorAdapter还增加了一些属性用来支持DEFAULT和CHECK约束,并且可以将远程数据映射到新的VarChar和VarBinary数据类型上。
XMLAdapter作了如下改进:
· 层次型XML结构支持
· XPath表达式支持
· XML编码与解码的增强
最后结论
在本文中,你已经领略到了新版本数据引擎发生的本质改变。同时新版本还兼顾了向后兼容性,以及提供了方便的升级步骤,使得从版本8升级到版本9对用户而言是一个透明的过程。只要你升级到了版本9,你就能享受到这种巨大的优越性,并且无需改变你的原有代码。它让你的程序建立在一个强兼容性、强大功能以及高可维护性的基础之上。
|
|
Visual FoxPro 9.0 的报表设计器 软件技术
fermos的博客 发表于 2005/9/8 7:38:26 |
Visual FoxPro 9.0 的报表设计器
http://www.pcdog.com 2004-12-1 Yesky
下一页 1 2 3 4 5 6
Micorsoft公司对新推出的Visual Foxpro 9报表设计器作了显著地改进,同时又与老版本的Visual Foxpro保持了向后兼容性,新版本的报表设计器是一个新旧版本的混合体。
在本文中,你将了解报表设计器对新的数据环境、报表保护、用户界面、对象布局与数据分组功能的增强。最后,你将了
解Visual FoxPro 9报表设计器的一个最有用的增强功能:多条明细区带(multiple detail bands)。
报表设计被一个新增的“Xbase报表设计器”的工具代替。它提供了一些新的对话框,并且比以前的版本更方便使用。它还提供了一些旧版本报表设计中所没有的新特色。你可以通过改变一个名为“_REPORTBUILDER”的系统属性来决定使用哪种报表设计器,如下所示:
*--如果要使用新版本的报表设计器
_REPORTBUILDER = HOME() + 'ReportBuilder.app' *--如果要使用旧版本的报表设计器
_REPORTBUILDER = '' 报表输出引擎:与报表设计器一样,你可以控制是否选用新版本的报表输出引擎。但与报表设计器不同的是Visual FoxPro 9默认报表输出引擎为旧版本方式。主要是因为在新版本的输出引擎中使用了GDI+库,而老版本的输出引擎使用的是GDI库,使用老版本的输出引擎就可以让应用程序可以在不用版本的windows上显示出同样的输出效果。你可以用如下命令来切换你的输出引擎:
*--使用新版本的输出引擎
SET REPORTBEHAVIOR 90 *--使用旧版本的输出引擎
SET REPORTBEHAVIOR 80 在下文中我们假定使用的是新版本的报表设计器和输出引擎。
数据环境(DE)
Visual FoxPro 9的报表设计器能与让多个报表共享同一个数据环境。数据环境能够以类的方式保存,并在需要的时候被报表载入。这为那些需要制定通用报表数据环境的应用程序提供了方便。
要将数据环境保存为一个类,首先你要为报表定义一个数据环境,然后激活数据环境窗口,并在“File”主菜单中单击“Save As Class...”选项。
这样系统会弹出一个新的对话框(参见图1)。在这种情况下,Save单选按钮组中只有“DataEnvironment”处于允许状态。
图1. 使用“Save As Class”对话框指定要保存的类名以及所在的类库,并将指定报表的数据环境保存在这个类中。载入数据环境
除了能为报表定义数据环境以外,Visual FoxPro 9还能让你将某个报表的数据环境类载入到报表中去。“Report”菜单中的“Load Data Environment...”选项可以让你选择到底载入哪个数据环境。
通过报表设计器载入数据环境
如果要为一个新报表载入数据环境,那源数据环境的所有代码和成员变量都会复制到新报表中。这表明当你改变原来报表的数据环境后,并不会对新报表的数据环境产生任何影响。
图2显示了当你从“Report”主菜单中单击了“Load Data Environment...”选项后弹出的属性对话框。你可以在里面选择从哪个报表中复制源数据环境。
图2. 单击”Data Environment“选项卡,从中选择你要从哪个报表中复制数据环境 在上图中,单击“Copy from another report file”单选按钮,然后单击“Select...”按钮,这样会弹出一个打开对话框,你可以从中选择从哪个报表中复制。如果你选中了一个报表,那系统弹出一个确认框。
假如我们要将某个报表的数据环境复制到当前报表中去,Visual FoxPro 9会警告你将覆盖当前报表的数据环境,你必须选择“是”才能继续进行复制。这个提示功能可以防止由于你的误操作而将当前报表的数据环境覆盖掉。如果你选择“否”的话,那复制就会取消,如果选择的是“是”,那就会真正进行复制操作,并且当操作完成后,系统会出现另一个对话框,提示你操作完成。
现在数据环境已经复制成功了,你可以操控新的数据环境。但你要始终记得原报表数据环境的改变并不会对新的数据环境有任何影响。
从一个类中载入数据环境
当要从一个类中载入数据环境时,你必须要为新报表的数据环境写一些额外的代码,使得它能够动态地绑定源数据环境,并且初始化它的一个实例。这意味着如果从类中载入数据环境时,对源数据环境做的所有改动会影响到所有使用它的报表。
你同样可以用图2所示的报表属性对话框来完成这个效果,先单击“Link to a visual DE class”单选按钮,然后从系统弹出的打开对话框中选择你要载入的类库以及类名,当你点击确定按钮后,当前报表的数据环境将得到更新,并且系统会给出相应提示信息。
其实Visual FoxPro自动为数据环境的如下5个方法中加入了一些代码:Init()、BeforeOpentables()、AfterCloseTables()、Destroy()和Error()。有些方法中加入的代码非常简单,仅仅是一个DODEFAULT()命令,这个命令不执行任何操作。其原因是BindEvents()方法必须保证数据环境的这5个方法中的代码行数超过一行才能执行。你可以手动查看这些自动生成的代码,但我强烈建议你别去动这些代码。
保护
如果要在Visual FoxPro 9使用报表设计器或者标签设计器,你可以为一个或多个的布局对象设置保护。这种特性可以让你的用户只能对报表进行有限的修改。
你可以为布局对象设置5种保护模式,域对象有着另外的保护选项。带区(
Band)有两种保护模式可供你选择。并且你也可对报表本身设置不同的保护方式。
保护一个对象
要在报表设计器中为一个布局对象设置保护,通过激活此对象的属性对话框即可操作,你可通过用右键点击此对象,并在弹出的快捷菜单中选择相应的菜单项,或者直接双击此对象。图3显示了一个布局对象属性对话框的保护页,你可以为布局对象设置如下5种保护方式:
· 对象不能被移动或改变大小。它使得用户不能在设计器中移动此布局对象,并且用户不能改变此对象的大小。
· 对象不能被修改。它使得用户不能修改此布局对象的属性。
· 对象不能被删除。 它使得用户不能删除此对象。
· 对象不能被选中。用户不可以选择此对象,当对象处于这种保护方式下时,用户不能移动它或改变它的大小,同样也不能修改或删除它。
· 对象在设计器中不可见。它使得此对象在报表设计中不可见,当对象处于这种保护方式下时,用户不能移动它或改变它的大小,同样也不能修改或删除它。
图3. 布局对象属性对话框中的保护页 这个对话框还有一个名为“Design-time caption”的输入项,它只对域对象有效。你可以在其中输入域对象的名称,这样在报表设计器中就不会显示域的表达示名称,而是显示你输入的名称。当域的表达式非常冗长时,这种显示方式可以使得报表设计器的用户界面更加友好。
保护一个带区(Band)
在报表设计器中要保护一个带区的话,请先激活此带区的属性对话框。你可以通过选择“Report”菜单中的“Edit Bands...”菜单项来打开这个属性对话框,也可以直接双击带区的灰色条。图4显示了一个带区属性对话框的保护页,你可以选择以下两种保护模式:
· 带区不可修改。这可以防止用户修改带区的属性。
· 带区不可改变大小。这可以防止用户改变带区的大小。
图4. 带区属性对话框中的保护页 保护报表本身
要为一个报表设定保护方式,要先激活此报表的属性对话框。你可以通过选择“Report”菜单中的“Properties”菜单项来打开这个属性框,也可以右键单击此报表来弹出这样一个菜单。图5显示了一个报表属性对话框的保护页
图5. 报表属性对话框中的保护页 这个对话框的上半部分可让你禁止用户使用属性对话框中的某些属性页。当你选择了相应的检查框后,报表属性对话框中的某些属性页会变得不可用。但“Protection”检查框总是保持选择状态而且不允许你对它进行改动。另外由于“Ruler/Grid”属性页无法保护,因此“Ruler/Grid”检查框也总处于禁止状态,这两个检查框之所以显示是为了保持属性页与检查框的一致性。
属性对话框的下半部分可以禁止用户使用某些菜单项。当你选择了相应的检查框后,相应的菜单会变得不可用。
在命令中设置保护标志
如果要通过命令方式来调用报表设计器或标签设计器中的保护方式,则应该使用PROTECTED关键字,如下所示:
CREATE REPORT MyReport PROTECTED MODIFY REPORT MyReport PROTECTED CREATE LABEL MyLabel PROTECTED MODIFY LABEL MyLabel PROTECTED 如果没有指定PROTECTED关键字,报表设计器不会为任何布局对象加上保护。
增强的用户界面(UI)
报表设计的用户界面作了很多改进,使得用户能更方便、更直观地设计出报表。菜单项也作了很大的调整,上下文菜单做了改进,报表设计器的工具栏中增加了一些新选项。表达式构造对话框(Expression Builder )和表达式构造
选项对话框(Express Builder Options)都有了新的特性,此外报表设计器对其它一些用户界面作了细微的改进。
菜单
菜单加入了一些新项目,一些原有的菜单项被更名使得它们表达的意思更清晰,此外一些常用的菜单项被重复以便用户更方便地访问到它,具体如下:
· “File”菜单下增加了“Save As Class...”菜单项。
· 报表设计器的工具栏加入了一个名为“水平线(horizontal lines)”的控件,它用来把Grid Lines和Show Position这两个控件与其它的控件分割开来。
· “Report”菜单增加了“重贴标签(relabled)”、“新建(new)”以及“打印预览(Print Preview)”等菜单项。
快捷菜单
对现有的快捷菜单添加了一些新条目,使得菜单条目与相应的对话框能保持更好一致性。
· “全局(Global)”快捷菜单增加了一个名为“重贴标签(relabled)”的菜单项。
· 通过右键单击任意带区(band)的灰色栏可以弹出名为“带区(Band)”的快捷菜单。
· 通过右键单击任意布局对象可以弹出名为“布局对象(Layout Object)”的快捷菜单。
工具栏
如图6所示,报表设计器的工具栏增加了两个新的控件:页面设置控件和字体控件:
图6. 报表设计器增加的两个新控件 表达式构造对话框
表达式构造对话框为“表达式域(Expression for Field)”输入框提供了一个更大的输入空间,允许用户输入更多的报表表达式。
如果你将_REPORTBUILDER这个系统属性设为空的话,那表达式构造对话框会指定本地行为,只有在数据环境中定义的数据表才能够显示在对话框中的列表中。那些没有在数据环境中定义的数据表则不会在列表中显示。
如果将_REPORTBUILDER系统属性为ReportBuilder.app的话,那表达式构造对话框则会呈现另外一种行为。首先,_GETEXPR中定义的表达式构造器会取代本地的表达式构造器。
表达式构造对话框还有一个下拉组合列表框,你可以从中选择要操作的数据表。只有当前已使用的数据表才会出现在这个列表框中。需要强调的是报表设计器是不会自动打开数据环境中定义的数据表的,因此如果数据表没有被打开的话,那它便不会出现在这个列表框中。
采用这种设计方式事,当用户使用你定义的报表时,你可以很好地控制用户能访问哪些数据表,不能访问哪些数据表。你可能在数据环境中定义了若干个数据表,但你不希望用户能访问所有的数据表,这时你可以打开一些允许用户访问的数据表,而其他未打开的数据表则对用户不可见。
鼠标指针的改进
当报表中对象处于大小可变状态时,鼠标指针会发生相应的改变(参见图7)。
图7. 当一个对象处于大小可变状态时,鼠标指针发生的改变。 多项选择对话框
VIsual FoxPro 9提供了一个多项选择对话框,你可以通过它一次性地设置多个布局对象的Portection和Print属性。它也允许你对单个布局对象的其它属性进行修改。要使用这种功能,先要选定多个布局对象,然后在任意一个对象上面单击右键来弹出这个对话框,如图8所示:
图8. 多项选择对话框 所有被选定的对象出现在对话框的“Selection”属性页的列表中。如果你要选取报表中所有的布局对象的话,用CTRL+A组合键可以对它们进行全选,然后再单击右键即可。
图8中的“Sort by”选项组允许你将布局对象按类型或出现在报表中的位置排序。“Remove from list”按钮可以删除列表中的布局对象。如果你双击列表中的某个对象,那么“Properties”属性页就会激活,并且显示出这些布局对象在报表中的某些属性。如图9所示,你可以一次性更改所有出现在“Selection”属性页中的布局对象的某些属性。
图9. 通过“Properties”属性页来修改布局对象的保护属性以及打印属性。 如果你选中了“Apply these protection settings to the selected objects”检查框,那可以对列表中的布局对象设置保护方式。如果你选中了“Apply this condition to the selected objects upon saving”检查框,那么可以允许打印。你可以根据自已的需要对保护及打印做更进一步的设置,设置完毕后,单击“OK”按钮便可同时改变所选的布局对象的这些属性。
更大的缩放级别
预览窗口有了更大的缩放级别,可以从10%缩放到500%。
布局对象的增强
布局对象也做了一些改进,包含一个操控模板字符的可选项,字符表达式的裁剪模式,以及能指定布局对象的相对位置和绝对位置。
模板字符
域属性对话框增加了对模板字符的一些新支持,它们分别是覆盖(Overlay)和交错(Interleave)。用来支持字符的一些特殊格式。 当你使用覆盖方式时,特殊字符会被当做数据的一部分,并且会覆盖其它的字符。举个例子来说,当你使用一个格式化字符串“999-999”时,而用户实际输入的数据是“123456”,那报表的最终结果将会显示为“123-56”,注意数字“4”被格式化字符中的“-”覆盖了。 当你使用交错方式时,特殊字符会插入到当前数据中。举个例子来说,当你使用一个格式化字符串“999-999”时,而用户实际输入的数据是“123456”,那报表的最终结果将会显示为“123-456”,注意“-”插入到了数字“3”和数字“4”的中间。
字符表达式的裁剪模式
在Visual FoxPro 9以前,当域对象中的文本过长时一般都会被自动裁剪。在Visual FoxPro 9中,你可以指定域对象的如下几种裁剪方式:
· 缺省裁剪方式。这种方式类似于以前版本的
Visual FoxPro的处理方式。
· 裁剪最近的字符。它将多余的字符全部裁掉,直至刚好满足输入域的长度。
· 裁剪最近的单词。它将多余的单词全部裁掉,直至刚好满足输入域的长度。
· 文件裁剪方式。如果输入域中的内容中一个非常长的文件路径,那么中间的路径将会以省略号代替,只保留头尾路径。
大小及位置
现在可以更方便地控制布局对象的大小以及所处的位置。与原版本不同,当在新版本报表中加入一个对象时,此对象的“From page top”、“From left”、“Height”和“Width”属性都会自动设置。在报表设计器中,“From page top”属性是指对象相对于页面顶端的相对位置。此对象上的所有灰色栏的高度也都被计算在内。改变对象的“From page top”属性有可能将对象移到到另一个区带中去。 相对位置:“From page top”属性和“Height”属性共同确定了当前对象是处于绝对位置还是相对位置。当对象的“From page top”属性的取值范围在报表的区域内,并且“Height”属性小于或等于所在区带的高度时对象就处于相对位置。一般来说,只有区带内的对象才需要使用相对位置,而像Page Header和Page Footer这样的对象则不需要使用相对位置。
绝对位置:当对象的“From page top”属性的取值范围在报表的区域以外,并且“Height”属性大于所在区带的高度时对象就处于绝对位置。绝对位置意味着对象在每页报表中都有着一个精确的位置,不会发生偏移。
我们可以利用绝对位置来为报表增加水印效果。将一幅水印图像放在Page Header区带中,并且将它设为“缩放内容,保持形状”模式。将水印图像的“From page top”属性和“From left”属性设为某组值,这组值相当于你的水印图像在报表中的左上角坐标。然后通过改变“Height”和“Width”属性来指出水印的大小,但注意的是不要将图像的尺寸设得过大,以免超过了打印区域的边界。 增强的数据分组功能
Visual FoxPro 9报表设计器对数据分组功能做了一些改进,增大了数据分组的最大数量限制以及对水平栏的改进。
最大数据分组数
最大数据分组数从原来的20个增加到了现在的74个。实际原来的版本也支持最大74个数据分组数,但由于原来的界面只支持20个数据分组的输入,从而导致了这种限制。
水平分栏
在以前的版本中,如果要为一个数据组定义多个水平分栏的话将会浪费很多报表空间。并且第一行第一列与报表的顶端之间有一些空白,数据还会从行1列2开始显示。并且在每个数据组中都会有一个多余的区带,如图10所示。即使数据组的页头区带的高度为0,Visual FoxPro 仍然将保留这些空白,如图11所示。
图10. 当为数据组定义多个水平分栏时,原来版本的Visual FoxPro浪费的报表空间
图11. 即使数据组的页头区带高度为0,原来版本的Visual FoxPro仍将保留这些空白
在Visual FoxPro 9中数据组分栏得到了改进。当报表设计器发现一个新数据组时,它将从第一列开始显示,直至満行。如果不满一行,那剩下的部分将以空格填充。如果还有未打印完的明细记录的话,那这些记录会从下一行开始输出,如图12所示。如果数据组的页头区带的高度为0,则Visual FoxPro 将不会保留任何空白,如图13所示。
图12. 将数据组进行水平分栏时,Visual Foxpro 9将节省更多的空间
图13. 如果数据组的页头区带高度为0时,Visual Foxpro 9不会保留任何空白
多条明细区带
这个新增功能其实早在以前就很需要,它是对老版本的一个很大的改进。它能让你在一个父表中为每一条记录处理相对应的子表,这种报表格式的一个典型实例如图14所示。
图14. 这个报表为每个客户报告了其购买保险的详细信息 数据表与关联
要想熟练地使用这一新特色,你必须明白父表是怎样与子表一起协同工作的。我们以图15所展示的报表为例,它使用的数据库环境如下:
· 客户表(Customer)是父表,它包含了所有购买保险的客户。
· 家庭成员表(Members)是客户表的子表,它包含了客户的所有家庭成员。
· 交通险表(Vehicles)也是客户表的一个子表,它包含了客户所购买的交通险。
· 家庭险表(Homes)也是客户表的一个子表,它包含了客户所购买的家庭险。
主表
必须有一个表来做为报表的主表,在本例中,客户表正是这样的一个数据表。如果你用数据环境来定义数据表的话,那必须将它的InitialSelectedAlias属性定义为这个数据表。 如果你用代码的方式来定义数据表的话,那要保证当此报表运行时,客户表必须处于当前打开的工作区。
目标别名(Target Alias)
所谓目标别名,是指在报表某个特定的区带中做为主表的那个数据表。在本例中,家庭成员表是明细区带1的主表,交通险表是明细区带2的主表,而家庭险表则是明细区带3的主表。
如果没有为某个明细区带定义主表,那它就会呈现出与老版本的Visual FoxPro一样的行为(每个父表只会处理一个明细区带)。但如果你定义每个父表都为主表的话,那结果会全然不同。Visual FoxPro 将依次处理父表中所有记录,并在每个明细区带中依次将它们输出。 关联
关联在如何控制多条明细区带的输出中起到的重要的角色。Visual FoxPro通过父表与子表之间的关联来进行记录的导向。你可以通过SET RELATION或者SET SKIP来定义这些关联。如果你在数据环境中打开了这些数据表,并且数据库中已经定义了它们之间的关联关系的话,那父表与子表之间将会自动生成关联。
如果你采用代码方式打开数据表的话,那列表1将告诉你如何将图15所示的数据环境建立起来。
列表1.建立图15的数据环境
如下代码展示了如何将父表与子表建立报表关联的例子。
*--打开子表
USE Members IN 0 ORDER CustomerFK USE Vehicles IN 0 ORDER CustomerFK USE Homes IN 0 ORDER CustomerFK *--打开父表
SELECT 0 USE customer ORDER CustomerPK *--为父表和子表建立报表关联
SET RELATION TO CustomerPK INTO Members SET RELATION TO CustomerPK INTO Vehicles ADDITIVE SET RELATION TO CustomerPK INTO Homes ADDITIVE 定义多条明细区带
如果你新建一个报表,那它缺省地为这个报表只设置一个明细区带。通过可选区带对话框可增加额外的明细区带。从“Report”菜单中选择“Optional Bands...”菜单项就可以打开这个对话框。它其实就是原来版本中的“标题/小结(Title/Summary)”对话框。
单击“Add”按钮便可以增加一个新的明细区带,你可以为一个报表定义最多20个明细区带。
定义主表
通过明细对话框你可以为每一个明细区带定义其主表。从“Report”菜单中选择“Edit Bands...”就可以打开这个对话框,或者双击明细区带的灰色栏也可达到同样效果。
主表实际上是一个表达式,你必须将相应的数据表名用引号引起来。如果你定义了某个主表,则相应的明细区带的灰色栏将显示它的名字。
如果你要建立一个多条明细区带形式的报表,请别忘了在字段前面加入数据表名的前缀,格式为“数据表名.字段名”,这样可以防止不同的数据表之间的同名字段冲突。
页头和页尾
多条明细区带的另一个改进就是能为每一个明细区带增加独立的页头和页尾。这与页头和页尾分组有些类似,但仍然有一些不同。当每个父表记录的处理流程如下:
· 明细区带1的页头被处理。
· 处理明细区带1中主表相应的所有子表记录。
· 明细区带1的页尾被处理。
· 明细区带2的页头被处理。
· 处理明细区带2中主表相应的所有子表记录。
· 明细区带2的页尾被处理。
· 明细区带3的页头被处理。
· 处理明细区带3中主表相应的所有子表记录。
· 明细区带3的页尾被处理。
· 以此类推......
要为每一个明细区带增加独立的页头和页尾,你必须在详细信息对话框中的“Detail Header/Footer”的检查框中选中相应的明细区带。也可通过点击明细区带上方的标题栏来对明细区带进行排序。
学海无涯
Visual FoxPro 9报表设计器增加了如此多的特色来帮你建立更好的报表,以至于你不得不花更多的精力来学习它的新功能,但我认为这些学习是非常值得的。新的数据环境允许你在不同的报表中共享它。对报表的各个部分提供了强有力的保护方式,用户界面也做了一番改头换面,让你得到更舒适的开发体验。布局对象与数据分组的增强给你提供了更多的报表操控能力。最后,新推出的多条明细区带的特色能挖掘出报表设计器的更多功能。所有的这些改进可让你创建出非常复杂、功能非常强大的报表。
|
|
谈ADO访问不同数据库的差别 电脑与网络
fermos的博客 发表于 2005/9/8 7:37:01 |
谈ADO访问不同数据库的差别
出处:中国电脑教育报
[ 2005-07-25 10:09:02 ]
作者:吕一昌
责任编辑:zhanghuafeng
·影音享乐方式!Divx6完全评测
·浏览下载一条龙,Opera BT 体验
·软件观察:别让流氓软件耍无赖!
·关注!Longhorn 5203多图泄漏
·你会是那个超酷的"播客"吗?
·我与超级兔子的恋爱史
·Divx Converter精彩试用
·图像格式转换的好帮手
·微软副总裁给中国大学生的信
·Java学习从入门到精通(附FAQ)
·PS立体光影魔术:在玻璃上打个洞
·Photoshop立体魔术2:光影的奥秘
·影音享乐方式!Divx6完全评测
·浏览下载一条龙,Opera BT 体验
·软件观察:别让流氓软件耍无赖!
·关注!Longhorn 5203多图泄漏
·你会是那个超酷的"播客"吗?
·我与超级兔子的恋爱史
·Divx Converter精彩试用
·图像格式转换的好帮手
·微软副总裁给中国大学生的信
·Java学习从入门到精通(附FAQ)
·PS立体光影魔术:在玻璃上打个洞
·Photoshop立体魔术2:光影的奥秘
var speed=100
demo2.innerHTML=demo1.innerHTML
function Marquee(){
if(demo2.offsetTop-demo.scrollTop
Microsoft公司提供了统一的数据访问接口ActiveX Data Object,简称ADO。但实际应用编程中,访问不同的数据库,如Access、SQL Server或VFP,会存在一些“细微”差别,常常有这样的情况,用ADO对象访问某一数据库的程序都调试通过了,但用同样的程序访问其他数据库就存在这样或那样的问题,反之也一样。这种差别就笔者来看好像没什么意义,因为都是一个公司的产品;虽然这种差别不多,但要搞清它的来龙去脉,足以使用户忙乎一阵子,a无端增加了用户的负担。下面,本文就谈谈有关SELECT语句在访问不同数据库方面的一些差别。(点击查看更多软件使用技巧)
在SQL Server、Access、VFP三个数据库中分别有以下的这样一个表名都为“Employee”的数据表。如图1所示。
图1
访问日期型字段的差别
在大多数情况下用SELECT语句分别去访问这三个数据库的这张表,没有什么区别,即你若编写了访问SQL Server数据库的SELECT语句,同样可用于访问Access数据库或VFP数据库,只要将连接的数据源改一改即可。但你若要对“出生年月”这一日期型字段进行查询的话,问题就来了,例如要查询1980年1月1日至1985年12月31日的员工资料,访问SQL Server中的数据表的语句是:
Select * from employee where 出生年月 between '1980-01-01' and '1985-12-31'
如果想当然地用这条语句去访问Access数据库那就大错特错了,必须加上函数DateValue(),正确的写法如下:
Select * from employee where 出生年月between DateValue('1980-01-01')and DateValue('1985-12-31')
如果要访问VFP日期型字段又必须采用以下这种写法:
select * from employee where 出生年月 between {^1980-01-01} and {^1985-12-31}
以上是SELECT语句对于访问不同数据库的日期型字段的差别,不了解这种差别,你会被搞得晕头转向,不知错在哪里。
|
|
快速发布VFP数据库 电脑与网络
fermos的博客 发表于 2005/9/8 7:27:49 |
快速发布VFP数据库
http://www.pcdog.com 2004-10-24 互联网
ASP的基于服务器端的脚本设计思路和ADO的方便快捷,使用户在开发Web数据库时省力不少。ASP最常用的开发环境是InterDev,但InterDev比较昂贵,使用起来也比较复杂。也许我们只是想将原有的Xbase数据放到公司的Web服务器上,方便公司外部客户的查询,内部依然使用基于VFP的应用程序。下面介绍一种通过
Windows95/98 +PWS+Access 2000快速实现基于VFP数据库查询的Web页面的方法。该方法同样适用于NT+IIS环境。
1.添加系统DSN
使用ASP技术的Web页能否存取某一种数据库,关键在于ODBC驱动程序,只要服务器安装了相应的ODBC驱动,你的主页就可以很方便地读取各种数据库,如Access、Excel、Foxpro、Paradox、SQL Server、Oracle等。ODBC的参数设置可以在脚本程序中直接指定,也可以把ODBC的参数设置在系统的DSN(Date Source Name)中,在脚本程序中以DSN启动数据库。使用DSN通过ODBC访问数据库的优点是,当我们改变数据库时,只要重新设置系统DSN,不需要修改程序中的ODBC参数(注意:只有系统DSN对所有用户都可见,而用户DSN和文件DSN,分别只对当前用户和安装了相同驱动程序的用户可见,不要设错了!)。添加系统DSN的步骤如下:
步骤一:经由“控制面板”→“ODBC数据源(32位)”→“系统DNS”标签,单击“添加...”按钮,出现“创建新数据源”对话框。
步骤二:从上述对话框的列表框选择“Microsoft FoxPro VFP Driver(.dbf)”项(如果没有此项可以从Office 2000或Visual FoxPro中安装,Office 2000默认并不安装VFP的ODBC),单击“完成”按钮,出现“ODBC Visual FoxPro Setup”对话框。
步骤三:在“Date Source Name”编辑框中填入数据源的名字,例如:“School”。选择自己的VFP数据库类型,可以选择DBC库或自由表的目录。通过“Browse...”按钮选择数据库或者自由表的目录。打开“Options...〉〉”,从“Collating sequence”下拉列表中选择“PinYin”,使你的中文字串按拼音排序。单击“OK”按钮,完成添加DSN。
2.在Access 2000上建立链接表
添加了VFP的DSN后,就可以在Access 2000内直接打开VFP数据库了。
步骤一:启动Access 2000选择新建“空Access数据库”,随便起一个名字,保存在任意位置,因为Access数据库仅为一个过渡,用过后就可以删除掉。
步骤二:在主窗口的快捷选单上选择“链接表...”项(你也可以用“导入...”,但当VFP数据库较大时,导入Access的数据可是很占地儿的),出现“链接”对话框,从“文件类型”下拉列表中选择“ODBC Database ()”。屏幕出现“选定数据源”对话框。
步骤三:选择“机器数据源”标签,从列表中选择你在前面定义的DSN,如School,单击“确定”按钮。
步骤四:从出现的导入对象对话框中,选择你要提供Web页查询的VFP数据库中的数据表和视图,单击“确定”后,随便指定“惟一的记录标识符”后“确定”。Access就和VFP数据库链接上了。我们现在就可以双击链接图标,浏览VFP数据了。
3.将VFP的查询移植到Access查询视图
如果想将VFP的查询在Web上实现,那就要进行这一步。这一步其实很简单,就是将VFP查询的SQL语句复制下来,然后粘贴到Access的查询对象上。需要注意的是,要将VFP的SQL语句中的分号和数据库名在新建的Access查询的SQL编辑器中删除。最后别忘了在Access中运行一下你的查询,看看是否和VFP中的一致。不过我还是建议你将VFP查询改为本地视图,这样就省去了日后维护ASP脚本的SQL了。
4.用Access生成ASP页面
步骤一:选中一个链接表或Access查询,右击鼠标从快捷选单中选择“导出...”项。
步骤二:从“导出”对话框中的“保存类型”下拉列表中选择“Microsoft Active Server”项。可以在此为你的ASP页面起一个名字(如xf)。单击“保存”按钮。
步骤三:在出现的“Microsoft Active Server页输出选项”对话框中选择HTML模板(也可不选),在“数据源名称”编辑框中填入在第一部分设定的DSN,如School。单击“确定”按钮,完成ASP页的生成。
5.添加分页浏览代码
我们生成的ASP页面是以.asp为扩展名,由于ASP是基于服务器端的脚本,所以必须将其发布到Web服务器上,才可以在浏览器中看到效果。
下面的脚本提供了分页显示查询结果功能,它是利用ADO采用带页码参数的方法控制翻页,这样的好处是可以方便地直接指定要浏览的页面。同时,只要VFP的本地视图名称不变,视图中的SQL 任意变化均不需维护ASP页面。
〈%
′将自动生成的ASP文件,由〈TABLE...〉开始全部删除,改用下列程序段。
rs.PageSize = 5
Page = CLng(Request(″Page″))
If Page 〈 1 Then Page = 1
If Page 〉 rs.PageCount Then Page = rs.PageCount
Response.Write ″〈TABLE ALIGN=CENTER BORDER=1〉 〈CAPTION〉〈B〉分页显示VFP数据库〈/B〉〈/CAPTION〉″
Response.Write ″〈TR BGCOLOR=#ffff00〉″
For i=0 to rs.Fields.Count-1
Response.WRITE ″〈TD〉″ & rs.Fields(i).Name & ″〈/TD〉″
Next
Response.Write ″〈/TR〉″
rs.AbsolutePage = Page
For iPage = 1 To rs.PageSize
Response.Write ″〈TR〉″
For i=0 to rs.Fields.Count-1
Response.WRITE ″〈TD〉″ & rs.Fields(i).Value & ″〈/TD〉″
Next
Response.Write ″〈/TR〉″
rs.MoveNext
If rs.EOF Then Exit For
Next
Response.Write ″〈/TABLE〉″
%〉
〈form action=″PageBrow.asp″ method=″GET″id=form1 name=form1〉
〈font color=″#008000″〉 共〈%=rs.PageCount%〉页
您正在浏览第〈input type=″text″ size=″2″ name=″Page″ value=〈%=Page%〉 〉页
〈/font〉
〈%
If Page 〈〉 1 Then
Response.Write ″〈A HREF=xf.asp?Page=1〉〈首页〉〈/A〉 ″
Response.Write ″〈A HREF=xf.asp?Page=″ & (Page-1) & ″〉〈前页〉〈/A〉 ″
Else Response.Write ″〈首页〉 〈前页〉″
End If
If Page 〈〉 rs.PageCount Then
Response.Write ″〈A HREF=xf.asp?Page=″ & (Page+1) & ″〉〈后页〉〈/A〉″
Response.Write ″〈A HREF=xf.asp?Page=″& rs.PageCount & ″〉〈尾页〉〈/A〉″
Else Response.Write ″〈后页〉 〈尾页〉″
End If
%〉
〈/form〉〈/body〉〈/html〉 |
|
在Dreamweaver中实现flash的透明背景 电脑与网络
fermos的博客 发表于 2005/9/8 6:00:35 |
在Dreamweaver中实现flash的透明背景
[日期:2004-11-20]
来源: 作者:漂流瓶
[字体:大 中 小]
【编者注】我们经常收到一些初学网业制作的网友提出的问题,很多问题其实很简单,只要动脑筋想一想就可以解决了,但有的网友不喜欢多思考,一遇到问题想都不想就直接去问别人,这种学习方法可不太好。而本文的作者学到一种技巧后,他发现这种技巧在两种环境下显示的结果不同,这个时候比较两种环境中产生的源代码的区别无疑是解决问题最好的方法!他也正是这样做的,并最终解决了问题。本文涉及的问题并不算太难,但作者发现问题、解决问题的思路却很值得我们学习!
首先忠心感谢凌宇5942给我的帮助!在他的启迪下我发现了另一种实现flash透明背景的办法,愿与大家共同探讨:
凌宇5942告知的解决办法:在flash的html发布选项中选windows mode/transparent windowless,发布为html,插入网页就可以得到透明的flash的效果。
不错,照这样的办法去做,便可以发布出带有透明flash的html页。但是它存在一个问题:所发布的flash动画只在与其同时发布的html页中显示透明效果,而如果用dreamweaver新建一个文件,再将其插入页面中,保存-->>f12预览我们会发现它又是不透明的了!这是怎么回事呢?
我仔细比较了用flash发布的html页和用dreamweaver制作的带有flash 动画的两个html页的源代码:
1.用flash发布的html页源代码:
<HTML> <HEAD> <TITLE>Movie2</TITLE> </HEAD> <BODY bgcolor="#000000"> <!-- URL's used in the movie--> <!-- text used in the movie--> <!--fdsaaaa aaaaaaa -->
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash /swflash.cab#version=5,0,0,0" WIDTH=550 HEIGHT=400> <PARAM NAME=movie value="Movie2.swf"> <PARAM NAME=quality value=high> <PARAM NAME=wmode value=transparent> <PARAM NAME=bgcolor value=#FFFFFF> <!--用flash导出后将背景改为黑色,其目的是便于观察透明效果--> <EMBED src="Movie2.swf" quality=high wmode=transparent bgcolor=#FFFFFF WIDTH=550 HEIGHT=400 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version =ShockwaveFlash"></EMBED> </OBJECT>
</BODY> </HTML>【编者注】我们经常收到一些初学网业制作的网友提出的问题,很多问题其实很简单,只要动脑筋想一想就可以解决了,但有的网友不喜欢多思考,一遇到问题想都不想就直接去问别人,这种学习方法可不太好。而本文的作者学到一种技巧后,他发现这种技巧在两种环境下显示的结果不同,这个时候比较两种环境中产生的源代码的区别无疑是解决问题最好的方法!他也正是这样做的,并最终解决了问题。本文涉及的问题并不算太难,但作者发现问题、解决问题的思路却很值得我们学习!
首先忠心感谢凌宇5942给我的帮助!在他的启迪下我发现了另一种实现flash透明背景的办法,愿与大家共同探讨:
凌宇5942告知的解决办法:在flash的html发布选项中选windows mode/transparent windowless,发布为html,插入网页就可以得到透明的flash的效果。
不错,照这样的办法去做,便可以发布出带有透明flash的html页。但是它存在一个问题:所发布的flash动画只在与其同时发布的html页中显示透明效果,而如果用dreamweaver新建一个文件,再将其插入页面中,保存-->>f12预览我们会发现它又是不透明的了!这是怎么回事呢?
我仔细比较了用flash发布的html页和用dreamweaver制作的带有flash 动画的两个html页的源代码:
1.用flash发布的html页源代码:
<HTML> <HEAD> <TITLE>Movie2</TITLE> </HEAD> <BODY bgcolor="#000000"> <!-- URL's used in the movie--> <!-- text used in the movie--> <!--fdsaaaa aaaaaaa -->
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash /swflash.cab#version=5,0,0,0" WIDTH=550 HEIGHT=400> <PARAM NAME=movie value="Movie2.swf"> <PARAM NAME=quality value=high> <PARAM NAME=wmode value=transparent> <PARAM NAME=bgcolor value=#FFFFFF> <!--用flash导出后将背景改为黑色,其目的是便于观察透明效果--> <EMBED src="Movie2.swf" quality=high wmode=transparent bgcolor=#FFFFFF WIDTH=550 HEIGHT=400 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version =ShockwaveFlash"></EMBED> </OBJECT>
</BODY>
最简单得方法是插入如下代码: <table border="0" cellPadding="0" cellSpacing="0" width="100%"> <tr> <td height="210" background="背景图片.jpg"><object classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 codebase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=4,0,2,0 height=210 width=750> <param name="movie" value="路径/文件名称.swf"> <param name="quality" value="high"> <param name="wmode" value="transparent"> <embed src="路径/文件名称.swf" quality=high pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="750" height="210" wmode="transparent"> </embed> </object></td> </tr></table> |
|
经典时间代码集锦 电脑与网络
fermos的博客 发表于 2005/9/8 5:59:06 |
经典时间代码集锦
[日期:2005-08-04]
来源:网奇 作者:漂流瓶
[字体:大 中 小]
实时走动的数字时钟
<script> function tick() { var hours, minutes, seconds, xfile; var intHours, intMinutes, intSeconds; var today; today = new Date(); intHours = today.getHours(); intMinutes = today.getMinutes(); intSeconds = today.getSeconds(); if (intHours == 0) { hours = "12:"; xfile = "午夜"; } else if (intHours < 12) { hours = intHours+":"; xfile = "上午"; } else if (intHours == 12) { hours = "12:"; xfile = "正午"; } else { intHours = intHours - 12 hours = intHours + ":"; xfile = "下午"; } if (intMinutes < 10) { minutes = "0"+intMinutes+":"; } else { minutes = intMinutes+":"; } if (intSeconds < 10) { seconds = "0"+intSeconds+" "; } else { seconds = intSeconds+" "; } timeString = xfile+hours+minutes+seconds; Clock.innerHTML = timeString; window.setTimeout("tick();", 100); } window.onload = tick; </script>
第二步.将下面的代码加入html文件任意需要的地方
<div id="Clock" align="center" style="font-size: 20; color:#000000"></div>
你可以自行更改样式!
显示年月日格式的时间代码
<script language=javascript> today=new Date(); function initArray(){ this.length=initArray.arguments.length for(var i=0;i<this.length;i++) this[i+1]=initArray.arguments[i] } var d=new initArray( "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"); document.write( "<font color=##000000 style='font-size:9pt;font-family: 宋体'> ", today.getYear(),"年", today.getMonth()+1,"月", today.getDate(),"日", d[today.getDay()+1], "</font>" );
显示日期,星期,时间格式的代码
<script language="javascript"> <!--- today=new Date(); var hours = today.getHours(); var minutes = today.getMinutes(); var seconds = today.getSeconds(); var timevalue = "<FONT COLOR=black>" + ((hours >12) ? hours -12 :hours); timevalue += ((minutes < 10) ? "<BLINK>
<FONT COLOR=black>:</FONT></BLINK>0" : "<BLINK><FONT COLOR=black>:</FONT></BLINK>") + minutes+"</FONT></FONT>";
timevalue += (hours >= 12) ? "<FONT COLOR=blue><I><B>pm</B></I></FONT>" : "<FONT COLOR=blue><B><I>am</I></B></FONT>"; function initArray(){ this.length=initArray.arguments.length for(var i=0;i<this.length;i++) this[i+1]=initArray.arguments[i] } var d=new initArray("<font color=RED>星期日","<font color=black>星期一","<font color=black>星期二","<font color=black>星期
三","<font color=black>星期四","<font color=black>星期五","<font color=red>星期六"); document.write
("<font color=black>",today.getYear(),"<font color=black>年","<font color=black>",today.getMonth()+1,"<font color=black>
月","<font color=black>",today.getDate(),"<font color=black>日 </FONT>",d[today.getDay()+1]," ",timevalue); //--> </script>
显示来访者的停留时间
<script language="javascript"> var ap_name = navigator.appName; var ap_vinfo = navigator.appVersion; var ap_ver = parseFloat(ap_vinfo.substring(0,ap_vinfo.indexOf('(')));
var time_start = new Date(); var clock_start = time_start.getTime(); var dl_ok=false;
function init () { if(ap_name=="Netscape" && ap_ver>=3.0) dl_ok=true; return true; }
function get_time_spent () { var time_now = new Date(); return((time_now.getTime() - clock_start)/1000); }
function show_secs () // show the time user spent on the side { var i_total_secs = Math.round(get_time_spent()); var i_secs_spent = i_total_secs % 60; var i_mins_spent = Math.round((i_total_secs-30)/60); var s_secs_spent = "" + ((i_secs_spent>9) ? i_secs_spent : "0" + i_secs_spent); var s_mins_spent = "" + ((i_mins_spent>9) ? i_mins_spent : "0" + i_mins_spent); document.fm0.time_spent.value = s_mins_spent + ":" + s_secs_spent; window.setTimeout('show_secs()',1000); }
// --> </script> <FORM name="fm0" onSubmit="0"><FONT COLOR="#6060FF">停留时间: </FONT><INPUT type="text" name="time_spent" size=7 onFocus="this.blur()"></FORM>
第二步:在你主页源文件<body>中加入下面代码的兰色部分
<BODY onLoad="init(); window.setTimeout('show_secs()',1);">
显示当前日期与时间的格式
<script language="javascript"> <!-- now = new Date() hour = now.getHours() if (hour < 12) { document.write("现在是: " + now.toLocaleString()) } else if (hour < 18){ document.write("现在是: " + now.toLocaleString()) } else if (hour >= 18) { document.write("现在是: " + now.toLocaleString()) } // --></script>
浏览器状态栏显示的时钟
<BODY onLoad="run(); timerONE=window.setTimeout"></BODY> <SCRIPT LANGUAGE="javascript"> <!-- Hide timeID = null; timeRunning = false; function stop () { if(timeRunning) clearTimeout(timeID); timeRunning = false; } function time () { tick = new Date(); hours = tick.getHours(); minutes = tick.getMinutes(); seconds = tick.getSeconds(); day = tick.getDay(); month = tick.getMonth(); date = tick.getDate(); year = tick.getYear(); current = "" + ((hours >12) ? hours -12 :hours) current += ((minutes < 10) ? ":0" : ":") + minutes current += ((seconds < 10) ? ":0" : ":") + seconds current += (hours >= 12) ? " P.M." : " A.M." if(day==0){var weekday = " 星期日"} if(day==1){var weekday = " 星期一"} if(day==2){var weekday = " 星期二"} if(day==3){var weekday = " 星期三"} if(day==4){var weekday = " 星期四"} if(day==5){var weekday = " 星期五"} if(day==6){var weekday = " 星期六"} current +=(weekday) window.status=current; timeID = setTimeout("time()",1000); timeRunning = true; } function run(){ stop(); time(); }
//--> </SCRIPT>
显示最后更新时间代码
<SCRIPT language=javascript> <!--hide script from old browsers document.write("最后更新时间: " + document.lastModified + "") // end hiding --> </SCRIPT>实时走动的数字时钟
<script> function tick() { var hours, minutes, seconds, xfile; var intHours, intMinutes, intSeconds; var today; today = new Date(); intHours = today.getHours(); intMinutes = today.getMinutes(); intSeconds = today.getSeconds(); if (intHours == 0) { hours = "12:"; xfile = "午夜"; } else if (intHours < 12) { hours = intHours+":"; xfile = "上午"; } else if (intHours == 12) { hours = "12:"; xfile = "正午"; } else { intHours = intHours - 12 hours = intHours + ":"; xfile = "下午"; } if (intMinutes < 10) { minutes = "0"+intMinutes+":"; } else { minutes = intMinutes+":"; } if (intSeconds < 10) { seconds = "0"+intSeconds+" "; } else { seconds = intSeconds+" "; } timeString = xfile+hours+minutes+seconds; Clock.innerHTML = timeString; window.setTimeout("tick();", 100); } window.onload = tick; </script>
<div id="Clock" style="font-size: 20; color:#000000"></div>
根据不同的时间显示不同的问候语
方法:在主页中你需要的地方加入以下代码:
<script language="LiveScript"> now = new Date(),hour = now.getHours() if(hour < 6){document.write("明天不用上班了吗?")} else if (hour < 8){document.write("全新的一天!")} else if (hour < 12){document.write("早安!")} else if (hour < 14){document.write("外面太阳大吗?")} else if (hour < 18){document.write("午安!")} else if (hour < 22){document.write("晚上好!")} else if (hour < 24){document.write("夜深了! 要注意身体呀! 祝你做个好梦!")} // --> </script>
说明,可以自行修改出更好更多的问候语!
一个很酷的透明时钟代码
方法:在页面中你需要的地方加入下面的代码
<STYLE type=text/css> BODY {COLOR: #000000; FONT-FAMILY: "宋体"; FONT-SIZE: 9pt; LINE-HEIGHT: 13pt} TD {COLOR: #000000; FONT-FAMILY: "宋体"; FONT-SIZE: 9pt; LINE-HEIGHT: 13pt} A:visited {COLOR: #000080;text-decoration:none} a:link { text-decoration:none } a:hover { text-decoration:underline } .f12 {font-size:12px;} .f13 {font-size:14.9px; LINE-HEIGHT: 120%} .f24 {font-size:24px;LINE-HEIGHT: 120%} .f14 {font-size:14.9px; LINE-HEIGHT: 170%} </STYLE> <script LANGUAGE="javascript"> Zp=670;H='....';H=H.split('');M='.....';M=M.split('');S='......';S=S.split('');Yp=0;Xp=0;Yb=8;Xb=8;d_=12;
ns=(document.layers)?1:0;fCol='222222';sCol='ff0000';mCol='0000ee';hCol='green';if (ns){dgts='1 2 3 4 5 6 7 8 9 10 11 12';
dgts=dgts.split(' ');for (i=0;i<d_;i++){document.write('<layer name=nsDigits'+i+' top=0 left=0 height=30 width=30>
<center><font face=Arial,Verdana size=1 color='+fCol+'>'+dgts[i]+'</font></center></layer>');}for (i=0;i<M.length;i++)
{document.write('<layer name=ny'+i+' top=0 left=0 bgcolor='+mCol+' clip="0,0,2,2"></layer>');}for (i=0;i<H.length;i++)
{document.write('<layer name=nz'+i+' top=0 left=0 bgcolor='+hCol+' clip="0,0,2,2"></layer>');}for (i=0;i<S.length;i++)
{document.write('<layer name=nx'+i+' top=0 left=0 bgcolor='+sCol+' clip="0,0,2,2"></layer>');}}else{document.write('
<div style="position:absolute;top:0px;left:0px"><div style="position:relative">');for (i=1;i<d_+1;i++){document.write
('<div id="ieDigits" style="position:absolute;top:0px;left:0px;width:30px;height:30px;font-family:Arial,Verdana;font-size:
10px;color:'+fCol+';text-align:center;padding-top:10px">'+i+'</div>');}document.write('</div></div>');document.write
('<div style="position:absolute;top:0px;left:0px"><div style="position:relative">');for (i=0;i<M.length;i++){document.write
('<div id=y style="position:absolute;width:2px;height:2px;font-size:2px;background:'+mCol+'"></div>');}document.write('</div>
</div>');document.write('</div></div>');document.write('<div style="position:absolute;top:0px;left:0px">
<div style="position:relative">');for (i=0;i<H.length;i++){document.write
('<div id=z style="position:absolute;width:2px;height:2px;font-size:2px;background:'+hCol+'"></div>');}document.write('</div>
</div>');document.write('<div style="position:absolute;top:0px;left:0px"><div style="position:relative">');for (i=0;i
<S.length;i++){document.write('<div id=x style="position:absolute;width:2px;height:2px;font-size:2px;background:'+sCol+'">
</div>');}document.write('</div></div>');}function clock(){time=new Date ();secs=time.getSeconds();sec=-1.57+Math.PI*secs/
30;mins=time.getMinutes();min=-1.57+Math.PI*mins/30;hr=time.getHours();hrs=-1.57+Math.PI*hr/6+Math.PI*parseInt(time.getMinutes
())/360;if (ns){Yp=window.pageYOffset+window.innerHeight-60;Xp=80;}else
{Yp=document.body.scrollTop+window.document.body.clientHeight-60;Xp=document.body.scrollLeft+60;}if (ns){for (i=0;i<d_;++i)
{document.layers["nsDigits"+i].top=Yp-5+40*Math.sin(-0.49+d_+i/1.9);document.layers["nsDigits"+i].left=Xp-15+40*Math.cos(-0.49
+d_+i/1.9);}for (i=0;i<S.length;i++){document.layers["nx"+i].top=Yp+i*Yb*Math.sin(sec);document.layers
["nx"+i].left=Xp+i*Xb*Math.cos(sec);}for (i=0;i<M.length;i++){document.layers["ny"+i].top=Yp+i*Yb*Math.sin(min);document.layers
["ny"+i].left=Xp+i*Xb*Math.cos(min);}for (i=0;i<H.length;i++){document.layers["nz"+i].top=Yp+i*Yb*Math.sin(hrs);document.layers
["nz"+i].left=Xp+i*Xb*Math.cos(hrs);}}else{for (i=0;i<d_;++i){ieDigits[i].style.pixelTop=Yp-15+40*Math.sin(-0.49+d_+i/
1.9);ieDigits[i].style.pixelLeft=Xp-14+40*Math.cos(-0.49+d_+i/1.9)+Zp;}for (i=0;i<S.length;i++){x
[i].style.pixelTop=Yp+i*Yb*Math.sin(sec);x[i].style.pixelLeft=Xp+i*Xb*Math.cos(sec)+Zp;}for (i=0;i<M.length;i++){y
[i].style.pixelTop=Yp+i*Yb*Math.sin(min);y[i].style.pixelLeft=Xp+i*Xb*Math.cos(min)+Zp;}for (i=0;i<H.length;i++){z
[i].style.pixelTop=Yp+i*Yb*Math.sin(hrs);z[i].style.pixelLeft=Xp+i*Xb*Math.cos(hrs)+Zp;}}setTimeout('clock()', 50);}
if (document.layers || document.all) {window.onload=clock;} window.onload=clock; </script>
|
|
如何在浏览器地址栏前添加自定义的小图标?在线等!! 电脑与网络
fermos的博客 发表于 2005/9/8 5:54:50 |
如何在浏览器地址栏前添加自定义的小图标?在线等!!
[日期:2005-03-26]
来源:网奇 作者:漂流瓶
[字体:大 中 小]
其实这并不深奥,只是简单的几步就可以实现了。只不过在网站目录下添加了一个特定文件而已。
我们需要预先制作一个图标文件,大小为16*16像素。文件扩展名为ico,然后上传到相应目录中。在HTML源文件“<head></head>”
间添加如下代码:
<Link Rel="SHORTCUT ICON" href="http://图片的地址(注意与刚才的目录对应)">
其中的“SHORTCUT ICON”即为该图标的名称。当然如果用户使用IE5或以上版本浏览时,就更简单了,只需将图片上传到网站根目录
下,即可自动识别!
好啦,大功告成
<link rel="Shortcut Icon" href="favicon.ico"> IE地址栏前换成自己的图标 <link rel="Bookmark" href="favicon.ico"> 可以在收藏夹中显示出你的图标 --------------------------------- dsclub补充: 在站点根目录下建立一个16*16的icon文件,并把名称命名为favicon.ico一般不用写link就可以应用于站点下的没一个页面文件了。
|
|
Ulead GIF Animator V5.05简单教程 软件技术
fermos的博客 发表于 2005/9/8 5:48:35 |
Ulead GIF Animator V5.05简单教程
[日期:2005-03-20]
来源:网奇 作者:漂流瓶
[字体:大 中 小]
第一课:让图动起来------------以秋意头像为例
效果图 原图三张
screen.width-500)this.style.width=screen.width-500;"> screen.width-500)this.style.width=screen.width-500;">screen.width-500)this.style.width=screen.width-500;">screen.width-500)this.style.width=screen.width-500;">
提示:1. 按图中1--8的步骤依次进行。
2. 图小一点,太大的图做成GIF后太大,可能无法上传。
760-200)this.width=760-200" border=0>
第二课 导入3D文字动画
基本要求:3D文字动画与图的大小必须一致。不一致可以利用UA-5变化成一致大小。
原图 screen.width-500)this.style.width=screen.width-500;">
变化图
screen.width-500)this.style.width=screen.width-500;">
方法如下图
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
下图是在一张背景图中导入3D文字动画的方法。照此方法,我们也可以利用自己的头像导入一张闪光图变成闪光头像。
3D文字动画可以自己制作,闪光头像示例。
screen.width-500)this.style.width=screen.width-500;" border=0> screen.width-500)this.style.width=screen.width-500;" border=0>
3D文字动画可以自己制作,闪光头像示例。
screen.width-500)this.style.width=screen.width-500;"> screen.width-500)this.style.width=screen.width-500;"> screen.width-500)this.style.width=screen.width-500;">screen.width-500)this.style.width=screen.width-500;"> screen.width-500)this.style.width=screen.width-500;">
第三课 屏幕移动效果
screen.width-500)this.style.width=screen.width-500;" border=0>
screen.width-500)this.style.width=screen.width-500;" border=0>
文字教程:
1.新建一个文件 宽200 高140 2.添加图像 3.添加桢并把眼睛点上,稍稍移动一下图。 4. 重复3步骤二次 5. 选中第一桢,按住shift 键,在第四桢上点一下,(四桢全选中)右击----画面属性,廷迟时间改为30 6. 点第一桢,点“之间”按钮,如图设置 7. 点第七桢,开始桢改为7 结束桢改为8 8. 点第十三桢,开始桢改为13 结束桢改为14 9. 第一至第十九桢全部选中,右击选择“相同的桢”,再次右击,选“反向桢顺序”。点中“选定桢相反顺序”---确定 10. 预览-----另存为
第四课 文字效果
760-200)this.width=760-200" border=0>
文字教程:
1. 导入一张图,点“添加文本条”位置在“之间”后面一个“T” 2. 在出现的对话框中选“文本”输入汉字并选定自己喜欢的字体、颜色、大小 3. 选“效果” 进入场景选择垂直合并,画面桢设为10 退出场景选放大 画面桢高为15 4. 选“画面桢控制” 延迟时间设为10 在“分配到画面桢”前打上勾 5 点确定----创建为文本条 6. 另存为
可以试试其他文字效果,自由发挥。
screen.width-500)this.style.width=screen.width-500;">
第五课 图形变化
1. 打开一张图
2. 点击“视频F/X”-----film----Turn Page-Film 画面桢 20 延迟时间20
3. 说明:在第二步中的效果类型栏中,有下拉式
箭头,拉开可以看到各种动画类型,自己组合成自
己喜欢的形式。建议大家一一打开试试。在视频
F/X这标题下面,从第一个3D到Wipe 都是各种动
画效果。
第六课 跳跃字
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
1. 打开一张图
2. 点击文本工具“T”(左边第一排第二个)并在图上按一下,出现“文本条目框”
3. 选择汉字输入法------选择汉字字体、大小、颜色,输入第一个字:“你”------确定。可以看到多出了一层,这一层就叫“你”。把字拖到合适的位置。
4. 再在图上按一下,“文本条目框”,再次按第三步操作一次,这次输入第二个字:“好”
5. 再在图上按一下,“文本条目框”,再次按第三步操作一次,这次输入第三个字:“吗”
6. 把三个字排列整齐,可以看到现在有四层,分别叫做:图、你、好、吗 7. 按“添加桢”三次,添加后是空白的,把四个层都点上眼睛。这样有四个看上去一模一样的桢。
8. 选择第二桢,在“你”这一层上点一下,层变成蓝色,把“你”字垂直往上移动一点。(别移得太大)
9. 再选择第三桢,在“好”这一层上点一下,层变成蓝色,把“好”字垂直往上移动一点。
10. 再选择第四桢,在“吗”这一层上点一下,层变成蓝色,把“吗”字垂直往上移动一点。
11. 第一桢延迟设置为30 其他三桢设置为10
12. 另存为
第七课 文字的淡出效果
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
1. 打开一张图,点击添加文本条
2. 打开汉字输入法,选择好字体、大小、颜色,输入:“有事请找警察”。把鼠标放到“添加文本条”内的预览图上,看到鼠标指针由白色转变为黑色,移动至合适位置。
3. 按下图设置效果和面画桢,注意红笔圈出的部分
4. 确定----------创建为文本条
5. 把最后一桢时间改为30
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
利用这种方法可以制作常见的下面这张图
screen.width-500)this.style.width=screen.width-500;">
接上面的淡入效果
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
1. 新建-----宽度100 高度200 画布外观选择:完全透明
2. 点击“添加文本条”----选择输入法-----字体:微软简行楷 大小:24 颜色:黑色 输入文字:诗承唐宋千秋韵 其他设置同8楼图示。把文字拖至合适的位置。
3. 点击最后一桢,同第二步,输入文字:梦汇古今万载情。把文字拖至合适的位置。注意:先把文本框内的文字删除。
4. 把最后一桢时间设置为40
竖的字是怎么写?-------打一个字按回车一次再打一个字按回,就变成一行了。
横写也可以,如果不是采用透明,而是用一张图作为背景,可以制作自己的签名图,看下面秋意的签名和寒烟的签名 screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
第八课 十字架效果
screen.width-500)this.style.width=screen.width-500;">
1. 打开一张图,按添加桢再添加5桢
2. 选中第一桢、编辑-----复制----选中第二桢----粘贴----选第三桢----粘贴.......直到第六桢----粘贴
3. 选中第一桢,选择画笔工具:找一个颜色,大小为2 直线
4. 依次选中各桢,分别画十字,位置从左上角直至右下角。
5. 把时间延迟设置为20
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
第九课 下雨效果
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
1. 打开一张图,按添加桢再添加3桢
2. 选中第一桢、编辑-----复制----选中第二桢----粘贴----选第三桢----粘贴.......直到第四桢----粘贴
3. 选择画笔工具按图示选择
4. 从第一桢开始到最后一桢画长短、位置不一的直线。
5. 把时间延迟设置为10
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
第十课 飘雪效果
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
1. 打开一张图,添加文本条。
2. 在文本输入“*”若干个,并把*号拖到最顶部。
3. 按图设置:注意红笔圈出的部分。
4. 确定,创建为文本条。
5. 存盘
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
第十一课 眨眼效果
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
1. 打开一张图。
2. 点添加桢,复制第一桢并粘贴到第二桢。(一定要添加桢,不然图会乱跳)
3. 选择颜色选取工具,在上眼皮附近点一下选中皮肤色。
4. 用画笔工具把第二桢的眼睛涂成一条线状。(此时最好把图放大,一定要细心,重点就在这里)如图
5. 把第一桢设为30秒 第二桢高为5秒----眼睛就可以眨起来了。
6. 当然为了美观还可以多添加几桢,但一定要添加桢,再复制第一桢或者复制第二桢。如图:1,3,5桢相同 2,4,6桢相同
其他需要注意的是:最好采用漫画效果的头像图制作,彩色照片因为色彩过于丰富,做出来效果可能不太好。
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
第十二课 闪动字体
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
1. 新建一个文件:宽200 高80 背景完全透明
2. 采用文本工具T输入“音画天地”四个字,字体任选,大小为50 颜色采用两种颜色。我采用了大红与大绿。
3. 选择视频-----Darkroom-----HUE Saturation
4. 背景采用白色----应用这个效果20桢。如图设置。
5. 去除各桢白色背景----最关键的部位 先选择第二桢,再在左边第二桢所对应的层上点一下,使之成为蓝色。采用魔术棒,在白色背景上点一下,使之成为如图效果(表示选中白色,而不是选中字的颜色),按Delete键删除。只能一桢一桢删除,细心点没有办法。有好办法你告诉我哦。
6. 各桢设置为10
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
到此基本上UA5 的基本方法偶教完了,以后就看各位自由发挥了,可以用来做头像、做签名、做LOGO等等........要不,学好了大家来个比赛,看谁的创意好如何?
screen.width-500)this.style.width=screen.width-500;" border=0>此主题相关图片如下: screen.width-500)this.style.width=screen.width-500;" border=0>
LOGO 是一种链接用的小图标,比如说一个网站与另一个网站想建立一个友情链接,可以采用文字链接也可以采用LOGO 图链接,它的特点就是比文字醒目,可以说一个LOGO 就是一个网站的代言人。
通常LOGO 图标比较小,一个标准的LOGO 的长宽比是(88,31)也就是说宽是88高是31
最简单的方法就是在一个宽为88高为31的白色纸上写上自己网站的名字,然后再在这个基础上作一系列的变化,如字体、字形、渐入渐出、颜色、跳动、闪动、和其他小图变幻、和网站网址变换等等。
建议大家采用自己的网名作为LOGO 名字。以诗梦网的网址:http://shm.2000y.net/ 作为公用网址试试制作一个属于自己的LOGO。
以下LOGO 供大家参考
screen.width-500)this.style.width=screen.width-500;">screen.width-500)this.style.width=screen.width-500;">screen.width-500)this.style.width=screen.width-500;">screen.width-500)this.style.width=screen.width-500;">screen.width-500)this.style.width=screen.width-500;">screen.width-500)this.style.width=screen.width-500;">
screen.width-500)this.style.width=screen.width-500;">
关于LOGO 的制作
最简单的LOGO
1. 打开一张图,设置为宽88 高31
2. 在上面输入文字,采用前面讲过的 UA5 的文字方法:渐入、渐出、跳跃字、闪动字、垂直合并、水平合并等等方法。
3. 加上图形变化,比如:翻页、扩张等等方法。
4. 另存为
对于字体最好采用端正一点的字体。以便清楚看到。
想要变化一些的LOGO
可以在上面的基本上再采用UA5 的线条划过效果等。
还可以导入一些小图:小星、圆圈、方点、小树叶并在各桢移动~
LOGO 模板提供:
screen.width-500)this.style.width=screen.width-500;" border=0> screen.width-500)this.style.width=screen.width-500;" border=0> screen.width-500)this.style.width=screen.width-500;" border=0> screen.width-500)this.style.width=screen.width-500;" border=0> screen.width-500)this.style.width=screen.width-500;" border=0>
screen.width-500)this.style.width=screen.width-500;" border=0> screen.width-500)this.style.width=screen.width-500;" border=0> screen.width-500)this.style.width=screen.width-500;" border=0> screen.width-500)this.style.width=screen.width-500;" border=0> screen.width-500)this.style.width=screen.width-500;" border=0>
screen.width-500)this.style.width=screen.width-500;" border=0> screen.width-500)this.style.width=screen.width-500;" border=0> screen.width-500)this.style.width=screen.width-500;" border=0> screen.width-500)this.style.width=screen.width-500;" border=0> screen.width-500)this.style.width=screen.width-500;" border=0>
screen.width-333)this.width=screen.width-333">
|
|
目前网上最全的透明Flash下载(共138个)  电脑与网络
fermos的博客 发表于 2005/9/4 21:10:19 |
目前网上最全的透明Flash下载(共138个)
扬扬这么长时间以来发现最全的透明FLASH,共138个,快拿去美化你的网页吧~
自助下载,不用客气~嘻嘻~~下载地址为:
http://imgfree.21cn.com/free/flash/1.swf …… …… http://imgfree.21cn.com/free/flash/9.swf http://imgfree.21cn.com/free/flash/10.swf …… …… http://imgfree.21cn.com/free/flash/99.swf http://imgfree.21cn.com/free/flash/100.swf …… …… http://imgfree.21cn.com/free/flash/138.swf
中间省略号部分自己加,用Flashget“添加成批任务”很方便的哦~
问:何为透明的Flash?我们为什么要用透明的Flash??
答:Flash比GIF动画要漂亮些,我们把它设为透明后,Flash的背面我们可以插入一些漂亮的图片与之搭配达到很漂亮的效果;或者仅仅在网页中加入透明的Flash,乱跑的Flash动画不会影响浏览者看你的博客。可吸引更多的人来拜访你哦~~当然不可不提的是,插入Flash也需谨慎,因为它会使网页加载速度明显变慢。
附送我在网页中加入Flash的代码,教教不会的朋友们。
(一)首先教大家最简单的插入Flash的代码,透明,无坐标控制: 注意wmode="transparent"是控制Flash是否透明显示的,如果不想让它显示为透明的,直接把wmode="transparent"去掉即可。
<EMBED height=360 pluginspage=http://www.macromedia.com/go/getflashplayer src=http://imgfree.21cn.com/free/flash/17.swf type=application/x-shockwave-flash width=500 wmode="transparent" quality="high"></EMBED>
(二)再教教大家加入绝对坐标的透明Flash,绝对坐标意味着不管你的窗口拉多大,那个Flash依然乖乖地在原地不动:
<EMBED style="LEFT: 250px; WIDTH: 550px; POSITION: absolute; TOP: 200px; HEIGHT: 1000px" align=right src=http://user.hjenglish.com/yangbb/pics/snow.swf width=500 height=2000 type=application/octet-stream ;; quality="high" wmode="transparent">
效果见下面的帖子:http://www.hjbbs.com/dispbbs.asp?boardID=43&ID=193239
(三)最后教教大家如何加入相对坐标的透明Flash,注意下面代码的table部分,这主要是使用表格作为容器,把Flash“装”到表格里,这样不管浏览者把浏览器拉多大,Flash永远和表格一起动。而且,表格可以设置背景图片,表格上面再放一个透明Flash与背景图片相配合,哇塞,效果好得不得了!~
<table border="0" cellPadding="0" cellSpacing="0" width=600 height=382 align=center background=http://image.hjbbs.com/img/200410/200410259222581234.jpg> <TD width=600 height=382><EMBED pluginspage=http://www.macromedia.com/go/getflashplayer src=http://user.hjenglish.com/yangbb/pics/hearts.swf width="100%" height="100%" type=application/x-shockwave-flash wmode="transparent" quality="high"></EMBED></TD></td></table>
效果见下面的帖子:http://www.hjbbs.com/dispbbs.asp?boardID=43&ID=174779
|
|
|