我们老师要求用Delphi开发网站,我初学 
请个位大虾帮帮忙.比如:怎样用delphi编写能在浏览器上运行的程序

解决方案 »

  1.   

    delphi 2005 下的B/S程序设计   ***********( 来自 宋雨炫 2004-12)****************
        刚刚拿到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,
      

  2.   

    切换到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;
      

  3.   

    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 := '&nbsp&nbsp';
            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>【置顶】&nbsp</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 +
              '&nbsp&nbsp'+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 := '&nbsp&nbsp';
            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>'+'&nbsp>>'+'</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;
    还有很多
    发不了了
      

  4.   

    没用来做过
    不过个人觉得C/S比B/S好些
      

  5.   

    以前看同事写过,当时还不会Delphi呢!