下面这段代码是从Discuz论坛的的数据库里把板块名和帖子名取出来放到菜单上,但感觉效率比较低,大家帮忙优化下。谢了!
    
    Form1.PopupMenu1.Items.Clear;
    forums.Close;
    forums.SQL.Clear;
    forums.SQL.Add('select fid,name,todayposts,topics,posts from dnt_forums where parentid=1');
    forums.Prepared;
    forums.Open;
    forums.First;
    while not forums.Eof do
    begin
          fm:=TMenuItem.Create(self);
          fname:=forums.FieldByName('name').AsString;
          tnum:=forums.FieldByName('topics').AsString;
          pnum:=forums.FieldByName('posts').AsString;
          todaynum:=forums.FieldByName('todayposts').AsString;
          
          fm.caption:=fname;
          fm.Bitmap.LoadFromFile(g_AppPath+'ico\forum_new.bmp');
          Form1.PopupMenu1.Items.Add(fm);          tp:=TMenuItem.Create(self);
          tp.Caption:='在本版发帖';
          tp.Bitmap.LoadFromFile(g_AppPath+'ico\post.bmp');
          tp.Hint:=g_domain+'posttopic.aspx?forumid='+forums.FieldByName('fid').AsString;
          fm.Add(tp);
          tp.OnClick:=MenuClick;          tp:=TMenuItem.Create(self);
          tp.Caption:='-';
          fm.Add(tp);
          //取出置顶帖子
          topics.Close;
          topics.SQL.Clear;
          topics.SQL.Add('select title,tid,poster,postdatetime,views from dnt_topics'+
                         ' where (displayorder>0 and fid='+forums.FieldByName('fid').AsString+')'+
                         ' or displayorder>1'+
                         ' order by displayorder ,lastpost ');
          topics.Prepared;
          topics.Open;
          topics.First;          while not topics.Eof do
          begin
              title:=topics.FieldByName('title').AsString;
              poster:=topics.FieldByName('poster').AsString;
              postdatetime:=DateToStr(topics.FieldByName('postdatetime').AsDateTime);
              views:=topics.FieldByName('views').AsString;              if length(title)>20 then
              begin
                 title:=Copy(title,0,20)+'...';
              end;
              tp:=TMenuItem.Create(self);
              tp.Caption:=title;
              tp.Bitmap.LoadFromFile(g_AppPath+'ico\attphoto.bmp');
              tp.Hint:=g_domain+'showtopic-'+
                       topics.FieldByName('tid').AsString+
                       '.aspx';
              fm.Add(tp);              post.Close;
              post.SQL.Clear;
              post.SQL.Add('select tid,pid,title,pid,poster,postdatetime from dnt_posts1'+
                           ' where fid='+forums.FieldByName('fid').AsString+
                           ' and tid='+topics.FieldByName('tid').AsString+
                           ' order by tid,pid');
              post.Prepared;
              post.Open;
              if post.RecordCount>1 then
              begin
                  post.First;
                  for i:=1 to post.RecordCount do
                  begin
                      pposter:=post.FieldByName('poster').AsString;
                      ppostdatetime:=DateToStr(topics.FieldByName('postdatetime').AsDateTime);
                      ptitle:=post.FieldByName('title').AsString;
                      if length(ptitle)>20 then
                      ptitle:=copy(ptitle,0,20)+'...';                      rp:=TMenuItem.Create(self);
                      rp.Caption:=ptitle;                      g_url:=g_domain+'showtopic-'+
                             post.FieldByName('tid').AsString+
                             '-'+inttostr(i)+
                             '.aspx';
                      rp.Hint:=g_url;
                      tp.Add(rp);
                      rp.OnClick:=MenuClick;
                      post.Next;
                  end;
              end
              else
                  tp.OnClick:=MenuClick;
              topics.Next;
          end;          mi2:=TMenuItem.Create(self);
          mi2.Caption:='-';
          fm.Add(mi2);          //普通帖子
          topics.Close;
          topics.SQL.Clear;
          topics.SQL.Add('select title,tid,poster,postdatetime,views from dnt_topics'+
                         ' where fid='+forums.FieldByName('fid').AsString+
                         ' order by lastpost desc'+
                         ' limit '+g_topicnum);
          edit1.Text:=topics.SQL.Text;
          topics.Prepared;
          topics.Open;
          topics.First;
          while not topics.Eof do
          begin
              title:=topics.FieldByName('title').AsString;
              poster:=topics.FieldByName('poster').AsString;
              postdatetime:=timetostr((topics.FieldByName('postdatetime').AsDateTime));
              views:=topics.FieldByName('views').AsString;
              
              if length(title)>20 then
              begin
                 title:=Copy(title,0,20)+'...';
              end;              tp:=TMenuItem.Create(self);
              tp.Caption:=title;
              tp.Bitmap.LoadFromFile(g_AppPath+'ico\NoteImage1.bmp');
              tp.Hint:=g_domain+'showtopic-'+
                       topics.FieldByName('tid').AsString+'.aspx';
              fm.Add(tp);              post.Close;
              post.SQL.Clear;
              post.SQL.Add('select tid,title,pid,poster,postdatetime from dnt_posts1 '+
                          'where fid='+forums.FieldByName('fid').AsString+
                          ' and tid='+topics.FieldByName('tid').AsString+' order by tid,pid');
              post.Prepared;
              post.Open;
              if post.RecordCount>1 then
              begin
                  tp.Bitmap.LoadFromFile(g_AppPath+'ico\NoteImage.bmp');
                  post.First;
                  for i:=1 to post.RecordCount do
                  begin
                      pposter:=post.FieldByName('poster').AsString;
                      ppostdatetime:=TimeToStr(post.FieldByName('postdatetime').AsDateTime);
                      ptitle:=post.FieldByName('title').AsString;
                      if length(ptitle)>20 then
                      ptitle:=copy(ptitle,0,20)+'...';                      rp:=TMenuItem.Create(self);
                      rp.Caption:=ptitle;                      g_url:=g_domain+'showtopic-'+
                             post.FieldByName('tid').AsString+
                             '-'+inttostr(i)+
                             '.aspx';
                      rp.Hint:=g_url;
                      tp.Add(rp);
                      rp.OnClick:=MenuClick;
                      post.Next;
                  end;
              end
              else
                  tp.OnClick:=MenuClick;
              topics.Next;
          end;
         forums.Next;
    end;

解决方案 »

  1.   

    代码是长呀,看完了,呵呵,以下是我的一点建议,讲的不对的,别笑话,呵呵
    在代码中有好多:forums.First;我觉得应该可以去掉,因为每次open时默认就是第一条的。
    记得很早以前一个同事对我说过尽量避免用recordcount,因为它的效率很差的(他们测试过,但我没测过)
    所以你看看能不能把下面这样的代码改一下
    if post.RecordCount>1 then
    begin
      tp.Bitmap.LoadFromFile(g_AppPath+'ico\NoteImage.bmp');
      post.First;
      for i:=1 to post.RecordCount do
      beginif not post.eof  then
    begin
      tp.Bitmap.LoadFromFile(g_AppPath+'ico\NoteImage.bmp');
      i := 1;
      while not post.eof do
      begin
        ..................
        inc(i);//定义一个i变量
      end;