论文部分内容阅读
[摘要]设学生管理数据库中有两个表:班级简况,学生情况。在Authorware中可以把班级简况表中的班级名称字段的值做树型树目录中的一级目录,把学生情况表的学生姓名做成二级目录。且用这个树型目录来操作数据库的中的记录非常方便,如果只有二级目录,设计详细页时只有两个页面,班级一个页面,学生一个页面,如果页面上的信息要详细,查询语句多一点内容罢了,与页面设计没有多大关系,且在详细页面还可以增加你所要的功能,如修改,删除,插入记录等。
[关键词]树型目录 数据库 查询
中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2008)0820046-02
一、引言
在vb,javascritp都可以有树型目录来操作数据库中的记录,在Authorware中可不可以呢?书上没有介绍,Authorware帮助也没有谈及,论坛上高手也说不能,但我脑海隐隐约约有能解决这个问题的思路,通过一个晚上的努力,终于把想法变成现实,写出来让同行分享。为了论述方便,功能不求全,只求能实现,只要知道了原理,做强做大不是问题。
二、设计思想
(一)用winctrls.u32库函数中WcDisplaycontrol()来确定目录的位置,大小,形状,监视器。
(二)用WcSetproPertyValue添加目录树中的条目,并设置图标和文字字号。我们研究的重点就在这里目录树中的条目。用数据库主表中主键的值做一级条目,子表中外键的所有值提取出来做目录树的二级条目。首先,载入tmsdns.u32库函数中的tmsdbregister函数,使数据库能自动注册,然后载入odbc.u32库函数中的odbcclose,odbcopen,odbcexecute三个函数实现对数据库及表的操作,当然,这较复杂,请参照后的程序。
(三)wcgetpropertyvalue()返回目录树中的文件,然后根据文本的类型,用goto()函数跳转到相应的页面,事实上,我们只设有两种类型:一个是班级,一个是学生,不管有多少班级,多少个学生,只用两个页,都能把他们的信息显示出来,这就是数据库的好处之一。
三、数据库设计
选用Access作数据库,数据库名:学生管理.mdb,其中有两个表,班级简况与学生情况,班级简况中有两个字段:班级代号,班级名称;先输入一些记录,班级代号是主键。学生情况表中有字:学号,班级代号,姓名,性别,
出生年月,家庭所在地等,班级代号是外键,学号是主键,也在每个班中添加一些记录。
四、程序设计
(一)在Authorware7.0中新建一个文件,保存为freeview.a7p,在函数窗口类型中选中freeview.a7p,分别点载入winctrls.u32中的wcdisplayc
ontrol(),wcsetpropertyvalue(),wcgetpropertyvalue;
tmsdns.u32中的tmsdbregister();odbc.u32中的odbcclose(),odbcopen(),odbcexecute.
(二)在流程线上添加一个计算图标,并命名为数据库注册。打开它,输入如下语句。
--数据库注册
dblist:="dsn=std;"
dblist:=dblist^"description=学生管理;"
dblist:=dblist^"fil=ms access;"
dblist:=dblist^"dbq="^FileLocation^"学生管理.mdb;"
result:=tMsDBRegister(4,"microsoft access driver (*.mdb)", dblist)
dn:="std"
de:=""
--把数据库“学生管理.mdb”打开
dc:=ODBCOpen(WindowHandle, de, dn, "","")
--从数据库的表班级简况提取记录,放入一个字符串变量DD中
sql:="select 班级代号,班级名称 from 班级简况 order by 班级名称"
dd:=ODBCExecute(dc, sql)
ODBCClose(dc)
Initialize(dc)
--计算DD的行数放入numline中
count1:=CharCount(dd)
newline:=GetLine(dd,1)
count2:=CharCount(newline)
numline:=INT(count1/count2)+1
i:=1
mcc:=""
--逐行读取班级简况的记录
repeat while i<=8
newline:=GetLine(dd,i)
--如果到了最后空行,退出循环
if newline="" then
exit repeat
end if
把一行中的各字段提取出,由于班级名称既有汉字,又有数字,AW把它分成两部分,这里花了我很多时间。A2^a3是班级名称。
a1:=GetWord(1,newline)
a2:=GetWord(2,newline)
a3:=GetWord(3,newline)
mc:=a2^a3
--把各记录的班级名称累加起来作为一级条目(目录树的)
mcc:=mcc^mc^"\r"
--把相对应的学生情况表的学生信息查出来。
exec:="select 姓名,学号,家庭所在地 from 学生情况 where 班级代号='"^a1^"'"
dc:=ODBCOpen(WindowHandle, de, dn, "","")
xsqk:=ODBCExecute(dc,exec)
ODBCClose(dc)
Initialize(dc)
count1:=CharCount(xsqk)
newline:=GetLine(xsqk,1)
count2:=CharCount(newline)
Numxs:=INT(count1/count2)+1
j:=1
--每一个班级有多名学生,把学生的姓名查出来作为二级条目
repeat while j<=numxs
xsline:=GetLine(xsqk,j)
if xsline="" then
exit repeat
end if
xm:=GetWord(1,xsline)
--下面哪个空格很关键,很让我费了一些神。
mcc:=mcc^" "^xm^"\r”
j:=j+1
end repeat
i:=i+1
end repeat
(三)在流程线上再加一个计算图标,命名为treeview,加入以下语句。
--第5个参数一定要是”treeview”,第6个参数是监视器,作用很大啊,它的值只有两种0,1
treeid:=wcDisplayControl(10, 5, 200, 400, "treeview", "cen")
--设置目录中字体大小为10号,你可以变。
wcSetPropertyValue(treeid, "fontsize", "10")
--设置目录树中的条目,参数mcc就是前面计算图标中花大力气算出来的,就是目录树中的条目,再强调一次,班级简况表的班级名称为一级条目,学生情况表中的姓名为二级条目。为了使大家明了看下图:
![](https://www.soolun.com/img/pic.php?url=http://img.resource.qikan.cn/qkimages/siva/siva200816/siva20081637-1-l.jpg)
在计算图标cen中输入如下语句:
获取用户单击目录树条目的文本。
tt:=wcGetPropertyValue(treeid, "text")
判断tt是班级名称还是学生的姓名,如是单击了班级名称,就跳转到框架右边的班级页,否则跳转到学生页面。
if SubStr(tt,1,1)="计" | SubStr(tt,1,1)="会"then
exec:="select 学号,姓名,性别,家庭所在地 from 学生情况 inner join 班级简况 on 学生情况.班级代号=班级简况.班级代号 where 班级名称='"^tt^"'"
dc:=ODBCOpen(WindowHandle, de, dn, "","")
bj:=ODBCExecute(dc,exec)
ODBCClose(dc)
Initialize(dc)
GoTo(IconID@"班级")
else
exec:="select 学号,姓名,性别,家庭所在地 from 学生情况 inner join 班级简况 on 学生情况.班级代号=班级简况.班级代号 where 姓名='"^tt^"'"
dc:=ODBCOpen(WindowHandle, de, dn, "","")
xscj:=ODBCExecute(dc,exec)
ODBCClose(dc)
Initialize(dc)
GoTo(IconID@"学生成绩")
end if
在班级群组与学生成绩群组中分别放入两个显示图标,并在适当位置分别输入{bj},{xscj},两个显示图标的属性的要选更新变量显示。到这里整个程序设计完成。
参考文献:
[1]张斌,《Authorware 7 多媒体体制作》,卓越科技,2004.12.
[2]黎明,《Authorware 6.5 多媒制作基础教程》,零点工作室.
[关键词]树型目录 数据库 查询
中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2008)0820046-02
一、引言
在vb,javascritp都可以有树型目录来操作数据库中的记录,在Authorware中可不可以呢?书上没有介绍,Authorware帮助也没有谈及,论坛上高手也说不能,但我脑海隐隐约约有能解决这个问题的思路,通过一个晚上的努力,终于把想法变成现实,写出来让同行分享。为了论述方便,功能不求全,只求能实现,只要知道了原理,做强做大不是问题。
二、设计思想
(一)用winctrls.u32库函数中WcDisplaycontrol()来确定目录的位置,大小,形状,监视器。
(二)用WcSetproPertyValue添加目录树中的条目,并设置图标和文字字号。我们研究的重点就在这里目录树中的条目。用数据库主表中主键的值做一级条目,子表中外键的所有值提取出来做目录树的二级条目。首先,载入tmsdns.u32库函数中的tmsdbregister函数,使数据库能自动注册,然后载入odbc.u32库函数中的odbcclose,odbcopen,odbcexecute三个函数实现对数据库及表的操作,当然,这较复杂,请参照后的程序。
(三)wcgetpropertyvalue()返回目录树中的文件,然后根据文本的类型,用goto()函数跳转到相应的页面,事实上,我们只设有两种类型:一个是班级,一个是学生,不管有多少班级,多少个学生,只用两个页,都能把他们的信息显示出来,这就是数据库的好处之一。
三、数据库设计
选用Access作数据库,数据库名:学生管理.mdb,其中有两个表,班级简况与学生情况,班级简况中有两个字段:班级代号,班级名称;先输入一些记录,班级代号是主键。学生情况表中有字:学号,班级代号,姓名,性别,
出生年月,家庭所在地等,班级代号是外键,学号是主键,也在每个班中添加一些记录。
四、程序设计
(一)在Authorware7.0中新建一个文件,保存为freeview.a7p,在函数窗口类型中选中freeview.a7p,分别点载入winctrls.u32中的wcdisplayc
ontrol(),wcsetpropertyvalue(),wcgetpropertyvalue;
tmsdns.u32中的tmsdbregister();odbc.u32中的odbcclose(),odbcopen(),odbcexecute.
(二)在流程线上添加一个计算图标,并命名为数据库注册。打开它,输入如下语句。
--数据库注册
dblist:="dsn=std;"
dblist:=dblist^"description=学生管理;"
dblist:=dblist^"fil=ms access;"
dblist:=dblist^"dbq="^FileLocation^"学生管理.mdb;"
result:=tMsDBRegister(4,"microsoft access driver (*.mdb)", dblist)
dn:="std"
de:=""
--把数据库“学生管理.mdb”打开
dc:=ODBCOpen(WindowHandle, de, dn, "","")
--从数据库的表班级简况提取记录,放入一个字符串变量DD中
sql:="select 班级代号,班级名称 from 班级简况 order by 班级名称"
dd:=ODBCExecute(dc, sql)
ODBCClose(dc)
Initialize(dc)
--计算DD的行数放入numline中
count1:=CharCount(dd)
newline:=GetLine(dd,1)
count2:=CharCount(newline)
numline:=INT(count1/count2)+1
i:=1
mcc:=""
--逐行读取班级简况的记录
repeat while i<=8
newline:=GetLine(dd,i)
--如果到了最后空行,退出循环
if newline="" then
exit repeat
end if
把一行中的各字段提取出,由于班级名称既有汉字,又有数字,AW把它分成两部分,这里花了我很多时间。A2^a3是班级名称。
a1:=GetWord(1,newline)
a2:=GetWord(2,newline)
a3:=GetWord(3,newline)
mc:=a2^a3
--把各记录的班级名称累加起来作为一级条目(目录树的)
mcc:=mcc^mc^"\r"
--把相对应的学生情况表的学生信息查出来。
exec:="select 姓名,学号,家庭所在地 from 学生情况 where 班级代号='"^a1^"'"
dc:=ODBCOpen(WindowHandle, de, dn, "","")
xsqk:=ODBCExecute(dc,exec)
ODBCClose(dc)
Initialize(dc)
count1:=CharCount(xsqk)
newline:=GetLine(xsqk,1)
count2:=CharCount(newline)
Numxs:=INT(count1/count2)+1
j:=1
--每一个班级有多名学生,把学生的姓名查出来作为二级条目
repeat while j<=numxs
xsline:=GetLine(xsqk,j)
if xsline="" then
exit repeat
end if
xm:=GetWord(1,xsline)
--下面哪个空格很关键,很让我费了一些神。
mcc:=mcc^" "^xm^"\r”
j:=j+1
end repeat
i:=i+1
end repeat
(三)在流程线上再加一个计算图标,命名为treeview,加入以下语句。
--第5个参数一定要是”treeview”,第6个参数是监视器,作用很大啊,它的值只有两种0,1
treeid:=wcDisplayControl(10, 5, 200, 400, "treeview", "cen")
--设置目录中字体大小为10号,你可以变。
wcSetPropertyValue(treeid, "fontsize", "10")
--设置目录树中的条目,参数mcc就是前面计算图标中花大力气算出来的,就是目录树中的条目,再强调一次,班级简况表的班级名称为一级条目,学生情况表中的姓名为二级条目。为了使大家明了看下图:
![](https://www.soolun.com/img/pic.php?url=http://img.resource.qikan.cn/qkimages/siva/siva200816/siva20081637-1-l.jpg)
在计算图标cen中输入如下语句:
获取用户单击目录树条目的文本。
tt:=wcGetPropertyValue(treeid, "text")
判断tt是班级名称还是学生的姓名,如是单击了班级名称,就跳转到框架右边的班级页,否则跳转到学生页面。
if SubStr(tt,1,1)="计" | SubStr(tt,1,1)="会"then
exec:="select 学号,姓名,性别,家庭所在地 from 学生情况 inner join 班级简况 on 学生情况.班级代号=班级简况.班级代号 where 班级名称='"^tt^"'"
dc:=ODBCOpen(WindowHandle, de, dn, "","")
bj:=ODBCExecute(dc,exec)
ODBCClose(dc)
Initialize(dc)
GoTo(IconID@"班级")
else
exec:="select 学号,姓名,性别,家庭所在地 from 学生情况 inner join 班级简况 on 学生情况.班级代号=班级简况.班级代号 where 姓名='"^tt^"'"
dc:=ODBCOpen(WindowHandle, de, dn, "","")
xscj:=ODBCExecute(dc,exec)
ODBCClose(dc)
Initialize(dc)
GoTo(IconID@"学生成绩")
end if
在班级群组与学生成绩群组中分别放入两个显示图标,并在适当位置分别输入{bj},{xscj},两个显示图标的属性的要选更新变量显示。到这里整个程序设计完成。
参考文献:
[1]张斌,《Authorware 7 多媒体体制作》,卓越科技,2004.12.
[2]黎明,《Authorware 6.5 多媒制作基础教程》,零点工作室.