如何使TListBox在增加Item时马上显示出来?

zxtyhy 2006-07-10 10:28:14
运行如下代码,会发现当所有的Item增加完后,才会显示,
如何才能每增加一条就马上显示出来?
好像是用SendMessage,对吗?代码怎么写?
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to 100 do
begin
ListBox1.Items.Add(IntTostr(i));
Sleep(50);
end;
end;
...全文
332 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
gbf08711 2006-07-12
  • 打赏
  • 举报
回复
不如创建一个Timer,在OnTimer事件中加入ListBox1.Items.Add(IntTostr(i));
如果用 sleep的话,程序会出现假死状态,很不爽的
或者再建一个线程,那就随便了
procedure TimerProc(window:HWND;msg,evid:uint;dwTime:DWORD);stdcall;
begin

end;
procedure Thello.aa;
begin
ls.Items.Add(inttostr(n));
inc(n);
Application.ProcessMessages;
end;

procedure Thello.Execute;
var
TimerID:integer;
Msg:TMsg;
begin
self.FreeOnTerminate:=true;
TimerID:=SetTimer(0,0,1000,@TimerProc);
while GetMessage(Msg,0,0,0) do
begin
windows.DispatchMessage(Msg);
self.Synchronize(aa);
if self.Terminated then
break;
end;
KillTimer(0,TimerID);
{ Place thread code here }

end;
deansroom 2006-07-12
  • 打赏
  • 举报
回复
application.processmessages;
!!!!!!!!!!!!!!!!!!!!关键
keyz 2006-07-12
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to 100 do
begin
ListBox1.Items.Add(IntTostr(i));
ListBox1.Selected[ListBox1.Count -1]:=True; //<---- Scroll to added item.
application.processmessages; //<-------- Add this to refresh screen.
Sleep(50);
end;
end;
lonoaer 2006-07-12
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to 100 do
begin
ListBox1.Items.Add(IntTostr(i));
Sleep(100);
ListBox1.Repaint; or ListBox1.Refresh;
end;
end;
Frank.WU 2006-07-12
  • 打赏
  • 举报
回复
暈啊...
別人是要速度的,LZ竟然是要面子的!
一般都是一次性算好其他東西在載入到 LISTBOX 裡面的,想不到LZ竟然要逆其道...
xzhifei 2006-07-11
  • 打赏
  • 举报
回复
procedure Delay(dwMilliseconds: Longint);
var
iStart, iStop: DWORD;
begin
iStart := GetTickCount;
repeat
iStop := GetTickCount;
Application.ProcessMessages;
until (iStop - iStart) >= dwMilliseconds;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to 100 do
begin
ListBox1.Items.Add(IntTostr(i));
Delay(10);
end;
end;

做出来了,但不知道这样有什么意义呢
zxtyhy 2006-07-10
  • 打赏
  • 举报
回复
no
z这样可以的,不知道效率如何
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to 100 do
begin
ListBox1.Items.Add(IntTostr(i));
SendMessage(ListBox1.Handle, WM_PAINT, 0, 0);
Sleep(100);
end;
end;
longhuazhen 2006-07-10
  • 打赏
  • 举报
回复
你需要创建一个线程来加item才能产生一个个显示出来,否则在buttonclick消息处理完毕前,主界面不会刷新。
zxtyhy 2006-07-10
  • 打赏
  • 举报
回复
大家请注意:
本人要的效果是,一条一条慢慢的增加。
不是让其一下子全部出现!!!
andyzhou1101 2006-07-10
  • 打赏
  • 举报
回复

晕......
老之 2006-07-10
  • 打赏
  • 举报
回复
ListBox1.Items.BeginUpdate;
ListBox1.Items.Add(IntTostr(i));
Sleep(50);
ListBox1.Items.EndUpdate;
zxtyhy 2006-07-10
  • 打赏
  • 举报
回复
呵呵,您没明白我的意思,
我就是要这种一条一条增加的效果!
这样有动感啊
andyzhou1101 2006-07-10
  • 打赏
  • 举报
回复
你有多少条要加啊
去掉Sleep(50)后
基本上就相当于瞬间显示了

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧