通达学院
2013/20##学年 第二学期
软件设计 实验报告
专 业 Delphi软件设计
学 生 班 级 110023
学 生 学 号 11002314
学 生 姓 名 孙敏杰
指 导 教 师 汪胡青
网络聊天室
一、 实验操作
利用Delphi自带的TCPCLIENT组件和TCPSERVER组件,编写了一个简易的网络聊天室程序,这个程序将以同步的方式在服务器端和客户端进行通信,而且是多线程程序,可以处理多个连接的请求。程序运行后,在窗口上部填写远程主机地址、端口以及本地端口号,注意,两个端口号必须一致,否则无法完成监听。然后单击“改变主机设置”按钮,即可连接到远程主机。接着在窗口下部的MEMO文本框中填写发送的信息,单击“发送”按钮,即可将信息发送到远程主机窗口。程序界面效果如图所示。
二、 实验要点
1、tcpClient组件的应用;
2、tcpServer组件的应用。
三、 步骤详解
1、新建一个应用程序,在窗口中添加一个TPanel组件,align属性设置为alTop,然后在该面板中添加三个TLable组件和三个TEdit组件,分别用于设置远程主机和本地主机的地址、端口。接着再添加一个TButton组件,caption属性为“改变主机设置”。
2、在窗口中添加两个TPanel面板,然后分别在面板中添加一个TMemo多行文本编辑框,分别用于显示接收信息和发送信息,其中用于接收信息的memo组件的readonly属性设置为true。
3、最后在窗口中添加一个TButton组件,caption属性为“发送”,再从internet组件面板上分别拖放一个tcpClient组件和一个tcpServer组件到窗口中。
四、 代码添加与解释
1、打开代码编辑器,在接口部分添加一个自定义线程类:
//创建线程,以同步方式写入GUI窗口。必须这样,才能够同时处理多个连接的请求TClientDataThread = class(TThread)
private
public
ListBuffer :TStringList;
TargetList :TStrings;
procedure synchAddDataToControl;
constructor Create(CreateSuspengded: Boolean);
procedure Execute; override;
procedure Terminate;
end;
2、 在代码实现部分,添加线程类的实现代码:
//TClientDataThread线程类的实现代码
constructor TClientDataThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := ture;
ListBuffer := TStringList.Create;
end;
procedure TClientDataThread.Terminate;
begin
ListBuffer.Free;
inherited;
end;
procedure TClientDataThread.Execute;
begin
Synchronize(synchAddDataToControl); //同步
end;
procedure TClientDataThread.synchAddDataToControl;
begin
TargetList.AddStrings(ListBuffer);
end;
3、双击“改变主机设置”按钮,添加如下代码:
//改变服务器端配置
procedure TForm1.Button1Click(Sender: TObject);
begin
TcpServer1.LocalPort := Edit1.Text; //指定端口
TcpServer1.Active := True;
end;
4、双击“发送”按钮,添加如下代码:
//客户端发送信息
procedure TForm1.Button2Click(Sender: TObject);
var
I: Integer;
begin
TcpClient1.RemoteHost := Edit1.Text; //远程主机地址
TcpClient1.RemotePort := Edit2.Text; //远程主机端口
try
if TcpClient1.Connect then
for I :=0 to Memo1.Lines.Count - 1 do
TcpClient1.Sendln(Memo1.Lines[I]); //发送信息
finally
TcpClient1.Disconnect; //断开连接
end;
end;
5、双击tcpServer组件的onaccept事件,添加如下代码:
//服务器端接收到信息的处理
procedure TForm1.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
var
s: string;
DataThread: TClientDataThread;
Begin
//创建自定义线程
DataThread:=TClientDataThread.Create(true);
//将线程的TargetListset设置为同步显示信息的组件MEMO
DataThread.TargetList := Memo1.lines;
//加载线程的ListBuffer信息
DataThread.ListBuffer.Add('***已经连接上远程主机并收到消息***');
DataThread.ListBuffer.Add('远程主机: ' + ClientSocket.LookupHostName(ClientSocket.RemoteHost) +
'(' + ClientSocket.RemoteHost + ')');
DataThread.ListBuffer.Add('===== Begin message =====');
s := ClinetSocket.Receiveln; //取得客户端传递的信息
while s <> " do
begin
DataThread.ListBuffer.Add(s);
s := ClientSocket.Receiveln;
end;
DataThread.ListBuffer.Add('===== End of message =====');
//同步将ListBuffer中的信息显示在TargetList目标位置
DataThread.Resume;
end;
end.
人事管理系统概述
1.1 人事管理系统简介
1.2 人事管理系统功能描述
需求分析:2.1 系统目标 2.2 业务流程2.3 数据流程2.4 数据字典
系统设计:3.1系统功能3.2 系统结构
数据库设计:4.1 E-R图
主窗体设计:5.1 主窗体设计5.2 功能导航栏设计
程序设计与编码:6.1 系统登陆窗体的设计 6.2 操作员管理窗体的设计
6.3 修改密码窗体的设计 6.4 人事信息窗体的设计
系统测试 :7.1 系统测试目的 7.2 系统测试
心得总结
1.1 人事管理系统简介
随着全球对知识和人才的重视,企业对人事管理重要性的认识逐渐深化,人才的全球化竞争使企业的人事管理面临前所未有的挑战。在新形势下,人事管理系统是一个企业单位不可缺少的部分,是适应现代企业制度,推动企业人事管理走向科学化、规范化、自动化的必要条件;是应对挑战、适应环境变化、提高企业管理效率、提升核心竞争力的关键措施。它所包含内容对于企业的决策者和管理者来说至关重要。目前市场上的人力资源系统很多,但要找到一款真正称心、符合公司实际情况的并不容易。由于存在这样那样的不足,使企业浪费了大量的人力、物力等大量资源,难以真正提升企业人力资源的管理水平,提高工作效率及降低管理成本的效果也不明显。因此,为了加快公司信息化的步伐,提高公司的管理水平,并在激烈的社会竞争中立于不败之地,建立及完善人事管理系统已变得十分必要和迫切。
人事管理系统主要是管理员工企业日常事务中的人事工作,使用人事管理系统会降低了资源管理成本,使管理者能集中精力在企业战略目标;另一方面,通过软件及时收集与整理分析大量的人事管理数据,为企业战略决策的生成与实施控制提供强有力的支持,以提高组织目标实现的可能性。
1.2 人事管理系统功能描述
人事管理系统就是要实现对某单位的职工进行管理,整个系统包括人事资料的录入、资料查询和资料删除等功能。
人事管理系统应该能够灵活有效的管理,体现多角色、多层次特色。不同的企业其人事管理业务与流程各不相同,随着管理要求的提高,人事管理软件需要具备人事业务流程的制订、修改、控制等操作。通过人事管理系统使得管理者快速高效地完成企业日常事务中的人事工作,降低了人事管理成本,使管理者能集中精力在企业战略目标;另一方面,通过软件及时收集与整理分析大量的人事管理数据,为企业战略决策的生成与实施控制提供强有力的支持,以提高组织目标实现的可能性。
需求分析
2.1 系统目标
人事管理系统就是要实现对某单位的职工进行管理,整个系统主要实现包括人事资料的录入、资料查询和资料删除等功能。
在应用系统使用中,为保证系统的安全,必须设置用户检测程序。合法用户可进入,非合法用户拒绝登陆。同时要能够设置用户的使用权限,用户登录后只能进行其权限所允许的操作。用户可以修改本人的密码,系统管理员可以修改、冻结或删除普通用户。
2.2 业务流程图
操作员管理业务流程图
2.3 数据流程图
2.4 数据字典
数据字典就是将数据元素、数据流、数据存储、处理功能和外部实体等的详细情况加以记录,并按照一定方式进行排列所形成的一部关于数据的字典。
数据字典是有关数据的信息的收集、维护和发布的机制,是有关数据的数据即元数据的中心仓库,数据字典是提供关于数据元素、元素组、记录信息的定义和使用机制,以及数据实体之间的联系。
2.4.1建立数据元素
表-1 操作员数据结构
表-2 人事信息数据结构
2.4.2建立数据流
数据流表明了数据的流动方向及其名称,是数据载体的表现形式之一。在数据字典中所定义的数据流有两类:一类是从外部实体输入到系统中的数据流,二是从系统输出到外部实体的数据流。
系统设计
3.1系统功能
1、用户管理模块。主要是实现操作用户的增加、删除、修改。
2、密码修改模块。该模块主要实现各操作用户修改自己的操作密码,系统管理用户
可以修改其他用户的密码。
3、系统初始化模块。主要用来实现初始化功能,即清除所有数据表中的信息,只在
operator.db数据表中保留一条默认的管理员信息。
4、退出模块。就是退出系统。
3.2 系统结构
数据库设计
4.1 E-R图
实体属性一览表:
管理员(用户名,密码,部门,联系电话,工资,职务,操作权限,查询权限,管理权限,最后操作时间)
职员(职工编号,职工姓名,性别,出生年月,身份证号,地址,联系电话,单位,工资,职务,专业,参加工作时间,离职时间)
部门(部门编号,部门名称,主管)
主窗体设计
5.1 主窗体设计
5.1.1界面设计
创建一个新的工程文件,保存源程序文件名为main.pas,工程文件名为rlzygl.dpr,在窗体中添加一个mainmenu组件,一个toolbar组件,在toolbar组件中添加6个toolbutton组件,一个imagelist组件,双击imagelist组件打开对话框添加6个图片程序设计界面
5.1.2属性设置
窗体所涉及的组件有mainmenu,toolbutton,toolbar等。其属性设置具体如下
第5.1节窗体属性设置 表5-1 窗体及组建的属性设置
5.1.3 程序设计
代码如下: var
main_Form:Tmain_Form; username:string; password:string; R1,R2,R3:boolean; implementation
uses login, Unit3, Unit4, Unit5, Unit6; {$R *.dfm}
procedure Tmain_Form.FormActivate(Sender: TObject);
begin
username:='';
password:='';
R1:=false;
R2:=false;
R3:=false;
F_login.showModal();
if username<>'' then
begin
if R1=true then
begin
n4.Enabled:=true;
n6.Enabled:=true;
toolbutton1.Enabled:=true; toolbutton3.Enabled:=true; end
else
begin
n4.Enabled:=false;
n6.Enabled:=false;
toolbutton1.Enabled:=false; toolbutton3.Enabled:=false; end;
if R2=true then
begin
n2.Enabled:=true;
toolbutton4.Enabled:=true; end
else
begin
n3.Enabled:=false;
toolbutton4.Enabled:=false; end;
if R3=true then
begin
n3.Enabled:=true;
toolbutton5.Enabled:=true;
end
else
begin
n3.Enabled:=false;
toolbutton5.Enabled:=false;
end;
end
else
close;
end;
procedure Tmain_Form.N3Click(Sender: TObject); begin
F_check.showModal();
end;
procedure Tmain_Form.N8Click(Sender: TObject); begin
close;
end;
procedure Tmain_Form.N2Click(Sender: TObject); begin
F_rsInfo.showModal();
end;
procedure Tmain_Form.N5Click(Sender: TObject); begin
F_changepw.showmodal();
end;
procedure Tmain_Form.N4Click(Sender: TObject); begin
F_operator.showmodal();
end;
procedure Tmain_Form.N6Click(Sender: TObject); var
Tabel1:TTable;
begin
Table1:=TTable.create(self);
Table1.DatabaseName:='RLZYGL';
Table1.TableName:='opertaor.db';
Table1.EmptyTable;
Table1.open;
Table1.Append;
Table1.fieldbyname('username').asstring:='admin'; Table1.fieldbyname('password').asstring:='admin';
Table1.fieldbyname('department').asstring:='计算机系'; Table1.fieldbyname('stamp').asdatetime:=date();
Table1.fieldbyname('right1').asboolean:=true;
Table1.fieldbyname('right2').asboolean:=true;
Table1.fieldbyname('right3').asboolean:=true;
Table1.post;
Table1.close;
Table1.Tablename:='info.db';
Table1.emptytable;
Application.MessageBox('初始化结束!','提示信息',mb_ok); end;
procedure Tmain_Form.Button1Click(Sender: TObject); begin
F_login.show;
end;
end.
程序设计与编码
6.1 系统登陆窗体的设计
图6-1 登陆窗口
用户名为:admin,密码为:admin进入人事管理系统,非法用户不可以进入系统。程序代码在附录里显示。
6.2 操作员管理窗体的设计
图6-2 操作员管理窗口
6.3 修改密码窗体的设计
图6-3 修改密码窗口
6.4 人事信息窗体的设计
图6-4 人事信息窗口
系统测试
7.1 系统测试目的
对程序设计工作的检验是进行系统测试,是保证系统质量和可靠性的关键步骤。总之,测试的目的是发现软件中的错误,应该把查出新错误的测试看做是成功的测试,没有发现新错误的测试是失败的测试。但发现错误不是目的,目的是开发出高质量的完全符合用户需要的软件。
7.2 系统测试
系统测试是把经过测试的子系统装配成一个完整的系统然后进行测试。在这个过程中不仅能发现设计和编码的错误还能验证系统是否提供需求说明中指定的功能,而且能验证系统的动态特性是否预订要求。人事管理系统连接数据库正确,但是无法正常运行,也没有办法进行验证测试,功能没有实现。
心得总结
通过本次的软件设计,学到了很多关于Delphi的知识。程序主要是利用delphi来实现人事管理系统。 经过此次软件设计,我对的delphi语言有了一定的了解,delphi与编程很类似,界面设计较简单和代码编译速度相对也较快。在编程的过程中遇到了些问题,通过自己翻书,上网查资料及向老师同学们请教,这些问题也得到了解决。经历了软件设计,不仅对我的学习提供了帮助,而且在各方面也得到了锻炼。没有足够的耐力和信心就很难坚持对软件设计每一步的顺利进行。同时我还要非常感谢我的任课老师对此次软件设计的精心安排和耐心指导。在软件设计过程中,老师无论是在理论上还是在实践中,都给了我很大的帮助。使我在程序的开发等各个方面得到了很大的提高。老师治学态度严谨,工作态度认真负责,为人亲切和蔼,学术理论和实践经验丰富,是我们学习的好榜样。在开发系统的过程中,我们团结合作,充分发挥了集体的力量,很好的完成了此次的软件设计。
附 录
操作员管理代码
procedure TF_operator.SpeedButton1Click(Sender: TObject);
begin
Table1:=TTable.creat(self);
Table1.DatabaseName:='1220';
Table1.TableName:='opertaor.db';
Table1.open;
Table1.setkey;
Table1.Fieldbyname('name').asstring:=edit1.text;
if table1.gotokey then
begin
if Radiobutton1.Checked then
begin
Application.MessageBox('用户名相同,请检查!','提示信息',mb_ok); edit1.Text:='';
edit2.Text:='';
edit3.Text:='';
edit1.SetFocus;
end
else
if Radio2.checked then
begin
Table1.edit;
savetotable;
table1.post;
end
else
begin
Table1.edit;
table1.Delete;
table1.first;
loadfromtable;
end;
end
else
begin
if Radiobutton1.Checked then
begin
Table1.Append;
table1.edit;
savetotable;
table1.post;
end
else
begin
Application.MessageBox('没有该用户,请检查!','提示信息',mb_ok); edit1.Text:='';
edit2.Text:='';
edit3.Text:='';
edit1.SetFocus;
end;
end;
table1.close;
end;
procedure TF_operator.FormActivate(Sender: TObject);
begin
edit1.Text:='';
edit2.Text:='';
edit3.Text:='';
edit4.Text:='';
edit4.Readonly:=true;
edit4.Tabstop:=false;
checkbox1.Checked:=false;
checkbox2.Checked:=false;
checkbox3.Checked:=false;
edit4.Text:=datetostr(date());
Table1:=TTable.creat(self);
Table1.DatabaseName:='1220';
Table1.TableName:='opertaor.db';
Table1.open;
if not Table1.Eof then
LoadFormTable;
Table1.Close;
Radiobutton2.Checked:=true;
end;
procedure TF_operator.loadFormtable;
begin
edit1.text:=table1.fieldbyname('username').asstring;
edit2.text:=table1.fieldbyname('password').asstring;
edit3.text:=table1.fieldbyname('department').asstring;
edit4.text:=datetostr(table1.fieldbyname('stamp').asdatetime); checkbox1.checked:=table1.fieldbyname('right1').asboolean;
checkbox2.checked:=table1.fieldbyname('right2').asboolean;
checkbox3.checked:=table1.fieldbyname('right3').asboolean;
end;
procedure TF_operator.savetotable;
begin
table1.fieldbyname('username').asstring:=edit1.text;
table1.fieldbyname('password').asstring:=edit2.text;
table1.fieldbyname('department').asstring:=edit3.text;
table1.fieldbyname('stamp').asdatetime:=strtodate(edit4.text); table1.fieldbyname('right1').asboolean:=checkbox1.checked;
table1.fieldbyname('right2').asboolean:=checkbox2.checked;
table1.fieldbyname('right3').asboolean:=checkbox3.checked;
end;
procedure TF_operator.SpeedButton2Click(Sender: TObject);
begin
close;
end;
procedure TF_operator.RadioButton1Click(Sender: TObject);
begin
edit1.Text:='';
edit2.Text:='';
edit3.Text:='';
edit4.Text:=datetostr(date());
checkbox1.Checked:=false;
checkbox2.Checked:=false;
checkbox3.Checked:=false;
edit1.setfocus;
end;
procedure TF_operator.Edit1Exit(Sender: TObject);
begin
if not Radiobutton1.checked then
begin
table1.open;
table1.setkey;
table1.Fieldbyname('name').asstring:=edit1.text;
if not table1.gotokey then
begin
Application.MessageBox('没有该用户,请检查!','提示信息',mb_ok); edit1.SetFocus;
end
else
loadformtable;
end;
table1.close;
end;
end.