ObjectTextToBinary过老梁程执行的功能与ObjectBinaryToText相反 将TXT文件转换为二进制流中的部件 而且只要TXT文件内容的书写符合DFM脚本语法 ObjectTextToBinary可将任何程序生成的TXT文件转换为部件 这一功能也为DFM 文件的动态生成和编辑奠定了基础 ObjectTextToBinary过程的主程序如下
procedure ObjectTextToBinary(Input Output: TStream)
var
SaveSeparator: Char
Parser: TParser
Writer: riter
…
begin
Parser := TParser Create(Input)
SaveSeparator := DecimalSeparator
DecimalSeparator :=
try
Writer := riter Create(Output )
try
Writer WriteSignature
ConvertObject
finally
Writer Free
end
finally
DecimalSeparator := SaveSeparator
Parser Free
end
end
在程序流程和结侍镇运构上与ObjectBinaryToText差不旅贺多 ConvertObject也是个递归过程
procedure ConvertObject
var
InheritedObject: Boolean
begin
InheritedObject := False
if Parser TokenSymbolIs( INHERITED ) then
InheritedObject := True
else
Parser CheckTokenSymbol( OBJECT )
Parser NextToken
ConvertHeader(InheritedObject)
while not Parser TokenSymbolIs( END ) and
not Parser TokenSymbolIs( OBJECT ) and
not Parser TokenSymbolIs( INHERITED ) do ConvertProperty
Writer WriteListEnd
while not Parser TokenSymbolIs( END ) do ConvertObject
Writer WriteListEnd
Parser NextToken
end
DFM文件与DFM脚本语言之间相互转换的任务由ObjectResourceToText和ObjextTextToResource两个过程完成
procedure ObjectResourceToText(Input Output: TStream)
begin
Input ReadResHeader
ObjectBinaryToText(Input Output)
end
ObjectTextToResource过程就比较复杂 因为DFM文件资源头中要包含继承标志信息 因此在调用ObjectTextToBinary后 就读取标志信息 然后写入资源头
procedure ObjectTextToResource(Input Output: TStream)
var
Len: Byte
Tmp: Longint
MemoryStream: TMemoryStream
MemorySize: Longint
Header: array[ ] of Char
begin
MemoryStream := TMemoryStream Create
try
ObjectTextToBinary(Input MemoryStream)
MemorySize := MemoryStream Size
FillChar(Header SizeOf(Header) )
MemoryStream Position := SizeOf(Longint) { Skip header }
MemoryStream Read(Len )
if Len and $F = $F then
begin
if ffChildPos in TFilerFlags((Len and $F )) then
begin
MemoryStream Read(Len )
case TValueType(Len) of
vaInt : Len :=
vaInt : Len :=
vaInt : Len :=
end
MemoryStream Read(Tmp Len)
end
MemoryStream Read(Len )
end
MemoryStream Read(Header[ ] Len)
StrUpper(@Header[ ])
Byte((@Header[ ])^) := $FF
Word((@Header[ ])^) :=
Word((@Header[Len + ])^) := $
Longint((@Header[Len + ])^) := MemorySize
Output Write(Header Len + )
Output Write(MemoryStream Memory^ MemorySize)
finally
MemoryStream Free
end
end
动态DFM文件应用揭秘
动态DFM文件概述
动态DFM文件是相对于静态DFM文件而言 所谓静态DFM文件是指在Delphi开发环境中设计的窗体文件 窗体的设计过程就是程序的编制过程 因此 动态DFM文件就是指在程序运行过程生成或存取的DFM文件
动态DFM文件的创建和使用分别如下两种情况
● 在程序运行过程中 由Create方法动态生成窗体或部件 然后动态生成其它部件插入其中生成DFM文件
● 在Delphi开发环境中 设计生成DFM文件 然后用DFM 文件存取函数 或者用Stream对象和Filer对象的方法 将DFM文件读入内存 进行处理 最后又存入磁盘中
由Delphi的窗体设计的常规方法生成的DFM文件在程序运行一开始就规定了部件的结构 因为在窗体设计过程中 窗体中的每个部件都在程序的对象声明中定义了部件变量 这种固定的结构虽然能方便应用 但以牺牲灵活性为代价
在Delphi应用程序中有时需要在运行过程中创建控制 然后将该控制插入另一个部件中 例如
procedure TForm Button Click(Sender: Tobject)
var
Ctrl: TControl
begin
Ctrl := TEdit Create(Self)
Ctrl Top :=
Ctrl Left :=
Ctrl Width :=
Ctrl Height :=
InsertControl(Ctrl)
end
动态插入控制的优点是可以在任何时刻 任意位置插入任意数量的任何类型的控制 因为应用程序需求在很多情况下是在程序运行中才知道的 所以动态插入控制就显得很重要 而且在很多情况下 需要保存这些界面元素 留待程序再次调用 例如应用程序界面的定制 系统状态的保存 对话框的保存等 这时生成动态DFM文件是最佳选择
动态插入控制的不足之处是在插入控制前 无法直观地看到控制的大小 风格 位置等 也就是动态插入控制的过程是非可视化的 但可以借助于静态DFM文件的可视化设计 这就是生成和使用动态DFM文件的第二种方法 也就是在应用程序运行前 在Delphi开发环境中 使用可视化开发工具设计所需窗口或部件的样式 以DFM文件保存 然后在应用程序运行过程中 将DFM文件读入内存 Delphi的Stream对象和Filer对象在读取DFM文件时 会根据DFM文件的内容自动创建部件及其拥有的所有部件
在使用动态DFM文件时有两点需要注意
● 每一个动态插入的控制或部件必须在程序中调用RegisterClass进行注册
● 读入DFM文件自动创建部件后 如果调用了InsertControl方法 则在关闭窗口时要调用RemoveControl方法移去该控制 否则会产生异常事件
动态DFM文件应用之一 超媒体系统的卡片设计
Delphi多种类型的可视部件 如文本部件 编辑部件 图形图像部件 数据库部件 媒体媒放部件和OLE部件等 每一种部件在屏幕中占据一定的区域 具有相当丰富的表现能力 可以作为卡片中的一种媒体 因此可以利用这些可视部件进行超媒体系统的卡片设计
超媒体卡片设计要求卡片中的媒体数目和媒体种类是不受限制的 而且必须能够修改和存取卡片 因此 采用动态DFM文件是比较合适的 而且如果利用Stream对象 将卡片存储在数据库BLOB字段中 就为把超文本与关系数据库技术结合起来创造了契机
下面是超媒体卡片设计子系统中的部分源程序 它演示了如何创建对象 插入对象和存取动态DFM文件
⑴ 在应用程序中注册对象
procedure TMainForm FormCreate(Sender: TObject)
begin
RegisterClass(TLabel)
RegisterClass(TEdit)
RegisterClass(TMemo)
RegisterClass(TButton)
RegisterClass(TPanel)
RegisterClass(TPanelP)
RegisterClass(TBitBtn)
…
end
⑵ 创建和插入对象
procedure TMDIChild FormClick(Sender: TObject)
var
Ctrl : TControl
Point: TPoint
begin
GetCursorPos(Point)
Point := BackGround ScreenToClient(Point)
case CurToolIndex of
: begin
Ctrl := TLabel Create(self)
TLabel(Ctrl) AutoSize := False
TLabel(ctrl) Caption := Label +S
TLabel(ctrl) Name := Label
TLabel(ctrl) Top := Point Y
TLabel(ctrl) Left := Point X
TLabel(Ctrl) Height := Round( *Res/ /Ratio)
TLabel(Ctrl) Width := Round( *Res/ /Ratio)
TLabel(Ctrl) Color := clWhite
TLabel(Ctrl) Font Color := clBlack
TLabel(Ctrl) Font Name := Roman
TLabel(Ctrl) Font Height := TLabel(Ctrl) Height
TLabel(Ctrl) Font Pitch := fpFixed
TLabel(Ctrl) Enabled := False
TLabel(Ctrl) OnClick := LabelClick
TLabel(Ctrl) OnMouseMove := ReportPos
BackGround InsertControl(Ctrl)
CurTool Down := False
CurTool := nil
…
end
: begin
Ctrl := TEdit Create(self)
TEdit(ctrl) AutoSize := True
TEdit(ctrl) Top := Point Y
TEdit(ctrl) Left := Point X
TEdit(Ctrl) Height :=
BackGround InsertControl(Ctrl)
…
end
:
…
end
end
⑵ 存取动态DFM文件
lishixinzhi/Article/program/Delphi/201311/25089关于选课系统的设计 周 虹
摘要:随着课程改革的不断深入,学校规模不断扩大、课程项目不断增多,为了解决学生选课管理上的复杂的人工 *** 作,减轻重复工作,故设计了选课系统。学校规模的扩大使得学校对每年新生入学、毕业生离校及本校各种分流机制造成的学生信息产生变动,如学籍变动、个人信息修改。为了适应课程的改革,学校在每个学期都要开设一定的课程提供给学生,让学生根据自己的情况来选择,根据学生选择结果给出课程表。本校根据教学实际,为了使教师有效地管理学生信息,设计学生信息管理系统,培虚由此形成学生成绩管理系统,本文就此设计思路进行阐述。
关键词:选课系统 学生信息管理系统 数据流图 DFD图 E-R图 SC图 IPO图 Delphi软件
随着学校规模的不断扩大,专业、班级、学生的数量急剧增加,有关学生选课的各种信息量也成倍增长,而目前许多高校的学生选课管理仍停留在复杂的人工 *** 作上,重复工作较多,工作量大,效率低,因此,迫切需要开发基于互联网的课程信息管理系统来提高管理工作的效率。基于互联网的学生选课管理系统,在学生选课的规范管理、科学统计和快速查询方面具有较大的实用意义。它提高了信息的开放性,大大地改善了学生、教师对其最新信息查询的准确性。
一、选课系统的任务概述
1. 目标
选课系统开发的目标是实现学生选课信息关系的系统化、规范化和自动化。
2. 系统技术
学生选课系统要求具有信息处理的开发性,方便教师上传学生成绩、学生上网选课和查询选课信息及成绩等,因此本系统设计为基于WWW的网络数据库应用系统,使用ASP脚本以Access为数据库的开发技术,运行在支持ASP的服务器上。
3. 基本设计概念和处理流程
采用基于SQL Server的分布式数据库管理系统。三层结构是目前用得最多的,这种结构比传统的C/S结构增加了一个应用程序服务器,应用程序服务器包括了统一的界面、业务规则和数据处理逻辑等等,这样客户端程序就可以做得比较小,也就是常说的瘦客户。更由于业务规则和数据处理逻辑的集中在服务器上统一管理,客户端无须进行复杂的计算,也不会因为错误的 *** 作而影响到其他的用户,所以可靠性、稳定性和效率都比较好。(其结构如图)
4. 用户的特点
为保证系统安全高效地运行,本系统把用户划分为3类:教务处、教师和学生。不同的用户在系统中的作用和权限也有所不同,所以它所需要完成的功能也就不同。
(1)教务处可以完成本系统所有的功能
学生信息管理:除学生基本信息外,还可管理学生所选课程、成绩等。
教师信息管理:包括教师个人的基本情况和任课情况。
项目及班数的设定:根据学校教务处所排课进行班级数及人数的统计,然后根据统计结果进行项目及班数的设定。
排课:根据上一步分班情况安排任课教师。
报表生成及输出:生成教师担任课程分班表、按项目生成学生成绩表、按学生行政班生成成绩表及所有报表的输出敏族。
(2)教师在本系统的功能
查询学生选课情况、自己任课情况、获取自己所担任课程分班表、录入及修改成绩等。
(3)学生在本系统的功能
查询本人信息、教师任课信息、选课、选课信息查询、成绩查询。
二、需求规定
(一)对功能的规定
1. 可实现学生选课注册。
2. 方便实现学生选课信息查询。
3. 可对学生成绩档案进行管理,成绩表单生成简便。
4. 安全有效的用户区分,管理。
5. 档案数据的高安全性,保密性。
6. 有帮助文档
(二)对性能的规定
使用稳定, *** 作性能好, *** 作方法易于掌握,系统的安全性强。
三、设计思想
用户的需求具体表现在对各种信息的提供、编辑、处理及查询统计上。这就要求数据库结构能充分满足各种信息的输入、处理和输出。通过分析学生选课管理系统的现实需求配拿燃,学生选课管理系统各环节的基本数据及数据处理流程,在与管理人员沟通、交流与探讨的基础上,得到以下学生选课系统的数据流程图。
(一)数据库的设计
通过对学生选课管理系统工作内容和相关数据流程分析,根据学生选课管理系统的需要,就可以设计出能满足用户需求的各种实体,以及它们之间的关系,由此得到数据库所支持的数据模型,即数据库的逻辑结构,具体情况如下:
1. 学生信息表
开学时将教务处提供的学生信息库按系统的要求修改库结构并导入Access数据库中,应包括如下信息:姓名、学号、院系、班级、性别、所选课程、任课教师、备注等。
2. 教师信息表
包括教师姓名、教师代码、性别、年龄、职称、主要教授课程、兼任课程等。
3. 课程信息
包括课程目录、课程、课程代码、教学内容、任务与目的、考试方法、要求等。
4. 课程表
包括课程名称、课程编号、任课教师、课程学分、上课时间。
5. 成绩单列表
包括学生姓名、学号、院系、班级、课程、任课教师、成绩。
(二)系统功能特点
1. 内容全面 系统全面覆盖了体育课信息,可为学校、教师和学生提供全面准确的信息。
2. 层次分明 系统采用模块化程序设计结构。各模块之间既相互独立,又具有一定的联系,各模块可独立编制、调试、查错、修改和执行,结构严谨,便于扩展和维护。
四、数据库概念设计
根据以上数据流图导出数据库所需数据项和数据结构。
学生:学号、姓名、性别、生日、所在院系、所在班级。
课程:课程号、课程名、讲师、上课时间、地点、课程简介。
选课结果:记录号、选课学生、所选课程。
学籍变更记录:记录号、变更情况、记录时间、详细描述。
1. 数据库逻辑结构设计
设计五个基本表:学生信息表、课程信息表、选课结果表、奖惩信息表、教师信息表。其中教师信息表是外部表,不列出。由于使用打开系统的不只是教务人员,每个学生都要登录到选课系统进行课程的选择,所以需要对不同的登录人员进行密码的认证和权限的限制,防止越权行为,用户名、密码、权限保存在一个表中。分别设计如下表:(具体内容略)
USER-PASS用户密码信息表
COURSE课程信息表
COURSE-SELECT选课结果表
STUDENT学生个人信息表
奖惩记录信息表
2. 概要设计
4. 选课模块详细设计说明书
功能:接受学生选课信息,刷新学生课程表。
界面:调用添加、删除模块,打印课表模块。
设计感想
通过这次实践,我对Delphi有了全新的认识。Delphi可以让你用最少的程序量来得到最高的开发效率,从而迅速地开发Windows的应用程序。开发者可按照自己的喜好及用户要求,随心所欲地安排窗口的外观。Delphi是以面向对象的方式设计程序代码的,有着面向对象的四大特征:封装性、可维护性、继承性和多态性。
当然,这个系统还有些地方需要修改和完善,我将在以后的时间里逐步学习改进。
参考文献:
〔1〕〔美〕Grady Booch,James Rumbaugh,Ivar Jacobson,UML用户指南.机械工业出版社,2001年8月.
〔2〕Microsoft,MSDN.
〔3〕Microsoft,SQL Server 2000联机手册.
〔4〕Roger S. Pressman.软件工程——实践者的研究方法.机械工业出版社,1997.
〔5〕IPL. Software Testing and Software Development Lifecycles. IPL,1996.
〔6〕Karl E. Wiegers.软件需求.机械工业出版社,1999.
〔7〕张海藩.软件工程导论.清华大学出版社.
http://www.google.cn/search?q=%E5%AD%A6%E7%94%9F%E9%80%89%E8%AF%BE%E7%A8%8B%E5%BA%8F+delphi%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1&sourceid=navclient-ff&ie=UTF-8&rlz=1B2GGFB_zh-CNCN278CN278
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)