Q&A

  • MDI폼에서 Child폼들을 한번에 전부 Close시키는 방법이 있나요?

DMI폼에서 Child폼들을 띄우고 창끄는 건 구현했는데요.
Child폼이 한개 또는 여러개가 보이는 상태에서 한번에 전부 Close하는 방법이 있나요?
MDI폼도 끄는 건 아니고요, MDI폼은 살아있는 상태에서 Child폼들만 전부 Close하는 방법이 애타게 필요합니다.

Child폼 띄우는 방법은 검색을 하다가 function으로 했습니다.
<!--CodeS-->
function TfmMain.CreateForm(sClass:string;index:integer):Boolean;
var
  MyFormClass : TFormClass;
  WorkForm    : TForm;  
  H           : THandle;
  I           : Integer;
begin
  IntTostr(I);
  Result := True;
  H := 0;
  
  mainClientWidth:= fmMain.ClientWidth - 4;
  mainClientHeight:= fmMain.ClientHeight - mainFormStatusBar.Height - 4;

  for I := 0 to Screen.CustomFormCount - 1 do
    begin
    if UpperCase('T' + Screen.CustomForms[I].Name) = UpperCase(sClass) then
      begin
        H := Screen.CustomForms[I].Handle;
        Break;
      end;
    end;

    if H = 0 then
      begin // begin(1)
        MyFormClass:= TFormClass(GetClass(sClass));
        if MyFormClass <> nil then
          begin // begin(2)
          WorkForm :=  MyFormClass.Create(Application.MainForm);
            if WorkForm <> nil then
              case index of
                100: begin // begin(3)
                  HandlerPoint.MDIChild:= WorkForm;
                  Workform.Width:= Workform.Width;
                  Workform.Height:= Workform.Height;
                  Workform.left:= Workform.Width div 2;
                  Workform.top:= Workform.Height div 2;
                end;  // end(3)

                200 : begin // begin(3)
                  HandlerPoint.MDIChild:= WorkForm;
                  Workform.Width:= Workform.Width;
                  Workform.Height:= Workform.Height;
                  Workform.left:= 0;
                  Workform.top:= 0;
                end;  // end(3)
              end//case index of

            else
               Showmessage(sClass+'폼을 생성하는데 실패하였습니다.');
          end // end(2)
        else Result := False;
      end // end(1)
    //
    else
      begin
        if IsIconic(H) then
          ShowWindow(H, SW_SHOWNORMAL)
        else BringWindowToTop(H);
      end;
end;
<!--CodeE-->

이런 function을 코딩하고,
if HandlerPoint.MDIChild = Nil then CreateForm('TForm1',100);
요런식으로 Child폼이 띄도록 만들었습니다.

아, Form1.pas에서 end.바로 위에
initialization RegisterClasses([TForm1]) 요고 적었고요
[프로젝트]-> "옵션"에서 Available forms도 추가하는 설정도 해줬고요.


요런 방법으로 할 때,
Child폼을 한꺼번에 Close하는 방법은 없을까요??

2  COMMENTS
  • Profile
    홍성락 2009.07.08 10:04
    for i := Application.MainForm.MDIChildCount-1 downto 0 do
    Application.MainForm.MDIChildren[i].Close;

    이런걸 원하셨는지요? 카운트는 역으로 downto하면됩니다.
  • Profile
    윤영훈 2009.07.08 18:14
    답변 감사합니다.
    바로 적용했더니 바로 원하는 대로 되는군요~ 감사해요~