Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[16025] Re:Re: VCL 라이브러리가 엉터리로 만들어져 있어서 그래요 - 감사답변
착한아이 [hanaian] 1683 읽음    2019-05-21 09:47
10년동안 이 문제로 엄청난 스트레스를 받아왔었는데
10년묵은 체증이 해소되는 느낌입니다.
원인 뿐 아니라 저로선 생각해낼 수 없는 친절한 해결책까지 제시해주셔서 너무나 감사합니다.
많이 배우고 가며, 빌더님 복 받으시기 바랍니다~



빌더(TWx) 님이 쓰신 글 :
: 착한아이 님이 쓰신 글 :
: : 델파이 폼의 시작 이벤트 순서는 대략 아래와 같습니다.
: : 
: : OnCreate
: : OnShow
: : ...
: : OnActivate
: : 
: :
: : 
: : 
: : 그런데 컴포넌트를 추가하다보면 이 순서가 가끔 바뀝니다.
: : 
: : OnActivate
: : OnCreate
: : OnShow
: : 혹은
: : OnCreate
: : OnActivate
: : OnShow
: : 
: :
: : 
: : 첨부파일 예는 Frame에 CoolBar를 넣은 후,
: : ComboBox를 넣고 안 넣고에 따라 Form의 이벤트 순서가 바뀜을 보여줍니다.
: : 
: : 원인은 무엇이며 원래 순서를 유지하는 방법이 있는지 궁금합니다.
: : 감사합니다.
:
:
:
: 답변:
:
:
: Create, Activate, Show 이벤트는...
:
: OnCreate -> OnShow -> OnActivate 순서로 라우팅 되는 게 정상적인 순서임에도 불구하고
: 첨부되어 있는 소스코드 실행시 아래와 같이 순서가 바뀌는 것은 VCL 라이브러리가 엉터리로
: 만들어져 있어서 그래요.
:
: <문제점>
:
:
:
: TComboBox는 Edit 콘트롤과 List 콘트롤이 내부적으로 결합되어 있는 Composition 구조로 SubClassing 되어 있어요.
:
: 다시 말해서... 이 컴포넌트는 EditWndProc()와 ListWndProc() 로 서브클래싱 되어 있는 복수의 윈도우 핸들을 갖고있는
: Composition 구조의 컴포넌트 인데...
:
:
: TCoolBar 클래스에서 Band를 Update() 할 때... Band의 Child인...
:
: Composition 구조로 서브클래싱 되어 있는 TComboBox 로 부터 ActiveControl, FocusedControl을
: setup 하는 과정이... VCL 라이브러리가 엉터리로 만들어져 있어서 conflict 가 일어나고 있는 겁니다.
:
:
: VCL 라이브러리 수정하지 않고 해결 하려면...
:
: 간단하게 아래와 같이 Unit2.pas 소스에서...
: TComboBox.Focused() 메소드를 오버라이드 해서 처리하면 됍니다.
:
:
:
: unit Unit2;
: 
: interface
: 
: uses
:   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
:   Dialogs, StdCtrls, ToolWin, ComCtrls;
: 
: type
:   TComboBox = class(StdCtrls.TComboBox)
:     function Focused: Boolean; override;
:   end;
: 
:   TFrame2 = class(TFrame)
:     CoolBar1: TCoolBar;
:     ComboBox1: TComboBox;
:   private
:     { Private declarations }
:   public
:     { Public declarations }
:   end;
: 
: implementation
: 
: {$R *.dfm}
: 
: function TComboBox.Focused: Boolean;
: var
:   FocusedWnd: HWND;
: begin
:   Result := False;
:   if HandleAllocated then
:   begin
:     FocusedWnd := GetFocus;
:     if FocusedWnd = 0 then Exit;
:     Result := (FocusedWnd = FEditHandle) or (FocusedWnd = FListHandle) or (FocusedWnd = Handle);
:   end;
: end;
: 
: end.
: 

:
:
: 위와 같이 수정한 후에 실행하면...
: 다음과 같이 이벤트가 정상적으로 라우팅 되게 될 겁니다.
: rad 10.3.1 소스코드와 컴파일한 바이너리 첨부해서 올립니다.
:
: <해결후>
:
:
:
: VCL 라이브러리...
: 엉터리로 만들어져 있는 부분들 많아요. 아마추어가 만들어 놓은 것 처럼...
: IDE, 디버거도 마찬가지.
:

+ -

관련 글 리스트
16023 폼의 시작 이벤트 변경 원인 (소스포함) 착한아이 1353 2019/05/20
16024     Re: VCL 라이브러리가 엉터리로 만들어져 있어서 그래요 빌더(TWx) 1974 2019/05/20
16025         Re:Re: VCL 라이브러리가 엉터리로 만들어져 있어서 그래요 - 감사답변 착한아이 1683 2019/05/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.