2011-03-17 4 views
0

오늘 제가 작성한 델파이 앱에서 파일을 열었습니다. 어떤 이유로 Windows의 파일 네트워크 연결이 중요하지 않기 때문에 Windows에서 문제를 경고하는 대화 상자를 만들었습니다. 그러나 내 앱의 기본 양식은 새로 만든 대화 상자 위에있었습니다 (즉, 내 앱, 파일 열기 대화 상자 및 경고 대화 상자 용 양식이 있음). 경고 대화 상자는 모달이며 기본 폼 뒤에 숨겨져 있습니다. 분명히, 나는 문제가 있었다.대화 상자가 기본 폼 뒤에 표시되는 이유는 무엇입니까?

어떤 일이 벌어지고 있는지 또는 문제를 어떻게 해결할 수 있는지 생각해보십시오. 기본 폼의 위치 속성은 poDesigned로 설정되어 있으며 닫기/시작시 폼의 위치를 ​​저장 /로드합니다. 너무 많은 초보자가 어떤 정보가 문제를 진단하는 데 도움이되는지 알고 있습니다. 그래도 문제는 이 아니며 파일 열기 대화 상자 - 표시된 위치에 표시됨 -이 문제는 경고 대화 상자였습니다. 항상

감사합니다, -

+1

어떤 델파이 버전입니까? –

+1

대화 상자의 오류 메시지 및 Windows 버전은 무엇입니까? –

+0

Delphi 2006 및 Win 7입니다. 오류 메시지는 Windows가 네트워크에 연결할 수없는 것에 관한 것입니다. ... 답장을 보내 주신 모든 분들께 감사드립니다. –

답변

2

윈도우 앱에서 대화 상자를 만드는 이유는 이해가 안 돼요. 어떤 API 호출이 그 결과로 발생 했습니까? 일반 파일 작업에는 UI가 표시되지 않습니다.

아마도 쉘 API에서 UI를 표시 할 수있는 API 함수를 사용했을 가능성이 큽니다. 모달 대화 상자를 표시 할 수있는 함수는 소유자 HWND을 요청합니다.

예를 들어 MessageBox()을 생각해보십시오.이 기능은 앱에 모달 대화 상자를 표시합니다. 그 첫 번째 매개 변수는 hWnd이라고하며 메시지 상자의 소유자 창에 대한 핸들을 만들 수

설명되어 있습니다. 이 매개 변수가 NULL이면 메시지 상자에 소유자 창이 없습니다.

레이몬드 첸 (Raymond Chen)은 이것을 설정하는 것이 중요한 이유를 설명하는 형식으로 whole series of articles입니다.

모달 UI를 표시하는 Win32 API 함수를 호출하고 소유자 HWND을 올바르게 설정하지 않은 경우가 있습니다. 물론, 나는 완전히 틀릴 수도 있지만 더 많은 정보가 없다.

2

당신은 네트워크 공유에있는 파일을 열려고 시도하기 전에 SetErrorMode를 사용하여이 작업을 중지 할 수 있습니다

var 
    OldErrorMode: Integer; 
begin 
    OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX); 
    try 
    if OpenDialog1.Execute then 
    begin 
     // .... 
    end; 
    finally 
    SetErrorMode(OldErrorMode); 
    end; 
end; 

이후 델파이의 버전 (IIRC, D2007 이상)을 받아 TOpenDialog.Execute의 오버로드 된 버전을 추가 매개 변수로서 창 핸들; 이것은 TOpenDialog의 부모를 설정하고 OpenDialog (및 생성 된 모든 오류 창)가 기본 창 뒤에 나타나지 않도록합니다.

참고 : Alt + Tab을 사용하여 배경 대화 상자로 이동하여 응용 프로그램이 다시 나타날 때까지 반복 할 수 있습니다. 이것은 대개 양식 위에 숨겨진 대화를 가져옵니다.

+0

VCL에서 오류 모드를 설정하지 않았습니까? 저는 명시 적으로'SetErrorMode'를 호출하지 않았습니다. 그래서 저는 누군가가 제 대신 그것을하고 있다고 가정 할 수 있습니다! –

+0

@ David : 아니, AFAIK 아닙니다. 그것이 내가 SetErrorMode에 대해 처음 알았던 방법입니다.:) 그리고 제가 말했던 것처럼 Delphi의 최신 버전은 오버로드 된 Execute의 HWND 매개 변수를 제공하여이 문제를 해결합니다. 폴더를 표시 할 때 오류가있는 TOpenDialog를 사용하지 않았습니까? –

+0

@Ken 항상 내 소유자 'HWND'를 올바르게 설정했습니다. 이것이 근본적인 문제입니다. 실제로 이것이 OP가 오해의 소지가 있으며 SetErrorMode에 집중함으로써 카펫 아래에서 실질적인 문제가 상당 부분 발생하는 것을 권장합니다. 이것이 실제로 관찰 된 동작의 이유 인 경우입니다. –

관련 문제