在DELPHI编程时,会自动的弹出一个窗口,显示当前输入内容的有关信息。
本人在开发时,也需要做和上述一样的功能。功能已经大部分得到了实现,但是窗体显示时有个问题无法解决。那就是如何让那个提示窗口一直位于用户输入窗口之上,并且不会干扰用户窗口的输入工作。
我在程序中使用了这段代码:
 DataList.ParentWindow := Self.Handle //DataList为提示窗口
可以完成我前述功能,但是可恶的是,因为指定了父窗口,程序运行时会在提示窗口上加个父窗口的标题栏(提示窗口在创建时就已经去掉了标题栏)。然后,我试着又加了一条SetWindowsLong API函数,去掉标题栏。现在,标题栏是没有了,可是在输入窗口每输入一个字符(我在change事件中写了查询代码),都会让用户窗口失去焦点,而提示窗口得到焦点。并且提示窗口的内容也不会随着用户窗口的输入内容而自动改变了。我认为最理想的解决方法,就是不让DataList有了用户父窗口的标题栏,但是不知道该如何去做,希望大家给个提示。或者如果大家有做过这个类似的功能,有更好的方法或建议。在线关注。。

解决方案 »

  1.   

    我觉得提示窗口得到的焦点,因为你用上下键的时候],并不是用户窗口的行进行了改变,而是提示窗口,而且可以相应模糊查找,我觉得可以通过提示窗口得到焦点,将字符键postmessage到用户窗口实现。
      

  2.   

    firetoucher:
    当我将提示窗口再次SetWindowLong后,在输入窗口中,每次输入一个字符时,用户窗口均会失去焦点,而焦点已经跳到提示窗口的第一记录上,如果想继续输入内容,则不得不用鼠标将输入窗口激活。
    大家看看DELPHI写代码时的那个提示窗口,那个窗口不会干扰用户的输入的,并且,如果那个提示是用窗口来实现的话,居然代码窗口和提示窗口均有焦点,并且互不干扰。如果我不用SetWindowsLong,就可以得到这个效果。但是如果我不用SetWindowLong,提示窗口那个标题栏又去不掉,唉,真是郁闷。
      

  3.   

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    var
      str: string;
    begin
      // SendKey(edit2.Handle, Key);
      if key=#13 then //enter
        key:=#0;
      if key=#8 then //backspace
      begin
        form2.Caption := copy(form2.caption,0,length(form2.Caption)-1);
      end
      else
        form2.Caption := form2.Caption+key;end;form2.formstyle := fsStayontop
      

  4.   

    我试了楼上兄弟的方法,好象还是没有解决焦点问题,除非用form1.edit2.setfocus让edit2始终拥有焦点。
      

  5.   

    这个问题我已经解决了。焦点失去,是因为我在Chage事件中,有重复的提示窗口Show动作。经过修改,已经完成了预期的功能。谢谢以上各位的解答。结贴
      

  6.   

    var
      str: string;
    begin
      // SendKey(edit2.Handle, Key);
      if key=#13 then
        key:=#0;
      if key=#8 then
      begin
        form2.Memo1.Text := copy(form2.Memo1.Text,0,length(form2.Memo1.Text)-1);
      end
      else
        form2.Memo1.Text := form2.Memo1.Text+key;和上面的没有区别
    form1 onshow
    form2.show;