下面这段代码是从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;
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;
在代码中有好多: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;