请问怎样解决窗口闪烁的问题?
我在Form1中加了一个GroupBox控件,再在GroupBox中加一个TEdit控件,在TEdit的OnChange事件中加入如下代码,动态生成一个ListBox,如下:
procedure TForm5.Edit1Change(Sender: TObject);
begin
ListBox1 := TListBox.Create(nil);
ListBox1.Parent := GroupBox1;
ListBox1.Left := Edit1.Left;
ListBox1.Top := Edit1.Top + Edit1.Height;
ListBox1.Width := Edit1.Width;
end;
我的原意是随着我在Edit中不断地键入字符,ListBox中动态更新更精确的相关内容,但现在却是每键入一个字符,窗口就闪动一下,很是不好看,我只想ListBox重画,请各位帮忙解决,50分送上!!
问题点数:50、回复次数:9Top
1 楼thedream(梦幻使者)回复于 2001-10-03 20:16:21 得分 0
放到另外一个窗体上,窗体位于主窗体上方,改变窗体的LEFT属性,可以吗Top
2 楼xzgyb(老达摩)回复于 2001-10-03 20:17:57 得分 25
不太明白你的意思,edit每改变一次都动态生成一listbox吗
做什么
另外在确定位置时你可用SetBounds方法,
事实上你设置了listbox1.left就是调用了SetBounds
肯定会闪,直接用SetBounds会好一点
Top
3 楼little_f(小毛)回复于 2001-10-03 20:26:20 得分 0
把parent改为form1如何?Top
4 楼hlbl11(愚公)回复于 2001-10-03 20:34:38 得分 0
你觉得帮助文件的索引是否和你的要求一样???Top
5 楼hyhy95(无相)回复于 2001-10-03 20:36:19 得分 0
抱歉,我没有写全,正如xzgyb(回首往事,不堪回首)所说,并不是要每次都重新生成ListBox,而是只生成一次,我设了个变量,比如IsExist,在Form的OnCreate中初始化为False,
if not IsExist then
begin
ListBox1 := TListBox.Create(nil);
ListBox1.Parent := GroupBox1;
ListBox1.Left := Edit1.Left;
ListBox1.Top := Edit1.Top + Edit1.Height + 2;
ListBox1.Width := Edit1.Width;
IsExist := True;
end;
只是第一次生成时GroupBox也闪动,能否不让其闪?Top
6 楼xzgyb(老达摩)回复于 2001-10-04 08:37:09 得分 0
试过SetBounds了,也就是
ListBox1.SetBounds(Edit1.Left, Edit1.Top + Edit1.Height + 2, Edit1.Width, 97)
Top
7 楼zds0707(周)回复于 2001-10-04 09:50:50 得分 0
不太明白你的意思:"但现在却是每键入一个字符,窗口就闪动一下,很是不好看,我只想ListBox重画,"
ListBox重画: Listbox1.Repaint ; 就可以了!
//还是先放一个Listbox在GroupBox中吧,设置visible := false ;
Top
8 楼truezerg(赵明宇)回复于 2001-10-04 11:56:52 得分 0
如果不行的话就在EDIT的KeyPress事件里写吧.判断一下回车,如果是的话写入你上面的代码,这样只你输入完数据后按回车键就改动生效这样窗体只闪一下.但需要按回车才生效.Top
9 楼agui(阿贵: 高级图形用户界面)回复于 2001-10-04 12:18:24 得分 25
另外一个方法(不常用):
if not IsExist then
begin
ListBox1 := TListBox.Create(nil); //!!!!
SendMessage( ListBox1.Handle, WM_SETREDRAW, 0, 0 );// 禁止绘画
ListBox1.Parent := GroupBox1;
ListBox1.Left := Edit1.Left;
ListBox1.Top := Edit1.Top + Edit1.Height + 2;
ListBox1.Width := Edit1.Width;
SendMessage( ListBox1.Handle, WM_SETREDRAW, 1, 0 );// 允许绘画
ListBox1.Refresh;
IsExist := True;
end;
另外要说明的是:
ListBox1 := TListBox.Create(nil);
最好改成:
ListBox1 := TListBox.Create(Self);
否则有可能出问题Top




