关闭以前的所有窗口??谢谢了,,

解决方案 »

  1.   

    当然不能用application.Terminatele, 你试试一个一个的关。
      

  2.   

    呵呵,给每个窗体加上close就好了
      

  3.   

    以前的什么窗口,是同一应用程序里的吗?关闭窗口的方法很多,如果你知道它的句柄,可以给它发一个WM_CLOSE 消息;如果你不知现在有哪些窗口,可以用EnumWindows找到所有的窗口
      

  4.   

    加监听事件可不可以?新开窗口的时候发个关闭事件。收到的窗口自己关自己。新窗口先不接受该事件,这样就可以实现你的要求吧主要思路就是让窗口们自己关自己(java里这种办法可以),delphi我是菜菜菜鸟,不太清楚
      

  5.   

    up
    谢谢上面的几位大!!
    to 回复人: Cipherliu(孤鹰) ( ) 信誉:100  如果你不知现在有哪些窗口,可以用EnumWindows找到所有的窗口
    那怎么做呢?有没有代码?谢谢了,如果分不够,,我在用别的号给分,,谢谢了!!!!!!!
      

  6.   

    用这个法行不行。不过要求你创建的窗体要依主窗体为parent。可以用这个思路扩展
    var i:integer;
    begin
      i:=0;
      while (ComponentCount>0) and (i<ComponentCount) do
      if Components[i] is TForm then
      begin
        TForm(Components[i]).Close;//or free
        i:=0
      end else Inc(i);
    end;
      

  7.   

    不是这样的你那就是Application.ComponentCount拉。道理一样
    var i:integer;
    begin
      i:=0;
      while (Application.ComponentCount>0) and (i<Application.ComponentCount) do
      if (Application.Components[i] is TForm)and not (Application.Components[i] is TMainForm) then //TMainForm is your MainForm ,Replace
       begin  
          TForm(Application.Components[i]).Close;//or free
          i:=0
        end else Inc(i);
    end;
      

  8.   

    给你个建议, 把程序窗口的句柄存入数组.当做以上动作是 循环检查一下,除了第i,其他的全都hide.我见过一个多文档的程序是循环检查子窗口 如果满足"当前"条件就打开 否则hide
      

  9.   

    to 回复人: woaijingjing() ( ) 信誉:100 
    窗体开始就设计好谢谢上面的!!!
      

  10.   

    建议把每个窗体的Tag属性设为一组有序的数字,如1_10 等等,当打开当前窗体时,判断一下Tag属性 根据它关闭其他的窗体
      

  11.   

    to 回复人: woaijingjing() ( ) 信誉:100 谢谢
      

  12.   

    这样试一下: 
    var form1:Tform;for i := 0 to Screen.FormCount -1 do
        if Screen.Forms[i].ClassType = FormClass then begin
            form1:=Screen.Forms[i];
            form1.close;
           end;
      

  13.   


    function TMainForm.existform(formname:string):boolean;
    var
    i:integer;
    begin
    result:=false;
    with mainform do
    for i:=mdichildcount-1 downto 0 do
    if pos(uppercase(formname),uppercase(mdichildren[i].Name ))>0 then
    begin
    result:=true;
    break;
    end;
    end;/////////
    运用:假如你打开了A,现在要找开B,那就在B的菜单写:if mainform.existform('A')then
      begin
      A.Close ;
      A.Destroy ;
      end;  ///////
    if not mainform.existform('B')then
    begin
    application.CreateForm(TB,B);
    B.Show ;
    end;
      

  14.   

    Screen.Forms是Tlist类型,存放的当前应用程序的所有已经创建的form的,只要根据根据其循环,释放掉除了主form之外的所有form就可以了
      

  15.   

    EnumWindows 是回调函数,我帮你找了一篇文章,你先看看首先,什么是回调函数呢?回调函数就是能对一系列系统内部元素执行给定操作的API函数,例如能对所有同类窗口进行操作的函数。这种函数也叫枚举函数,它是作为参数传递的函数,代表对所有内部元素执行的操作,该函数或过程的类型必须与给定的过程类型兼容。Windows 回调函数的应用不止上述一种,不过这里仅研究以上简单应用。现在考虑 EnumWindows API 函数,它的原型如下(从Win32 帮助文件拷贝而来):BOOL EnumWindows(
      WNDENUMPROC lpEnumFunc,  // address of callback function
      LPARAM lParam // application-defined value
      );
    当然,这是个C语言的定义。我们可以查看Windows 单元,从中找到相应的Pascal 语言定义:function EnumWindows (
      lpEnumFunc: TFNWndEnumProc;
      lParam: LPARAM): BOOL; stdcall;
    查阅帮助文件,我们发现作为参数传递的函数应该属于下面的类型(也是在C中):BOOL CALLBACK EnumWindowsProc (
      HWND hwnd, // handle of parent window
      LPARAM lParam // application-defined value
      );
    这与下面的Delphi 过程类型定义一致:type
      EnumWindowsProc = function (Hwnd: THandle;
        Param: Pointer): Boolean; stdcall;
    其中第一个参数是各主窗体的句柄,第二个参数则是调用EnumWindows 函数时所传递的值。实际上,Pascal 中没有相应的TFNWndEnumProc类型定义 ,它只是个指针。这意味着我们需要传递一个带有合适参数的函数,将它用作一个指针,也就是取函数的地址而不是调用它。不幸的是,这也意味着如果某个参数类型出现错误时,编译器不会给予提示。每当调用Windows API函数或传递一个回调函数给系统时,Windows 要求程序员遵循stdcall 调用协定。缺省情况下,Delphi使用另一种更高效的调用协定,其关键字为register。下面是一个与定义兼容的回调函数,此函数把窗口的标题读到字符串中,然后添加到给定窗体的一个列表框中:function GetTitle (Hwnd: THandle; Param: Pointer): Boolean; stdcall;
    var
      Text: string;
    begin
      SetLength (Text, 100);
      GetWindowText (Hwnd, PChar (Text), 100);
      FormCallBack.ListBox1.Items.Add (
        IntToStr (Hwnd) + ': ' + Text);
      Result := True;
    end;
    窗体有一个几乎覆盖整个窗体的列表框,窗体顶部有一个小面板,面板上有一个按钮。当按下按钮时,EnumWindows API函数被调用,并且GetTitle 函数作为参数传递给它:procedure TFormCallback.BtnTitlesClick(Sender: TObject);
    var
      EWProc: EnumWindowsProc;
    begin
      ListBox1.Items.Clear;
      EWProc := GetTitle;
      EnumWindows (@EWProc, 0);
    end;
    你可以直接调用GetTitle函数,不必先把值保存到过程类型临时变量中,上例这么做是为了使回调过程更清楚。程序运行结果确实很有意思,正如你在图9.2中看到的那样,结果显示了系统中正在运行的所有主窗口,其中大部分是隐藏的,你通常看不到,许多实际上没有标题。你改写GetTitle 函数,就可以关闭其它的窗口了.
    注意,别把自己也关闭了,检查一下句柄是不是自己的句柄.