Delphi MDI 다중 문서 구조의 몇 가지 문제 해결
델피의 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 창을 시스템으로 개발한 것이 매우 많습니다.만약 여러분에게 더 좋은 방법이나 건의가 있다면 댓글로 많이 교류할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Delphi] TStringBuilder그리고 꼭 사용해야만 할까? 그림처럼 Heap 영역에 "Hello" 공간을 생성하고 포인팅을 한다. "Hello World" 공간을 새로 생성한 후 포인팅을 하게 된다. 결국 "Hello" 라는 String 객체가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.