2012-01-04 3 views
0

winform에 대해 "wndProc"메서드를 재정의하려고합니다. 그래서, 특정 메시지에 대해 내 자신의 wndproc 메서드를 구현할 수 있습니다. 나는 그것을 성공적으로 할 수있다. 그러나, 지금 나는 지금까지 보지 못한 또 다른 문제에 뛰어 들고 있습니다.단일 스레드에서 두 번째 메시지 루프를 시작하는 것은 올바른 작업이 아닙니다.

성공적으로 컴파일 한 후 프로그램을 실행하고 "단일 스레드에서 두 번째 메시지 루프를 시작하는 것이 유효한 작업이 아닙니다. 대신 Form.ShowDialog를 사용하십시오."라는 오류 메시지가 나타납니다.

보호 액세스 지정에서 내 오버라이드 (override) 방법 winproc :

method WndProc(var m:Message); override; 

메소드 winproc의 나의 정의는 다음과 같이

오류가 발생
method MainForm.WndProc(var m: Message); 
const WM_NCLBUTTONDOWN = 161; 
const WM_SYSCOMMAND = 274; 
const HTCAPTION = 2; 
const SC_MOVE = 61456; 
begin 
    if ((m.Msg = WM_SYSCOMMAND) and (m.WParam.ToInt32 = SC_MOVE)) then 
    begin 
     exit; 
    end; 

    if ((m.Msg = WM_NCLBUTTONDOWN) and (m.WParam.ToInt32 = HTCAPTION)) then 
    begin 
     exit; 
    end; 
end; 

가 program.pas 파일에 있습니다 :

[STAThread] 
class method Program.Main(args: array of string); 
begin 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.ThreadException += OnThreadException; 
    using lMainForm := new MainForm do 
    Application.Run(lMainForm); < --------Raised here. 
end; 

어떻게해야합니까? 그것을 해결 하시겠습니까?

+3

흠, "오류 창 핸들 만들기"예외가 생성됩니다. 오버라이드에서 기본 메서드를 호출해야합니다. 예외가 발생하지 않으면 스택 추적을 게시하십시오. –

+0

@HansPassant 당신 말이 맞아요. 나 또한 창 핸들을 만드는 중 오류가 발생하는 것을 보았습니다. – ThN

답변

0

HansPassant에서 암시 한 것처럼 기본 클래스 wndproc이 포함되어 작동합니다.

델파이 프리즘에서 우리는 이렇게합니다.

상속 된 WndProc (var m);

base.wndproc (m)과 동일합니다.

1

WndProc을 무시할 필요가 없으며 실행 한 문제로 인해 실제로 원하지 않습니다. 당신이해야 할 모든 당신이 그것을 처리하고이 같은 메시지 핸들러로 선언 전달하려는 특정 메시지를 처리하는 프로 시저를 만들 수 있습니다 :

procedure HandleSysCommand(var Msg: TWMSysCommand) ; message WM_SYSCOMMAND;

"메시지 WM_SYSCOMMAND"무엇을 말하고 당신의 응용 프로그램에서 처리중인 Windows 메시지를 확인하고이를 사용하여 표준 또는 사용자 지정 메시지를 트랩 할 수 있습니다. 더 많은 고급 정보를 얻으려면 "Delphi Handle Windows Messages"를 검색하여 모든 메시징 요구 사항을 처리하는 데 필요한 모든 정보를 얻으십시오.