各位大虾好!现进程有一个主窗口Form1和一个子窗口Form2,Form2是在Application里Create的,主窗口(最大化)有一个ListView,当子窗口在最前的时候,想从主窗口的ListView里拖一个项到子窗口,但当点击ListView中的项到子窗口的时候子窗口却被挡在了主窗口后,有没有办法可以解决啊。当然用TopMost也可以,但小弟想知道还有没有别的办法。不知道大家有没有注意过,在文件浏览器托动文件到任何一个能接受文件托放的窗口的时候,在鼠标左键没有松开并开始找动的时候,接受文件托放
的窗口不会马上失去焦点(文件浏览器和接受文件的窗口只是都失去了焦点)也不会被文件浏览器挡住(当然直接点一点文件例外)。小弟想要的就是这样的效果,请大家多多帮忙,分不够再加,这里给的会是专家分了吧,以前不知道。

解决方案 »

  1.   

    Form2.FormStyle := fsStayOnTop;
      

  2.   

    非常感谢楼上大虾的回复,这个和TopMost没有什么区别吧?小弟不想要这个办法,还有没有别的呢?像文件浏览器托文件到WinRAR那样的效果,好像WinRAR也没有StayOnTop吧?
      

  3.   

    以下是用一个可在两个窗体之间拖动的按钮,做试验:(两个窗体的单元如下)--------------------------------------------------
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;  //显示Form2
        Button2: TButton;  //运行后,点击Button1使Form2被Show出来,然后拖Button2试试
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Button2StartDock(Sender: TObject;
          var DragObject: TDragDockObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      Form2.FormStyle := fsStayOnTop;
      form2.Show;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Form1.Button2.DragKind := dkDock;
      Form1.Button2.DragMode := dmAutomatic;
      Form1.DockSite := True;
    end;procedure TForm1.Button2StartDock(Sender: TObject;
      var DragObject: TDragDockObject);
    begin
      Form2.FormStyle := fsStayOnTop;
    end;end.----------------------------------------------unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm2 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementation{$R *.dfm}procedure TForm2.FormCreate(Sender: TObject);
    begin
      Form2.DockSite := True;
    end;end.
      

  4.   

    我不懂你说的那个TopMast要不,你发消息吧。就是把我上面代码Form2.formstyle := fsStayoNtop这 句,换成:SetWindowPos(form2.handle,form1.handle,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
      

  5.   

    前面的测试代码里,如果想停止拖动后取消其StayOnTop属性,可再加上:procedure TForm1.Button2EndDock(Sender, Target: TObject; X, Y: Integer);
    begin
      Form2.FormStyle := fsNormal;
    end;
      

  6.   

    楼上大虾的意思是将Form2的DockSite属性设为True吗?看代码好像还是要用到StayOnTop?小弟的动作是在Form1中的ListView中托动一个项到Form2的ListView中去,不知道有没有通用性啊?
      

  7.   

    那是我做拖动试验用的,与窗体置前没有关系。置前的代码,一种是Form2.formstyle := fsStayoNtop;一种是发消息:SetWindowPos(form2.handle,form1.handle,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
      

  8.   

    因为我这里不可能用ListView做一个拖动试验,那样我就浪费时间了。道理是一样的:在开始拖动的事件里,发消息(代码已在上面说了),让Form2置前。
      

  9.   

    我当然知道这个。Windows文件浏览器是SysListView32控件,有这个能力。这个控件,Delphi原生控件里是没有的。
      

  10.   

    给你个很笨的建议,拖放的时候,也就是在主窗口的你需要拖放项目上按下的时候SetWindowPos将子窗口设置到最前,拖放结束以后,SetWindowPos将子窗口不要设置到最前,试一下行不行.不行的话再想起他办法。