혹시 해당 폼의 컨트롤들이 중첩된 구조가 대단히 복잡하지 않으신가요?
패널안에 패널이 포함되어 있고 그안에 다시 패널이 들어있고 또 들어있고... 이런 단계가 십여단계를 넘어서는...
만약 그렇다면.. 안타깝게도 VCL의 버그인 거 같습니다. 검색해봤더니 다음과 같은 글이 나오네요.
http://qc.borland.com/wc/qcmain.aspx?d=8842
이 글의 내용은, 중첩된(nested) 단계수가 24단계를 넘어서니까 윈도우 리사이즈를 하다가 "매개 변수가 틀립니다" 에러가
발생한다고 하는군요. 그리고 47단계가 넘으면 생성하다가 바로 해당 에러가 발생하고요.
("매개 변수가 틀립니다" 에러의 영문 메시지는 "The parameter is incorrect")
중첩 수준이 24단계가 넘는 수준에서 리사이즈하다가 해당 에러가 나는 경우는 재현하기가 어려웠지만..
47단계에서 바로 에러가 발생하는 것은 쉽게 재현이 되는군요. 델파이 5/6/7/2005에서 공통적이었구요.
같은 VCL을 쓰는 C++빌더에서도 그렇고, 현재 베타테스트중인 2006 버전에서도 마찬가지네요.
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
AParent, AChild: TWinControl;
begin
AParent := Form1;
for i:=1 to 50 do
begin
AChild := TPanel.Create(self);
AChild.Parent := AParent;
AChild.Anchors := [akLeft, akRight, akTop, akBottom];
Caption := IntToStr(i);
AParent := AChild;
end;
end;
또 한가지 안타까운 일은, 해당 컨트롤이 무거우면 무거울 수록 이 최대치가 점점 내려간다는 거네요.
버그를 레포팅한 Philippe Auphelle에 의하면 컴포넌트가 대단히 많이 올려져 있는 무거운 프레임의 경우 3~4단계만으로도
해당 에러가 발생한다고 합니다. (무거운 프레임 안에 다시 무거운 프레임, 그 안에 다시 무거운 프레임...)
물론 이런 문제는 한두단계의 중첩 정도에서 컴포넌트가 아무리 많아도 발생하지 않습니다. 실제로 제 경우에도 한 폼에
최대 천여개의 컴포넌트를 올려서 쓰고 있고, 최대 10단계? 정도까지 중첩시켜본 적도 있습니다. 프레임은 2단계까지
중첩시켜봤구요.
만약 이런 경우에 해당하신다면..
다른 방법으로 중첩된 단계수를 줄이는 것 외에는 다른 해법이 없을 것 같네요...
그럼...
김민웅 님이 쓰신 글 :
: 환경은 Delphi 버전은 7이고, OS는 Windows2000 Pro 입니다.
:
: 구조에 대해서 간단히 설명드리자면...
: DataModule에 TActionManager를 올려서 메인화면에 사용될 각 메뉴(툴버튼)를 정의하였고,
: 이때, 각 메뉴(툴버튼)에 TImageList에 등록된 Bmp이미지를 지정했습니다.
: 메인화면에서는 TActionMainMenuBar와 TActionToolBar를 사용해서 화면에 메인메뉴와 툴버튼을 보여주는 구조입니다.
:
: 화면 생성은 쓰레드를 쓰지 않고, 프로젝트 파일에서 'Application.CreateForm'으로 호출하여 폼을 생성합니다.
: (메인메뉴는 10여가지이고 툴버튼은 7가지 입니다.)
:
: 델파이 폼에 아무런 컴포넌트도 없는 상태에서는 아무런 이상이 없었습니다.
:
: 참고로, 컴파일 옵션에서 Use debug DCUs 를 체크하여 디버깅하니 Graphics.pas의 아래의 프로시저(GDIError)에서 예외처리가 발생합니다.
:
: procedure GDIError;
: var
: ErrorCode: Integer;
: Buf: array [Byte] of Char;
: begin
: ErrorCode := GetLastError;
: if (ErrorCode <> 0) and (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil,
: ErrorCode, LOCALE_USER_DEFAULT, Buf, sizeof(Buf), nil) <> 0) then
: raise EOutOfResources.Create(Buf) --> 여기에서 '매개변수가 틀립니다'라는 메시지가...
: else
: OutOfResources;
: end;
:
:
:
: 박지훈.임프 님이 쓰신 글 :
: : 전혀 보지도 못했고 들어보지도 못한 경우네요.
: : 폼이 리사이즈되는 동안 그 폼에 포함된 컴포넌트들이 같이 리사이즈될텐데, 혹 폼에 포함된 컴포넌트들중 특정한 넘이
: : 리사이즈를 제대로 처리하지 못해 생기는 에러는 아닐까 의심스럽기도 하고요.
: :
: : 에러가 발생하는 상황을 좀더 자세히 적어주시면 추적하는 데 도움이 될 듯.
: : 델파이에서 폼에 아무런 컴포넌트도 없는 상태에서도 똑같은 현상이 발생하는지요? (저는 발생하지 않는군요)
: : 사용하는 델파이의 버전은 어떻게 되는지요.
: :
: : 그럼...
: :
: :
: : 김민웅 님이 쓰신 글 :
: : : 안녕하세요..
: : :
: : : 도움을 청합니다.
: : :
: : : 제목대로 마우스로 어플리케이션의 닫기버튼(X) 근처에 마우스를 가져다 놓으면 폼을 리사이즈할 수 있는 형태로 마우스 커서(?)의 모양이 바뀝니다.
: : :
: : : 이 상태에서 폼의 크기를 몇 차례 연속으로 조절하면 '매개 변수가 틀립니다'라는 메시지 창이 나오면서
: : : 어플리케이션이 종료됩니다.
: : : (창의 개수를 헤아리기 힘들 정도로 많이..)
: : : 그리고 폼의 크기를 조절하는 순간 CPU의 사용율이 50%이상으로 올라가는 현상이 발생합니다.
: : :
: : : 이 현상은 windows 2000 에서는 '바탕화면- 등록정보 - 효과탭 - 마우스 끄는동안 창내용표시' 옵션을
: : : XP에서는 '바탕화면 - 등록정보 - 화면배색탭 - 효과버턴 - 마우스 끄는동안 창내용표시' 옵션을
: : : 체크했을 때만 발생합니다.
: : :
: : : 이와 관련하여 게시된 글을 살펴봤는데
: : : WM_SIZE메세지 를 이용하라는 것과
: : : WM_SIZE 메세지와 wParam의 SIZE_RESTORED 를 이용하라는 내용이 있는데
: : : 내공부족으로 인해 처리하지 못했습니다.
: : :
: : : 도움을 청합니다..