2008-11-12 3 views
4

Delphi MDI 응용 프로그램에서 타이머가 실행 중입니다. 백그라운드에서 변경된 내용이 있으면 메시지 팝업을 사용하고 싶습니다. 그러나 사용자가 아무 것도 할 수 없기 때문에 응용 프로그램이 모달 대화 상자를 포 그라운드에 가지고있을 때 해당 메시지가 나타나지 않게하고 싶습니다.델파이 애플리케이션에 현재 모달 윈도우가 있는지 어떻게 알 수 있습니까?

그렇다면 응용 프로그램에서 모달 대화 상자가 있는지 어떻게 확인할 수 있습니까? 델파이 4에서 테스트

var 
    ActForm: TCustomForm; 
begin 
    ActForm := Screen.ActiveForm; 
    if (ActForm = nil) or not (fsModal in ActForm.FormState) then begin 

    end; 
end; 

, 나를 위해 작동 :

답변

8

이 코드를 시도 할 수 있습니다.

[편집] 그러나 실제로 폼을 팝업하고 포커스를 훔치는 것이 좋은 생각인지 생각해야합니다. 응용 프로그램에 따라 다르지만 사용자가 현재 편집 필드에 뭔가를 입력하거나 마우스로 무언가를하는 경우 워크 플로가 중단 될 수 있습니다.

+0

이 경우 사용자에게는 팝업을받지 못하는 옵션이 있으며 기본값은 not로 설정됩니다. –

2

아마 해결책은 실제로 포커스를 훔치지 않는 힌트를 팝업하는 것입니다. 어딘가에서 볼 수 있지만 너무 침해하지 않는 클릭 가능한 힌트. 따라서 사용자가 원하는 조치를 취하거나 조치를 완료 할 수 있다면 조치를 취하십시오. 또는 그것을 모두 무시하십시오.

+0

코멘트 주셔서 감사 드리며 동의합니다. –

6

Delphi 2005부터는 TApplication에 ModalLevel 속성이 있습니다. 그것은 응용 프로그램에서 연 Modal 양식의 수를 계산합니다.

+0

멋지다. 끝내서 내 상사에게 업그레이드하라고 해! –

+0

또한 몇 가지 이벤트가 있습니다 : TApplication.OnModalBegin 및 TApplication.OnModalEnd (이 질문을 참조하십시오 http://stackoverflow.com/questions/3306260/delphi-detecting-if-my-app-has-a-modal-dialog-open) – Name

+0

@Peter 당신의 상사가 받아 들인 대답에서 무료 해결책을 가리킬 것 같네요.) – mjn

1

오늘 사용자 histrioanother thread에 올바르게 응답했으며 모달 델파이 형식 만 모니터링하는 것만으로는 충분하지 않습니다. Windows에는 모달 대화 상자가있을 수도 있습니다.

그의 answer in another thread은이를 확인하는 방법을 보여줍니다.

--jeroen

2

사용 AnyPopup() 함수

정보 GetLastActivePopup(). 반환 값은 hWnd 매개 변수와 같을 때

  • hWnd로 식별되는 창이 가장 최근에 활성화되었습니다.
  • hWnd로 식별되는 창은 팝업 창이 없습니다.
  • hWnd로 식별되는 창은 최상위 창이 아니거나 다른 창에서 소유합니다.
+0

+1 여기에도 대답 해주세요. –

관련 문제