답변 감사합니다.
임프님께서 말씀하신대로 패널 단계수를 다 확인해보지는 않았지만..
대략 10단계 이내입니다. 제가 만든 부분은 7-8단계정도..
최종 패널위 다른 컨트롤이라고 해봐야.. 콤보,에디트,패널(라벨용), 라디오 등으로 100여개 정도(?) 그중에서 조건에 따라 화면에 보여지는 것은 한 20여개 안팎..정도입니다.
일단은 중첩구조를 최대한으로 줄이는 방향으로 수정해보겠습니다.
자료를 찾아보면서까지 답변주셔서 고맙습니다.
박지훈.임프 님이 쓰신 글 :
: 혹시 해당 폼의 컨트롤들이 중첩된 구조가 대단히 복잡하지 않으신가요?
: 패널안에 패널이 포함되어 있고 그안에 다시 패널이 들어있고 또 들어있고... 이런 단계가 십여단계를 넘어서는...
:
: 만약 그렇다면.. 안타깝게도 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 를 이용하라는 내용이 있는데
: : : : 내공부족으로 인해 처리하지 못했습니다.
: : : :
: : : : 도움을 청합니다..