2013-07-24 4 views
2

내 응용 프로그램에 여러 MDI 양식이 있고이 양식 중 하나에 자세한 정보가있는 하위 모달 양식이 있습니다. 그래서 MDI 폼에서이 모달 폼을 열면 '찾아보기'버튼을 클릭하고 OpenFileDialog를 만듭니다. 내가 ALT + TAB을 제외하고는 모든 것이 잘 작동합니다. 내가 ALT + Tab을 누른 다음 Alt + Tab을 다시 눌러서 내 응용 프로그램으로 돌아 가면 OpenFileDialog (메시지 상자도 해당)가 내 모달 창을 본 것이 아니라 MDI 창의 fron에있는 것을 알 수 있습니다. StayOnTop 또는 이와 비슷한 것이 없습니다. 모든 창 앞에 OpenDialog를 다시 가져 오는 유일한 방법은 내 응용 프로그램에 두 번째 Alt + Tab을 만드는 것입니다. 이로 인해 Dialog가 다른 모든 창 앞에 팝업됩니다.alt + tab에서 OpenDialog가 모달 창으로 이동합니다.

Modal 폼 뒤에 Dialog가 숨어 나오지 않도록하려면 어떻게해야합니까? 어떠한 제안?

나는 delphi7를 사용하고 난이 문제가 윈도우 소유권과 관련이 있음을 hypothesising있어

+0

http://stackoverflow.com/q/5660468/62576 –

+3

어떤 버전의 델파이입니까? 대화를 어떻게 보여 주나요? Delphi의 이전 버전에서는 때때로 대화 상자의 창 소유자를 설정하지 못했습니다. –

+0

StayOnTop 양식이 없기 때문에 delphi7을 사용하고 더 큰 버전을 사용할 수 없다는 사실을 잊어 버렸습니다. – Darthman

답변

6

더 큰 버전을 사용할 수 없습니다. Delphi 7에서 파일 대화 상자는 창 소유자로서 숨겨진 응용 프로그램 창을가집니다. 그러나 창 소유자는 실제로 활성 양식의 창이어야합니다.

이이 문제를 해결하기 위해 많은 방법이 있지만, 아마도 단순한는 TOpenDialog를 서브 클래스와 같은 그 TaskModalDialog 무시하는 것입니다

function TMyOpenDialog.TaskModalDialog(DialogFunc: Pointer; 
    var DialogData): LongBool; 
var 
    hwndOwner: HWND; 
begin 
    hwndOwner := Screen.ActiveForm.Handle; 
    if hwndOwner = 0 then 
    hwndOwner := Application.MainForm.Handle; 
    if hwndOwner = 0 then 
    hwndOwner := Application.Handle; 
    TOpenFilename(DialogData).hwndOwner := hwndOwner; 
    Result := inherited TaskModalDialog(DialogFunc, DialogData); 
end; 

내가 이것을 테스트하기 위해 손에서 델파이 7을 가지고,하지만 난하지를 (아마도 hwndOwner 선택의 약간의 조정과 함께)이 라인을 따라 무언가가 그것을 해결할 것이라고 합리적으로 확신합니다.

+1

아래에서 수정 한 내용으로 답을 수정할 수 있습니까? – Darthman

+0

@Darthman Done. 나는 당신이 지금 당신의 대답을 삭제할 수 있다고 생각합니다. BTW, 당신은 내 대답에 제안 된 편집을 할 수 있었고 나는 그것을 받아 들였습니다. –

+0

다음 번에 가져 가겠습니다. Tnx. – Darthman

관련 문제