Delphi MDI 다중 문서 구조의 몇 가지 문제 해결

4329 단어 DelphiMDI
1. 로그인 창(Login) 정보:
델피의 MDIform을 개발할 때 Login의 정상적인 로그인 창을 만들어야 하기 때문에 평소에 Login의 프로젝트 코드는 다음과 같다. Login이 로그인에 성공했을 때만frmMain 창, MDI 프레임워크를 사용하지 않는 정상적인 로그인과 메인 창을 전환합니다.
Application.CreateForm(Tfrm_Login, frm_Login);
    if frm_Login.ShowModal = mrOK then //          mrOK ,      
    begin
      Application.CreateForm(Tfrm_Main, frm_Main);
      frm_Main.ShowModal;
    end;

지금 문제는 프롬...Main은 MDI 메인 창이고델파이는 첫 번째CreateForm을 MDI 메인 창으로 인정하고frmLogin의 FormsTyle은 fsNormal 일반 창입니다.
위 코드를 누르면 "Cannot create form. No MDI forms are currently active."
솔루션:
델파이가 첫 번째 CreateForm을 MDI 메인 창으로 인정할 바에야 Application을 사용하겠습니다.CreateForm(Tfrm_Main,frm_Main);프로젝트 코드는 맨 앞에 배치됩니다.
  Application.CreateForm(Tfrm_Main, frm_Main);
  Application.CreateForm(Tfrm_Login, frm_Login);

이렇게 하면 실행된 첫 번째 창은 Login이 아니라Main 창입니다. 이 때 Main 창 Oncreate 이벤트에 다음 코드를 추가해야 합니다.
procedure Tfrm_Main.FormCreate(Sender: TObject);
begin
  with Tfrm_Login.Create(Self) do ShowModal;
end;

이 문장 뒤에 있는 것을 더하면 실행 후의 첫 번째 창은 바로 Login이고 첫 번째 문제 해결이다.
2. MDI 하위 창의 최소화와 창 복구에 대해
MDI 창을 만들 때 메뉴 단추를 누르면 첫 번째 MDI 하위 창을 호출합니다.MDI 하위 창을 최소화하면 메인 창의 왼쪽 아래에 있는 창을 볼 수 있습니다.
메뉴를 다시 클릭하면 창을 다시 만드는 것이 아니라 원래 창을 호출해서 표시합니다.(예를 들어 MDI 하위 창이 최소화되었는데, 이 하위 창 단추를 눌렀을 때, 이 하위 창은 다시 중앙으로 Restrore해야 합니다)
처음에frmUserDefine (내 MDI 하위 창) 을 제어합니다.다음을 포함합니다.
showwindow(frm_UserDefine.handle, sw_restore);//하위 창 표시
SendMessage(frm_UserDefine.Handle,MY_SETSTATE_MSG,0,0);//하위 창에 메시지를 보내서 Restore에 메시지를 트리거합니다.
모두 쓸모가 없고, 심지어 아래의 코드도 메모리 오류를 보고할 수 있다
procedure Tfrm_Main.N9Click(Sender: TObject);
var
  frm_UserDefine: Tfrm_UserDefine;
begin
  if not isInclude(Tfrm_UserDefine) then
  begin
    frm_UserDefine := Tfrm_UserDefine.Create(Application);
    frm_UserDefine.Show;
  end
  else
  begin
    frm_UserDefine.Show;
  end;
end;
다시 눌렀을 때frm 판단UserDefine이 설정되어 다시 show할 때 오류가 발생했습니다. 마지막으로 추적해서frmUser Define을 찾을 수 없습니다. 저도 무슨 이유인지 잘 모르겠습니다.
솔루션:
나는 하위 창이 존재하는지 여부를 판단할 때 존재하면 Restore를 하고 이 기능을 실현했다. 코드는 다음과 같다.
function Tfrm_Main.isInclude(Formclass: TFormClass): Boolean;
var
  i: Integer;
  Form: TObject;
begin
  Result := false;
  for i := 0 to frm_Main.MDIChildCount do
  begin
    Form := frm_Main.MDIChildren[i];
    if Form is Formclass then
    begin
      Result := true;
      SendMessage(MDIChildren[i].Handle, WM_SYSCOMMAND, SC_RESTORE, 0); //    MDI        
      MDIChildren[i].Enabled:=true;
      MDIChildren[i].Show;
      MDIChildren[i].SetFocus;
    end;
  end;
end;
procedure Tfrm_Main.N9Click(Sender: TObject);
var
  frm_UserDefine: Tfrm_UserDefine;
begin
  if not isInclude(Tfrm_UserDefine) then
  begin
    frm_UserDefine := Tfrm_UserDefine.Create(Application);
    frm_UserDefine.Show;
  end;
end;

이렇게 하면 다시 클릭하면 하위 창을 다시 회복할 수 있는 기능을 실현할 수 있다.근데 더 좋은 해결책이 있으면 저한테 메시지를 남겨주세요.
3. MDI 하위 창이 메인 창 컨트롤에 의해 가려지는 문제
메인 창에 Falsh나 Webbrower 컨트롤을 삽입해야 하기 때문에 패널 컨트롤이 전체 내비게이션을 할 때 MDI 하위 창이 뒤로 가려져 머리가 아픕니다.(Image 컨트롤러가 MDI 서브창을 가리지 않았기 때문에 일반적으로 MDI 메인 창 뒤에 Image를 배경으로 하는 것이 개발된다) OK, 현재 문제는 메인 창의 컨트롤러가 MDI 서브창을 가리지 않고 밑에 숨어서 클릭할 수 있는 방법이다.
솔루션:
여기에서 나는 하위 창의 부류를 MDI 메인 창으로 가리키는데 코드는 다음과 같다.
procedure Tfrm_Main.N9Click(Sender: TObject);
var
  frm_UserDefine: Tfrm_UserDefine;
begin
  if not isInclude(Tfrm_UserDefine) then
  begin
    frm_UserDefine := Tfrm_UserDefine.Create(Application);
    Winapi.Windows.SetParent(frm_UserDefine.Handle,frm_Main.Handle);
    frm_UserDefine.Show;
  end;
end;
 
이때 호출된 하위 창 인터페이스가 컨트롤 앞에 있고 작은 버그가 하나 더 있습니다. 하위 창을 최소화한 후에 하위 창을 볼 수 없습니다. 이 때 창을 닫으면 메모리 오류가 발생합니다.
사실 최소화한 후 숨기면 마우스를 클릭할 수 있다.(이곳에 어떻게 숨겨졌는지 연구가 필요할 수도 있어요. 신이 원인을 알고 있다면 메모를 남겨주세요. 프레임이 바뀌어 MDI가 혼란스러워졌을 수도 있다고 생각해요.)
하위 창을 최소화할 때 show를 할 수 있고 하위 창은 컨트롤 (예: 패널) 이 있어야 합니다. (컨트롤이 없는 form도 최소화할 수 있습니다.) 다음은 하위 창 코드입니다.
procedure Tfrm_UserDefine.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  case WindowState of
    wsMinimized: Self.Show;
  end;
end;

문제 해결!
상기 코드는 Delphi XE5에서 개발한 것입니다. 마이크로소프트는 다중 문서 인터페이스의 MDI에 문제가 있다는 것을 설명했지만 현재 MDI 창을 시스템으로 개발한 것이 매우 많습니다.만약 여러분에게 더 좋은 방법이나 건의가 있다면 댓글로 많이 교류할 수 있습니다.

좋은 웹페이지 즐겨찾기