




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
delphi 2005 下的B/S程序设计(宋雨炫 2004-12) 更新说明:修改了上一篇的一些错误,增加了一些新内容。有朋友来信询问了一些问题,在这里写了一个小结。白天要工作,半夜写的,内容不多,请谅解。等完成d8程序转到2005后,就将2005的完整程序发上来(以下内容已经过2005测试)。 刚刚拿到2005没有几天,还没有完全了解到它的新特性以及新功能,d8的很多方法在2005下也可以使用,不过也有一些函数的用法发生了变化。才开始学习B/S编程,算是个新手,用d8也做了些东西,这篇文档是在把以前d8做的东西改到2005下过程中的一些学习心得,供大家参考。写得比较粗糙,也比较乱,很多东西都没来得及检查,所以里面可能会有一些方法错误,望大家谅解。 本文以制作一个论坛为例,简单地介绍了delphi 2005 的B/S程序设计方法。数据库:SQL 2000,编程:delphi 2005 ARCHITECT。一、调试准备及数据库设计1、简单配置IIS点击“开始”-“程序”-“管理工具”-“Internet信息服务(IIS)管理器”点击“网站”按鼠标右键-“新建”-“网站”在出现的对话框中“描述”中起名,随便起,例如“1”,点击下一步:“网站IP地址”:随便输入例如,“网站TCP端口”:一般为80,也可输入81等,如不为80,在访问网站时则需输入:81。点击下一步,“输入主目录路径”:如D:IIS点击下一步,然后“完成”。这时,就能在“网站”中看到新建的网站“1”了,在“1”处点击鼠标右键选择“属性”,在对话框中其他东西不需修改,只需将“文档”中点击“添加”将以上目录中WebForm1.aspx(也就是首页,如Index.aspx等等)文件添加到其中即可点击确定即完成一个简单网站的配置。2、数据库设计(部分) 一个论坛的数据库设计其实很繁琐,在这里用几个最常用的说明一下问题:数据库名:NetManager。(1)表名:Access_Data(记录登录用户的各类信息)字段名 类型 长度 说明-ID bigint8 序号IP_Addr varchar80 用户登录IP地址Land_Date varchar80 用户登录时间-日期Land_Time varchar80 用户登录时间-时间Option_sys varchar100 用户的操作系统Brow_sys varchar100 用户的浏览器类型Current_Itemvarchar800 用户当前使用的页面Settle_Datevarchar80 用户停留的-日期Settle_Timevarchar80 用户停留的-时间UserLog varchar80 登录的用户名UserPaswordvarchar50 登录的密码(2)表名:Forum_Data(发布帖子的纪录)字段名 类型 长度 说明-ID bigint8 序号IP_Addr varchar80 用户IP地址Speak_Datevarchar80 发言-日期Speak_Timevarchar80 发言-时间Motif varchar800 发言论坛板块的名称Grade varchar50 发言的类型(0:标题,1:回帖,.等)Place varchar50 帖子位置(0:置顶.等)StateIco varchar250 帖子状态的图标(如:多于多少回复、点击.等状态的图标)CaptionIcovarchar250 标题图标(发布帖子时选择的图标)CaptionNamevarchar800 帖子的名称Content varchar8000 帖子内容UserName varchar50 发布用户名Pasword varchar50 密码Portrait varchar80 用户头像Adage varchar8000 格言(注册用户时选择输入,通常附在发言的后面)AdagePic varchar250 格言图片(注册用户时选择输入,通常附在发言的后面)AttackNum varchar50 点击数Pink varchar50 精华帖(由斑竹来确定)Writeback varchar50 回帖数.等等(根据需要自行设计)。(3)表名:Register_Data(注册用户信息)字段名 类型 长度 说明-ID bigint8 序号IP_Addr varchar80 IP地址Username varchar80 用户名Pasword varchar80 密码Safe_qu varchar80 安全问题(登录时可以选择输入)Safe_answ varchar80 安全问题回答Email varchar80 邮件地址.以下选填内容.Sex varchar80 性别Fete_Y varchar80 出生年Fete_M varchar80 出生月Fete_D varchar80 出生日Froma varchar250 来自哪里QQ_code varchar80 qq号码Msn_code varchar80 msn号码Atman_infovarchar800 自我介绍Atman_ico varchar80 头像Atman_pen varchar80 个人签名Regist_Datevarchar80 注册-日期Regist_timevarchar80 注册-时间.等等(根据需要自行设计)。先简单写这几个基本表,在后面主要以这几个表进行程序设计。二、程序设计在delphi 2005下建立一个新的应用:下一步在“Name”中输入WebApp(当然可以随便起名字了),“Location”输入D:IIS(在硬盘上随便建一个文件夹也可以,在配置网站时目录指向它就可以了),点击“OK”。在右侧Project Manager中将其名称改为Index.aspx。下面就可以进行程序的设计。(1)首页面设计注意:在每个pas文件的uses里面都要加上Borland.Vcl.SysUtils。双击Project Manager中的Global.asax,在Tool Palette中的Data Components中点击SqlConnection和SqlCommand,将其放置在页面上,在SqlConnection控件的ConnectionString中写下面语句:data source=(local);initial catalog=NetManager;persist security info=False;user id=sa;password=;再将SqlCommand的Connection指向SqlConnection。然后在页面中切换到Global.pas文件写如下代码:procedure TGlobal.Session_Start(sender: System.Object; e: EventArgs);var DateTime : TDateTime; SQLCom,Str_IpAddr,Str_Brow,Str_Option: String;begin Str_IpAddr := Request.UserHostAddress; /取得IP地址 if Request.UserAgent.IndexOf(MSIE)-1 then begin /取得浏览器 Str_Brow := Microsoft Internet Explorer +Request.Browser.Version; end else Str_Option := Request.Browser.Browser+ +Request.Browser.Version; if Request.UserAgent.IndexOf(Windows NT 5.2)-1 then begin /取得操作系统 Str_Option := Windows 2003 ; end else if Request.UserAgent.IndexOf(Windows NT 5.1)-1 then begin Str_Option := Windows XP ; end else if Request.UserAgent.IndexOf(Windows NT 5.0)-1 then begin Str_Option := Windows 2000 ; end else Str_Option := Request.Browser.Platform; ShortDateFormat:=yyyy年m月d日; /取得现在时间 DateTime := Time; SqlConnection1.Open; /打开数据库 SQLCom := INSERT INTO Access_Data (IP_Addr,Land_Date,Land_Time,Option_sys,Brow_sys,Current_Item,Settle_Date,Settle_Time,UserLog) VALUES (+ char(39) + Str_IpAddr + char(39) + char(44) + char(39) + DateToStr(Date) + char(39) + char(44) + char(39) + TimeToStr (DateTime) + char(39) + char(44) + char(39) + Str_Option + char(39) + char(44) + char(39) + Str_Brow + char(39) + char(44) + char(39) + 首页 + char(39) + char(44) + char(39) + DateToStr(Date) + char(39) + char(44) + char(39) + TimeToStr (DateTime) + char(39) + char(44) + char(39) + 游客 + char(39) +); SqlCommand1.CommandText := SQLCom; SqlCommand1.ExecuteNonQuery; SqlConnection1.Close;end;这段代码是用户登录时记录用户的各种信息,并将其写入数据库。将登录信息在这里,可以防止用户刷新浏览器而造成的重复记录,同时也可以更方便的统计当前在线用户数量。在这段代码里面没有记录在线用户数量,可根据需要设定一个参数往数据库里面写,大概方法就是:procedure TGlobal.Session_Start(sender: System.Object; e: EventArgs);会话开始时取得在线记录+1,procedure TGlobal.Session_End(sender: System.Object; e: EventArgs);会话结束时取得在线记录-1,用户每次登录将在线用户显示在页面上。这类方法很多,你可以在网上搜索一下C#或其他asp的例子文章,然后参照上面的写法直接套用到delphi上面。再打开Index.aspx文件,在Tool Palette中的Data Components中点击SqlConnection(方法与上面相同)将其放置在页面上,再点击SqlDataAdapter,放置到页面,在其“填充”里面的SelectCommand的CommandText写下面的语句:SELECT * FROM Access_Data,Connection指向SqlConnection。在SqlDataAdapter点击鼠标右键,选择Generate DataSet,选择New,点击“OK”,就生成了一个DataSet,切换到index.pas,写如下代码:procedure TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs);var i,RecoNumber : integer;begin SqlConnection1.Open; /打开数据库 SqlDataAdapter1.Fill(DataSet5); RecoNumber := DataSet5._Table.Rows.Count - 1; /取得记录数 Str_OldLandTime.Visible := False; Str_OldLandTime.Text := 您是首次访问; i := 0; Str_IpAddr.Text := Request.UserHostAddress; while RecoNumber -1 do begin if i 0 then begin if DataSet5._Table.RowsRecoNumber.Item1.ToString = Str_IpAddr.Text then begin Str_OldLandTime.Text := DataSet5._Table.RowsRecoNumber.Item2.ToString + + DataSet5._Table.RowsRecoNumber.Item3.ToString; break; end; end; if DataSet5._Table.RowsRecoNumber.Item1.ToString = Str_IpAddr.Text then begin if i = 0 then begin Str_Option.Text := DataSet5._Table.RowsRecoNumber.Item4.ToString; Str_Brow.Text := DataSet5._Table.RowsRecoNumber.Item5.ToString; Str_LandTime.Text := DataSet5._Table.RowsRecoNumber.Item2.ToString + + DataSet5._Table.RowsRecoNumber.Item3.ToString; Str_UserName.Text := DataSet5._Table.RowsRecoNumber.Item9.ToString; end; i := i+1; end; RecoNumber := RecoNumber - 1; end; Str_OldLandTime.Visible := True; if Str_UserName.Text (游客) then begin Str_Log.Visible := False; Str_Regist.Visible := False; Str_1.Visible := False; Str_2.Visible := False; end else begin Str_Log.Visible := True; Str_Regist.Visible := True; Str_1.Visible := True; Str_2.Visible := True; end; SqlConnection1.Close;end; 这段代码是将用户的登陆信息显示在页面上,用户首次登陆的名称都是“游客”在执行完登录过程后,才以注册名显示在页面上,同时显示上一次登录的时间。如果是“游客”页面将显示“注册”、“登陆”等文字选项,如果是注册用户已登陆则不显示。在这里直接判断是否注册用户登录可以防止猜测页面操作,例如有的用户可以直接在地址栏输入/forum_page.aspx?fpage=1&tid=1等等内容,从而跳过登陆过程,同时用户登录后,不管在地址栏直接输入那个板块的地址,都将是注册用户的登陆。 .等等,还有不少内容,主要的就介绍这么多吧。(2)发布帖子页面设计放置数据连接的方法与上面相同,在这里就不说了。procedure TWebForm2.Page_Load(sender: System.Object; e: System.EventArgs);var tRow : TableRow; tCell : TableCell; ViewPage, lop, t, RecoNumber, RecoNumber_sub,i, pagn, num, Total : integer; ThYpImg, ThYpCaption, pg : HyperLink; tpg,sname,sitem,s : string;begin SqlConnection1.Open; SqlDataAdapter1.Fill(DataSet11); RecoNumber := DataSet11._Table.Rows.Count - 1; /取得记录数 while RecoNumber -1 do begin if DataSet11._Table.RowsRecoNumber.Item1.ToString = Request.UserHostAddress then begin Str_UserName.Text := DataSet11._Table.RowsRecoNumber.Item9.ToString; break; end; RecoNumber := RecoNumber - 1; end; SqlConnection1.Close; if Str_UserName.Text (游客) then begin Str_Log.Visible := False; Str_Regist.Visible := False; Str_1.Visible := False; Str_2.Visible := False; end else begin Str_Log.Visible := True; Str_Regist.Visible := True; Str_1.Visible := True; Str_2.Visible := True; end; / tpg := Request.Itemfpage.ToString; Total := StrToInt(Request.Itemtid.ToString); if tpg = 1 then sitem := 公告栏; if tpg = 2 then sitem := 站务处理; if tpg = 3 then sitem := 留言板; Label1.Text := sitem; / SqlDataAdapter2.SelectCommand.CommandText := SELECT * FROM Forum_Data WHERE (Motif=+char(39)+sitem+char(39)+) AND (Grade=0)+ ORDER BY ID DESC; SqlConnection1.Open; DataSet12.Clear; SqlDataAdapter2.Fill(DataSet12); DataSet12.AcceptChanges; for t:=0 to 4 do begin if t (DataSet12._Table.Rows.Count-1) then break; if t = 0 then begin Topnew1.Text := DataSet12._Table.Rowst.Item9.ToString; Topnew1.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; if t = 1 then begin Topnew2.Text := DataSet12._Table.Rowst.Item9.ToString; Topnew2.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; if t = 2 then begin Topnew3.Text := DataSet12._Table.Rowst.Item9.ToString; Topnew3.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; if t = 3 then begin Topnew4.Text := DataSet12._Table.Rowst.Item9.ToString; Topnew4.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; if t = 4 then begin Topnew5.Text := DataSet12._Table.Rowst.Item9.ToString; Topnew5.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; end; SqlConnection1.Close; / SqlConnection1.Open; SqlDataAdapter2.SelectCommand.CommandText := SELECT * FROM Forum_Data WHERE (Motif=+char(39)+sitem+char(39)+) AND (Grade=0)+ ORDER BY AttackNum DESC; DataSet12.Clear; SqlDataAdapter2.Fill(DataSet12); DataSet12.AcceptChanges; for t:=0 to 4 do begin if t (DataSet12._Table.Rows.Count-1) then break; if t = 0 then begin Toplook1.Text := DataSet12._Table.Rowst.Item9.ToString; Toplook1.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; if t = 1 then begin Toplook2.Text := DataSet12._Table.Rowst.Item9.ToString; Toplook2.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; if t = 2 then begin Toplook3.Text := DataSet12._Table.Rowst.Item9.ToString; Toplook3.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; if t = 3 then begin Toplook4.Text := DataSet12._Table.Rowst.Item9.ToString; Toplook4.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; if t = 4 then begin Toplook5.Text := DataSet12._Table.Rowst.Item9.ToString; Toplook5.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; end; SqlConnection1.Close; / SqlConnection1.Open; SqlDataAdapter2.SelectCommand.CommandText := SELECT * FROM Forum_Data WHERE (Motif=+char(39)+sitem+char(39)+) AND (Grade=0)+ ORDER BY Writeback DESC; DataSet12.Clear; SqlDataAdapter2.Fill(DataSet12); DataSet12.AcceptChanges; for t:=0 to 4 do begin if t (DataSet12._Table.Rows.Count-1) then break; if t = 0 then begin Toprest1.Text := DataSet12._Table.Rowst.Item9.ToString; Toprest1.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; if t = 1 then begin Toprest2.Text := DataSet12._Table.Rowst.Item9.ToString; Toprest2.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; if t = 2 then begin Toprest3.Text := DataSet12._Table.Rowst.Item9.ToString; Toprest3.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; if t = 3 then begin Toprest4.Text := DataSet12._Table.Rowst.Item9.ToString; Toprest4.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; if t = 4 then begin Toprest5.Text := DataSet12._Table.Rowst.Item9.ToString; Toprest5.NavigateUrl := placard_page.aspx?page=+DataSet12._Table.Rowst.Item0.ToString; end; end; SqlConnection1.Close; / SqlConnection1.Open; SqlDataAdapter2.SelectCommand.CommandText := SELECT * FROM Forum_Data WHERE Motif=+char(39)+sitem+char(39)+ AND Grade=0 ORDER BY Place,ID ASC; DataSet12.Clear; SqlDataAdapter2.Fill(DataSet12); DataSet12.AcceptChanges; RecoNumber := DataSet12._Table.Rows.Count; SqlConnection1.Close; if RecoNumber20 then begin pagn := 1; end else if (round(RecoNumber/20)*20) RecoNumber then begin pagn := round(RecoNumber/20+1); end else begin pagn := round(RecoNumber/20); end; if RecoNumber 0 then lop := (Total-1)*20)+(20-(Total*20-RecoNumber)-1; for ViewPage:=(Total-1)*20) to lop do begin tRow := TableRow.Create; tRow.Height := 38; Table5.Rows.Add(tRow); for t:=0 to 6 do begin tCell := TableCell.Create; tCell.HorizontalAlign := HorizontalAlign.Center; tCell.VerticalAlign := VerticalAlign.Middle; if (t = 0) or (t = 2) or (t = 4) or (t = 6) then begin tCell.BackColor := Color.White; end else tCell.Attributes.Add(bgColor,#F0F3FA); if (t=0) or (t=1) then begin tCell.Width := tRow.Width.Percentage(3); end; if t=2 then tCell.Width := tRow.Width.Percentage(44); if t=3 then tCell.Width := tRow.Width.Percentage(15); if (t=4) or (t=5) then tCell.Width := tRow.Width.Percentage(6); if t=6 then tCell.Width := tRow.Width.Percentage(23); tRow.Cells.Add(tCell); if t = 0 then begin ThYpImg := HyperLink.Create; ThYpImg.NavigateUrl := placard_page.aspx?page=+IntToStr(ViewPage); ThYpImg.ImageUrl := /Image/folder.gif; tCell.Controls.Add(ThYpImg); end; if t = 1 then begin ThYpImg := HyperLink.Create; ThYpImg.ImageUrl := /Image/icon+ DataSet12._Table.RowsViewPage.Item7.ToString + .gif; tCell.Controls.Add(ThYpImg); ThYpCaption := HyperLink.Create; tCell.Controls.Add(ThYpCaption); end; if t = 2 then begin tCell.HorizontalAlign := HorizontalAlign.Left; ThYpCaption := HyperLink.Create; ThYpCaption.Text :=   tCell.Controls.Add(ThYpCaption); if DataSet12._Table.RowsViewPage.Item6.ToString = 0 then begin /置顶 ThYpImg := HyperLink.Create; ThYpImg.ImageUrl := /Image/pin.gif; tCell.Controls.Add(ThYpImg); ThYpCaption := HyperLink.Create; ThYpCaption.Text := 【置顶】 tCell.Controls.Add(ThYpCaption); end; ThYpCaption := HyperLink.Create; ThYpCaption.NavigateUrl := placard_page.aspx?page=+IntToStr(ViewPage);DataSet12._Table.RowsViewPage.Item0.ToString; ThYpCaption.Text := DataSet12._Table.RowsViewPage.Item9.ToString; sname := DataSet12._Table.RowsViewPage.Item9.ToString; tCell.Attributes.Add(onmouseover,this.style.backgroundColor=#F0F3FA); tCell.Attributes.Add(onmouseout,this.style.backgroundColor=#FFFFFF); tCell.Controls.Add(ThYpCaption); end; if t = 3 then begin tCell.HorizontalAlign := HorizontalAlign.Center; tCell.VerticalAlign := VerticalAlign.Middle; ThYpCaption := HyperLink.Create; ThYpCaption.Text := + DataSet12._Table.RowsViewPage.Item11.ToString +DataSet12._Table.RowsViewPage.Item2.ToString + ; tCell.Controls.Add(ThYpCaption); end; if t = 4 then begin /回复 RecoNumber_sub := StrToInt(DataSet12._Table.RowsViewPage.Item18.ToString); tCell.HorizontalAlign := HorizontalAlign.Center; tCell.VerticalAlign := Ver
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 巾帼徒步活动方案
- 小学生网上公益活动方案
- 常州插花活动方案
- 工会亲情活动方案
- 带狗露营活动方案
- 小班餐点活动方案
- 少先队进耕地活动方案
- 工会春联比赛活动方案
- 小班游戏识字活动方案
- 岱山公司拓展活动方案
- 安全生产管理台账(合集)
- 福建省厦门市第一中学2025届七下英语期末质量跟踪监视试题含答案
- 2024年吉林省国资委监管企业招聘真题
- 大学语文试题及答案 二
- 互联网女皇AI报告:人工智能趋势报告(双语翻译版本)
- 2025年西藏事业单位招聘考试职业能力倾向测验试卷(民族医药类)
- 结构动力学完整版本
- 2025年八年级数学下学期期末总复习八年级数学下学期期末测试卷(2)(学生版+解析)
- 农村供水水质管理制度
- T/COSHA 12-2022研学旅行安全工作规范
- T/CIE 149-2022霍尔电推进系统点火测试规范
评论
0/150
提交评论