放到另外一个窗体上,窗体位于主窗体上方,改变窗体的LEFT属性,可以吗

解决方案 »

  1.   

    不太明白你的意思,edit每改变一次都动态生成一listbox吗
    做什么
    另外在确定位置时你可用SetBounds方法,
    事实上你设置了listbox1.left就是调用了SetBounds
    肯定会闪,直接用SetBounds会好一点
      

  2.   

    抱歉,我没有写全,正如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也闪动,能否不让其闪?
      

  3.   

    试过SetBounds了,也就是
    ListBox1.SetBounds(Edit1.Left, Edit1.Top + Edit1.Height + 2, Edit1.Width, 97)
      

  4.   

    不太明白你的意思:"但现在却是每键入一个字符,窗口就闪动一下,很是不好看,我只想ListBox重画,"
     ListBox重画:   Listbox1.Repaint ; 就可以了!
      //还是先放一个Listbox在GroupBox中吧,设置visible := false ;
       
      

  5.   

    如果不行的话就在EDIT的KeyPress事件里写吧.判断一下回车,如果是的话写入你上面的代码,这样只你输入完数据后按回车键就改动生效这样窗体只闪一下.但需要按回车才生效.
      

  6.   

    另外一个方法(不常用):
    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);
    否则有可能出问题