在右侧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+' '+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.Rows[RecoNumber].Item[1].ToString=Str_IpAddr.Text then begin Str_OldLandTime.Text := DataSet5._Table.Rows[RecoNumber].Item[2].ToString + ' '+ DataSet5._Table.Rows[RecoNumber].Item[3].ToString; break; end; end; if DataSet5._Table.Rows[RecoNumber].Item[1].ToString = Str_IpAddr.Text then begin if i = 0 then begin Str_Option.Text := DataSet5._Table.Rows[RecoNumber].Item[3].ToString; Str_Brow.Text := DataSet5._Table.Rows[RecoNumber].Item[4].ToString; Str_LandTime.Text := DataSet5._Table.Rows[RecoNumber].Item[2].ToString + ' '+ DataSet5._Table.Rows[RecoNumber].Item[3].ToString; Str_UserName.Text := DataSet5._Table.Rows[RecoNumber].Item[8].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; 这段代码是将用户的登陆信息显示在页面上,用户首次登陆的名称都是“游客”在执行完登录过程后,才以注册名显示在页面上,同时显示上一次登录的时间。如果是“游客”页面将显示“注册”、“登陆”等文字选项,如果是注册用户已登陆则不显示。在这里直接判断是否注册用户登录可以防止猜测页面操作,例如有的用户可以直接在地址栏输入http://127.0.0.1/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); //DataSet11.AcceptChanges; RecoNumber := DataSet11._Table.Rows.Count - 1; //取得记录数 while RecoNumber > -1 do begin if DataSet11._Table.Rows[RecoNumber].Item[1].ToString = Request.UserHostAddress then begin Str_UserName.Text := DataSet11._Table.Rows[RecoNumber].Item[9].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.Item['fpage'].ToString; Total := StrToInt(Request.Item['tid'].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.Rows[t].Item[9].ToString; Topnew1.NavigateUrl := 'placard_page.aspx'; end; if t = 1 then begin Topnew2.Text := DataSet12._Table.Rows[t].Item[9].ToString; Topnew2.NavigateUrl := 'placard_page.aspx'; end; if t = 2 then begin Topnew3.Text := DataSet12._Table.Rows[t].Item[9].ToString; Topnew3.NavigateUrl := 'placard_page.aspx'; end; if t = 3 then begin Topnew4.Text := DataSet12._Table.Rows[t].Item[9].ToString; Topnew4.NavigateUrl := 'placard_page.aspx'; end; if t = 4 then begin Topnew5.Text := DataSet12._Table.Rows[t].Item[9].ToString; Topnew5.NavigateUrl := 'placard_page.aspx'; 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.Rows[t].Item[9].ToString; Toplook1.NavigateUrl := 'placard_page.aspx'; end; if t = 1 then begin Toplook2.Text := DataSet12._Table.Rows[t].Item[9].ToString; Toplook2.NavigateUrl := 'placard_page.aspx'; end; if t = 2 then begin Toplook3.Text := DataSet12._Table.Rows[t].Item[9].ToString; Toplook3.NavigateUrl := 'placard_page.aspx'; end; if t = 3 then begin Toplook4.Text := DataSet12._Table.Rows[t].Item[9].ToString; Toplook4.NavigateUrl := 'placard_page.aspx'; end; if t = 4 then begin Toplook5.Text := DataSet12._Table.Rows[t].Item[9].ToString; Toplook5.NavigateUrl := 'placard_page.aspx'; 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.Rows[t].Item[9].ToString; Toprest1.NavigateUrl := 'placard_page.aspx'; end; if t = 1 then begin Toprest2.Text := DataSet12._Table.Rows[t].Item[9].ToString; Toprest2.NavigateUrl := 'placard_page.aspx'; end; if t = 2 then begin Toprest3.Text := DataSet12._Table.Rows[t].Item[9].ToString; Toprest3.NavigateUrl := 'placard_page.aspx'; end; if t = 3 then begin Toprest4.Text := DataSet12._Table.Rows[t].Item[9].ToString; Toprest4.NavigateUrl := 'placard_page.aspx'; end; if t = 4 then begin Toprest5.Text := DataSet12._Table.Rows[t].Item[9].ToString; Toprest5.NavigateUrl := 'placard_page.aspx'; 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;//////// - 1; SqlConnection1.Close; if RecoNumber<20 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 < 20 then i := RecoNumber else i := 19; lop := (Total-1)*20+i; if (Total*20-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 := 'http://127.0.0.1/Image/folder.gif'; tCell.Controls.Add(ThYpImg); end; if t = 1 then begin ThYpImg := HyperLink.Create; ThYpImg.ImageUrl := 'http://127.0.0.1/Image/icon'+ DataSet12._Table.Rows[ViewPage].Item[7].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); then if DataSet12._Table.Rows[ViewPage].Item[6].ToString = '0' then begin //置顶 ThYpImg := HyperLink.Create; ThYpImg.ImageUrl := 'http://127.0.0.1/Image/pin.gif'; tCell.Controls.Add(ThYpImg); ThYpCaption := HyperLink.Create; ThYpCaption.Text := '<FONT COLOR=##0000FF><B>【置顶】 </B></FONT>'; tCell.Controls.Add(ThYpCaption); end; ThYpCaption := HyperLink.Create; ThYpCaption.NavigateUrl := 'placard_page.aspx?page='+IntToStr(ViewPage); ThYpCaption.Text := DataSet12._Table.Rows[ViewPage].Item[9].ToString; sname := DataSet12._Table.Rows[ViewPage].Item[9].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 := '<A href="placard_page.aspx?page='+IntToStr(ViewPage)+'">'+ DataSet12._Table.Rows[ViewPage].Item[11].ToString +'</A>'+ '<BR><SPAN class=smalltxt>'+ DataSet12._Table.Rows[ViewPage].Item[2].ToString + '</SPAN>'; tCell.Controls.Add(ThYpCaption); end; if t = 4 then begin //回复 RecoNumber_sub := StrToInt(DataSet12._Table.Rows[ViewPage].Item[18].ToString); tCell.HorizontalAlign := HorizontalAlign.Center; tCell.VerticalAlign := VerticalAlign.Middle; ThYpCaption := HyperLink.Create; ThYpCaption.Text := IntToStr(RecoNumber_sub); tCell.Controls.Add(ThYpCaption); end; if t = 5 then begin //点击 tCell.HorizontalAlign := HorizontalAlign.Center; tCell.VerticalAlign := VerticalAlign.Middle; ThYpCaption := HyperLink.Create; ThYpCaption.Text := DataSet12._Table.Rows[ViewPage].Item[16].ToString; tCell.Controls.Add(ThYpCaption); end; if t = 6 then begin SqlConnection1.Open; SqlDataAdapter3.SelectCommand.CommandText := 'SELECT * FROM Forum_Data WHERE Motif='+char(39)+sitem+char(39)+ ' AND CaptionName='+char(39)+sname+char(39) + 'ORDER BY ID DESC'; DataSet21.Clear; SqlDataAdapter3.Fill(DataSet21); DataSet21.AcceptChanges; ThYpCaption := HyperLink.Create; ThYpCaption.Text := '<SPAN class=smalltxt>'+ DataSet12._Table.Rows[0].Item[2].ToString + '  '+DataSet12._Table.Rows[0].Item[3].ToString + '</SPAN>'+ '<BR><SPAN class=smalltxt>'+ '作者:'+'<A href="placard_page.aspx?page=1'+'">'+ DataSet12._Table.Rows[0].Item[11].ToString + '</SPAN>'; SqlConnection1.Close; tCell.Controls.Add(ThYpCaption); ThYpCaption := HyperLink.Create; ThYpCaption.Text := '  '; tCell.Controls.Add(ThYpCaption); ThYpImg := HyperLink.Create; ThYpImg.ImageUrl := 'http://127.0.0.1/Image/Lastpost.gif'; ThYpImg.NavigateUrl := 'placard_page.aspx?page=1'; tCell.Controls.Add(ThYpImg); end; end; end; tRow := TableRow.Create; Table7.Rows.Add(tRow); tCell := TableCell.Create; pg := HyperLink.Create; if (Total-10) <= 0 then pg.NavigateUrl := 'p1.aspx?page=1' else pg.NavigateUrl := 'p1.aspx?page='+IntToStr(trunc((Total-1)/10)*10); pg.Text := '<SPAN class=smalltxt>'+'<<'+'</SPAN>'; tCell.Controls.Add(pg); Table7.Rows[0].Cells.Add (tCell); for num:=1 to 10 do begin if (trunc((Total-1)/10)*10+num)>pagn then break; tCell := TableCell.Create; pg := HyperLink.Create; pg.NavigateUrl := 'p1.aspx?page=' + IntToStr (trunc((Total-1)/10)*10+num); if StrToInt(Request.Item['tid'].ToString)=(trunc((Total-1)/10)*10+num) then begin pg.Text := '<SPAN class=smalltxt>['+IntToStr (trunc((Total-1)/10)*10+num)+']</SPAN>'; end else pg.Text := '<SPAN class=smalltxt>'+IntToStr (trunc((Total-1)/10)*10+num)+'</SPAN>'; tCell.Controls.Add(pg); Table7.Rows[0].Cells.Add (tCell); end; pg := HyperLink.Create; pg.Text := '<SPAN class=smalltxt>'+' >>'+'</SPAN>'; if (trunc((Total-1)/10)*10+num)>pagn then pg.NavigateUrl := 'P1.aspx?page=' + IntToStr (trunc((Total-1)/10)*10+num-1) else pg.NavigateUrl := 'P1.aspx?page=' + IntToStr (trunc((Total-1)/10)*10+num); tCell.Controls.Add(pg); Table7.Rows[0].Cells.Add (tCell); end; procedure TWebForm2.OnInit(e: EventArgs); begin InitializeComponent; inherited OnInit(e); end; 还有很多 发不了了
刚刚拿到2005没有几天,还没有完全了解到它的新特性以及新功能,d8的很多方法在2005下也可以使用,不过也有一些函数的用法发生了变化。才开始学习B/S编程,算是个新手,用d8也做了些东西,这篇文档是在把以前d8做的东西改到2005下过程中的一些学习心得,供大家参考。写得比较粗糙,也比较乱,很多东西都没来得及检查,所以里面可能会有一些方法错误,望大家谅解。
本文以制作一个《论坛》为例,简单地介绍了delphi 2005 的B/S程序设计方法。数据库:SQL 2000,编程:delphi 2005 ARCHITECT。一、调试准备及数据库设计
1、简单配置IIS
点击“开始”-〉“程序”-〉“管理工具”-〉“Internet信息服务(IIS)管理器”点击“网站”按鼠标右键-〉“新建”-〉“网站” 在出现的对话框中“描述”中起名,随便起,例如“1”,点击下一步:“网站IP地址”:随便输入例如127.0.0.1,“网站TCP端口”:一般为80,也可输入81等,如不为80,在访问网站时则需输入http://127.0.0.1:81。
点击下一步,“输入主目录路径”:如D:\IIS
点击下一步,然后“完成”。
这时,就能在“网站”中看到新建的网站“1”了,在“1”处点击鼠标右键选择“属性”,在对话框中其他东西不需修改,只需将“文档”中点击“添加”将以上目录中WebForm1.aspx(也就是首页,如Index.aspx等等)文件添加到其中即可点击确定即完成一个简单网站的配置。 2、数据库设计(部分)
一个论坛的数据库设计其实很繁琐,在这里用几个最常用的说明一下问题:
数据库名:NetManager。
(1)表名:Access_Data(记录登录用户的各类信息)
字段名 类型 长度 说明
---------------------------------------------------------------
ID bigint 8 序号
IP_Addr varchar 80 用户登录IP地址
Land_Date varchar 80 用户登录时间-日期
Land_Time varchar 80 用户登录时间-时间
Option_sys varchar 100 用户的操作系统
Brow_sys varchar 100 用户的浏览器类型
Current_Item varchar 800 用户当前使用的页面
Settle_Date varchar 80 用户停留的-日期
Settle_Time varchar 80 用户停留的-时间
UserLog varchar 80 登录的用户名
UserPasword varchar 50 登录的密码(2)表名:Forum_Data(发布帖子的纪录)
字段名 类型 长度 说明
-----------------------------------------------------------------
ID bigint 8 序号
IP_Addr varchar 80 用户IP地址
Speak_Date varchar 80 发言-日期
Speak_Time varchar 80 发言-时间
Motif varchar 800 发言论坛板块的名称
Grade varchar 50 发言的类型(0:标题,1:回帖,..等)
Place varchar 50 帖子位置(0:置顶...等)
StateIco varchar 250 帖子状态的图标(如:多于多少回复、点击...等状态的图标)
CaptionIco varchar 250 标题图标(发布帖子时选择的图标)
CaptionName varchar 800 帖子的名称
Content varchar 8000 帖子内容
UserName varchar 50 发布用户名
Pasword varchar 50 密码
Portrait varchar 80 用户头像
Adage varchar 8000 格言(注册用户时选择输入,通常附在发言的后面)
AdagePic varchar 250 格言图片(注册用户时选择输入,通常附在发言的后面)
AttackNum varchar 50 点击数
Pink varchar 50 精华帖(由斑竹来确定)
Writeback varchar 50 回帖数
......等等(根据需要自行设计)。
(3)表名:Register_Data(注册用户信息)
字段名 类型 长度 说明
-----------------------------------------------------------------
ID bigint 8 序号
IP_Addr varchar 80 IP地址
Username varchar 80 用户名
Pasword varchar 80 密码
Safe_qu varchar 80 安全问题(登录时可以选择输入)
Safe_answ varchar 80 安全问题回答
Email varchar 80 邮件地址
...以下选填内容...
Sex varchar 80 性别
Fete_Y varchar 80 出生年
Fete_M varchar 80 出生月
Fete_D varchar 80 出生日
Froma varchar 250 来自哪里
QQ_code varchar 80 qq号码
Msn_code varchar 80 msn号码
Atman_info varchar 800 自我介绍
Atman_ico varchar 80 头像
Atman_pen varchar 80 个人签名
Regist_Date varchar 80 注册-日期
Regist_time varchar 80 注册-时间
......等等(根据需要自行设计)。
先简单写这几个基本表,在后面主要以这几个表进行程序设计。二、程序设计
在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+' '+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,
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.Rows[RecoNumber].Item[1].ToString=Str_IpAddr.Text then begin
Str_OldLandTime.Text := DataSet5._Table.Rows[RecoNumber].Item[2].ToString +
' '+ DataSet5._Table.Rows[RecoNumber].Item[3].ToString;
break;
end;
end;
if DataSet5._Table.Rows[RecoNumber].Item[1].ToString = Str_IpAddr.Text then begin
if i = 0 then begin
Str_Option.Text := DataSet5._Table.Rows[RecoNumber].Item[3].ToString;
Str_Brow.Text := DataSet5._Table.Rows[RecoNumber].Item[4].ToString;
Str_LandTime.Text := DataSet5._Table.Rows[RecoNumber].Item[2].ToString +
' '+ DataSet5._Table.Rows[RecoNumber].Item[3].ToString;
Str_UserName.Text := DataSet5._Table.Rows[RecoNumber].Item[8].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;
这段代码是将用户的登陆信息显示在页面上,用户首次登陆的名称都是“游客”在执行完登录过程后,才以注册名显示在页面上,同时显示上一次登录的时间。如果是“游客”页面将显示“注册”、“登陆”等文字选项,如果是注册用户已登陆则不显示。在这里直接判断是否注册用户登录可以防止猜测页面操作,例如有的用户可以直接在地址栏输入http://127.0.0.1/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);
//DataSet11.AcceptChanges;
RecoNumber := DataSet11._Table.Rows.Count - 1; //取得记录数
while RecoNumber > -1 do begin
if DataSet11._Table.Rows[RecoNumber].Item[1].ToString = Request.UserHostAddress then begin
Str_UserName.Text := DataSet11._Table.Rows[RecoNumber].Item[9].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.Item['fpage'].ToString;
Total := StrToInt(Request.Item['tid'].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.Rows[t].Item[9].ToString;
Topnew1.NavigateUrl := 'placard_page.aspx';
end;
if t = 1 then begin
Topnew2.Text := DataSet12._Table.Rows[t].Item[9].ToString;
Topnew2.NavigateUrl := 'placard_page.aspx';
end;
if t = 2 then begin
Topnew3.Text := DataSet12._Table.Rows[t].Item[9].ToString;
Topnew3.NavigateUrl := 'placard_page.aspx';
end;
if t = 3 then begin
Topnew4.Text := DataSet12._Table.Rows[t].Item[9].ToString;
Topnew4.NavigateUrl := 'placard_page.aspx';
end;
if t = 4 then begin
Topnew5.Text := DataSet12._Table.Rows[t].Item[9].ToString;
Topnew5.NavigateUrl := 'placard_page.aspx';
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.Rows[t].Item[9].ToString;
Toplook1.NavigateUrl := 'placard_page.aspx';
end;
if t = 1 then begin
Toplook2.Text := DataSet12._Table.Rows[t].Item[9].ToString;
Toplook2.NavigateUrl := 'placard_page.aspx';
end;
if t = 2 then begin
Toplook3.Text := DataSet12._Table.Rows[t].Item[9].ToString;
Toplook3.NavigateUrl := 'placard_page.aspx';
end;
if t = 3 then begin
Toplook4.Text := DataSet12._Table.Rows[t].Item[9].ToString;
Toplook4.NavigateUrl := 'placard_page.aspx';
end;
if t = 4 then begin
Toplook5.Text := DataSet12._Table.Rows[t].Item[9].ToString;
Toplook5.NavigateUrl := 'placard_page.aspx';
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.Rows[t].Item[9].ToString;
Toprest1.NavigateUrl := 'placard_page.aspx';
end;
if t = 1 then begin
Toprest2.Text := DataSet12._Table.Rows[t].Item[9].ToString;
Toprest2.NavigateUrl := 'placard_page.aspx';
end;
if t = 2 then begin
Toprest3.Text := DataSet12._Table.Rows[t].Item[9].ToString;
Toprest3.NavigateUrl := 'placard_page.aspx';
end;
if t = 3 then begin
Toprest4.Text := DataSet12._Table.Rows[t].Item[9].ToString;
Toprest4.NavigateUrl := 'placard_page.aspx';
end;
if t = 4 then begin
Toprest5.Text := DataSet12._Table.Rows[t].Item[9].ToString;
Toprest5.NavigateUrl := 'placard_page.aspx';
end;
end;
SqlConnection1.Close;
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;//////// - 1;
SqlConnection1.Close;
if RecoNumber<20 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 < 20 then i := RecoNumber else i := 19;
lop := (Total-1)*20+i;
if (Total*20-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 := 'http://127.0.0.1/Image/folder.gif';
tCell.Controls.Add(ThYpImg);
end;
if t = 1 then begin
ThYpImg := HyperLink.Create;
ThYpImg.ImageUrl := 'http://127.0.0.1/Image/icon'+
DataSet12._Table.Rows[ViewPage].Item[7].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);
then if DataSet12._Table.Rows[ViewPage].Item[6].ToString = '0' then
begin //置顶
ThYpImg := HyperLink.Create;
ThYpImg.ImageUrl := 'http://127.0.0.1/Image/pin.gif';
tCell.Controls.Add(ThYpImg);
ThYpCaption := HyperLink.Create;
ThYpCaption.Text := '<FONT COLOR=##0000FF><B>【置顶】 </B></FONT>';
tCell.Controls.Add(ThYpCaption);
end;
ThYpCaption := HyperLink.Create;
ThYpCaption.NavigateUrl := 'placard_page.aspx?page='+IntToStr(ViewPage);
ThYpCaption.Text := DataSet12._Table.Rows[ViewPage].Item[9].ToString;
sname := DataSet12._Table.Rows[ViewPage].Item[9].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 := '<A href="placard_page.aspx?page='+IntToStr(ViewPage)+'">'+
DataSet12._Table.Rows[ViewPage].Item[11].ToString
+'</A>'+ '<BR><SPAN class=smalltxt>'+ DataSet12._Table.Rows[ViewPage].Item[2].ToString + '</SPAN>';
tCell.Controls.Add(ThYpCaption);
end;
if t = 4 then begin //回复
RecoNumber_sub := StrToInt(DataSet12._Table.Rows[ViewPage].Item[18].ToString);
tCell.HorizontalAlign := HorizontalAlign.Center;
tCell.VerticalAlign := VerticalAlign.Middle;
ThYpCaption := HyperLink.Create;
ThYpCaption.Text := IntToStr(RecoNumber_sub);
tCell.Controls.Add(ThYpCaption);
end;
if t = 5 then begin //点击
tCell.HorizontalAlign := HorizontalAlign.Center;
tCell.VerticalAlign := VerticalAlign.Middle;
ThYpCaption := HyperLink.Create;
ThYpCaption.Text := DataSet12._Table.Rows[ViewPage].Item[16].ToString;
tCell.Controls.Add(ThYpCaption);
end;
if t = 6 then begin
SqlConnection1.Open;
SqlDataAdapter3.SelectCommand.CommandText := 'SELECT * FROM Forum_Data WHERE Motif='+char(39)+sitem+char(39)+
' AND CaptionName='+char(39)+sname+char(39) + 'ORDER BY ID DESC';
DataSet21.Clear;
SqlDataAdapter3.Fill(DataSet21);
DataSet21.AcceptChanges;
ThYpCaption := HyperLink.Create;
ThYpCaption.Text := '<SPAN class=smalltxt>'+
DataSet12._Table.Rows[0].Item[2].ToString +
'  '+DataSet12._Table.Rows[0].Item[3].ToString + '</SPAN>'+
'<BR><SPAN class=smalltxt>'+ '作者:'+'<A href="placard_page.aspx?page=1'+'">'+
DataSet12._Table.Rows[0].Item[11].ToString + '</SPAN>';
SqlConnection1.Close;
tCell.Controls.Add(ThYpCaption);
ThYpCaption := HyperLink.Create;
ThYpCaption.Text := '  ';
tCell.Controls.Add(ThYpCaption);
ThYpImg := HyperLink.Create;
ThYpImg.ImageUrl := 'http://127.0.0.1/Image/Lastpost.gif';
ThYpImg.NavigateUrl := 'placard_page.aspx?page=1';
tCell.Controls.Add(ThYpImg);
end; end; end;
tRow := TableRow.Create;
Table7.Rows.Add(tRow);
tCell := TableCell.Create;
pg := HyperLink.Create;
if (Total-10) <= 0 then pg.NavigateUrl := 'p1.aspx?page=1'
else pg.NavigateUrl := 'p1.aspx?page='+IntToStr(trunc((Total-1)/10)*10);
pg.Text := '<SPAN class=smalltxt>'+'<<'+'</SPAN>';
tCell.Controls.Add(pg);
Table7.Rows[0].Cells.Add (tCell);
for num:=1 to 10 do begin
if (trunc((Total-1)/10)*10+num)>pagn then break;
tCell := TableCell.Create;
pg := HyperLink.Create;
pg.NavigateUrl := 'p1.aspx?page=' + IntToStr (trunc((Total-1)/10)*10+num);
if StrToInt(Request.Item['tid'].ToString)=(trunc((Total-1)/10)*10+num) then begin
pg.Text := '<SPAN class=smalltxt>['+IntToStr (trunc((Total-1)/10)*10+num)+']</SPAN>';
end else pg.Text := '<SPAN class=smalltxt>'+IntToStr (trunc((Total-1)/10)*10+num)+'</SPAN>';
tCell.Controls.Add(pg);
Table7.Rows[0].Cells.Add (tCell);
end;
pg := HyperLink.Create;
pg.Text := '<SPAN class=smalltxt>'+' >>'+'</SPAN>';
if (trunc((Total-1)/10)*10+num)>pagn then
pg.NavigateUrl := 'P1.aspx?page=' + IntToStr (trunc((Total-1)/10)*10+num-1)
else pg.NavigateUrl := 'P1.aspx?page=' + IntToStr (trunc((Total-1)/10)*10+num);
tCell.Controls.Add(pg);
Table7.Rows[0].Cells.Add (tCell);
end;
procedure TWebForm2.OnInit(e: EventArgs);
begin
InitializeComponent;
inherited OnInit(e);
end;
还有很多
发不了了
不过个人觉得C/S比B/S好些