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
[14794] Re:Re:Re:Re:Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다.
이원용 [japgo] 4264 읽음    2013-10-07 12:17
네 TEmptyPanel, TTitle, TInputBox 가 동일한 컨트롤을 상속 받은게 맞습니다..
TControl
      |
TTotalControl
      |
      ---------------------------------
      |                            |                        |
TEmptyPanel             TTitle              TInputBox

이렇게 구현하였습니다..

제가 만든 방식으로 구현하셧는데 결과가 잘 나왔나요?
루도라님이 구현하셧을때 dfm 파일이 어떻게 나왔는지 궁금하네요..
스크린샷이라도 찍어서 올려주시면 더욱 감사하겠습니다..ㅠ

제가 올린 dfm 파일은 실수가 아니라 실제 구현하고 컴파일 하면 dfm 에 저렇게 쓰여집니다..

KPropertiesFrame 의 object 와 end 사이에 들어가야할 컨트롤 들이

전부 밖에 나와있어요...

그리고 Parent 와 TTop도 모든 컨트롤에서 동일하게 적용하였는데

inputBox만 나오고 나머지는 안 나오는 군요 ㅠㅠ



#include 
#ifndef TotalControlH
#define TotalControlH

//---------------------------------------------------------------------------
class TTotalControl : public TControl
{
private:
   TWinControl* FParent;

private:
    virtual void 	__fastcall SetTop(int Value);
	virtual void 	__fastcall SetParent(TWinControl* AParent);
    virtual void 	__fastcall OnClick(TObject* Sender);
    virtual int 	__fastcall FTop();

public:
    __fastcall TTotalControl(TComponent* Owner);

    virtual void 	__fastcall SetAbsoluteIndex(INT32 absoluteIndex);
    virtual void 	__fastcall SetPanelVisible(BOOL visible);

	virtual int 	__fastcall GetAbsoluteIndex();



__published:
    __property int			TTop	= {read=FTop, write=SetTop};
//	__property TWinControl* Parent 	= {read=FParent, write=SetParent};
};
#endif






TTotalControl 을 이렇게 구성하고

나머지 컨트롤들은 TTotalControl을 상속 받았습니다...

한번 더 알려주신다면 감사하겠습니다!!




루도라 님이 쓰신 글 :
: 제가 보기에도 코딩상으로 이상한게 보이진 않네요.
:
: TEmptyPanel, TTitle, TInputBox 가 TControl 을 상속 받았겠죠? _vectorControls 에서 동일한 처리를 하는걸로봐서는
: 세 컨트롤이 동일한 조상을 가진거 같은데 TControl -> ... -> TParentControl (동일한 조상) -> ... -> TEmptyPanel 형태로 구현하신거죠?
:
: 저도 '안되나?' 하고 구현해봤는데.. 잘되네요.
:
: dfm 결과가 좀 이상하긴 한데.. 옮기는 과정의 실수겠죠?
: * TInputBox 만 TTop 과 Parent 가 published 되어 있는거.. 같은 조상이면 저런식으로 구현하지 않았을거 같은데..
:
: 이원용 님이 쓰신 글 :
: : 우선 답변 달아주셔서 너무 감사 드립니다!
: :
: : 저는 C++로 작업하기에 C++소스로 올리는점 양해 부탁드립니다.ㅠ
: :
: : void TKPropertiesFrame::ItemChange(TTreeNodes* treeNodes)
: : {
: : 	_nodes = treeNodes;
: : 	INT32 nodesCount = _nodes->Count;
: : 
: : 	TEmptyPanel* ep; //빈 페널 1개 생성.
: : 
: :     //벡터 초기화 부분
: : 	INT count = this->ControlCount;
: : 	for(int i=0; iItem[i]->StateIndex == 0)
: : 		{
: : 			ep = new TEmptyPanel(this);
: : 			_vectorControls.push_back(ep); //빈 페널을 벡터에 넣음.
: : 
: : 		}
: : 		else if(_nodes->Item[i]->StateIndex == 1)
: : 		{
: : 			TTitle* title = new TTitle(this); //title 컨트롤 생성.
: : 			title->_propertiesFrame = this; // +, - 이미지 설정을 위해 클래스 넘겨줌.
: : 			title->SetText(_nodes->Item[i]->Text);
: : 
: : 			if(_nodes->Item[i]->HasChildren)
: : 			{
: : 				title->SetImgVisible(true);
: : 			}
: : 
: : 			_vectorControls.push_back(title); //title 컨트롤 벡터에 넣음.
: : 		}
: : 		else	//제목 외 나머지는 전부 input box
: : 		{
: : 
: : 			TInputBox* ib = new TInputBox(this); //inputbox 컨트롤 생성.
: : 			ib->_propertiesFrame = this;
: : 			ib->SetText(_nodes->Item[i]->Text);
: : 
: : 			if(_nodes->Item[i]->HasChildren)
: : 			{
: : 				ib->SetImgVisible(true);
: : 			}
: : 
: : 			ib->SetAbsoluteIndex(_nodes->Item[i]->AbsoluteIndex);
: : 			ib->SetStateIndex(_nodes->Item[i]->StateIndex);
: : 			
: : 			_vectorControls.push_back(ib); //inputbox 컨트롤 벡터에 넣음.
: : 		}
: : 	}
: : 
: :     //벡터에 저장된 컨트롤의 top 위치와 parent를 지정
: : 	for(int i=0; i<_vectorControls.size(); i++){
: : 		_vectorControls.at(i)->SetAbsoluteIndex(i);
: : 		_vectorControls.at(i)->TTop = ep->TTop; //컨트롤의 top을 지정하는 부분.
: : 	   	_vectorControls.at(i)->Parent = this; //컨트롤의 parent를 지정하는 부분.
: : 	}
: : 
: : }
: : 

: :
: : 이렇게 코딩하고 실행 결과
: :
: :
: : object Form1: TForm1
: :   Left = 0
: :   Top = 0
: :   Caption = 'Form1'
: :   ClientHeight = 300
: :   ClientWidth = 635
: :   Color = clBtnFace
: :   Font.Charset = DEFAULT_CHARSET
: :   Font.Color = clWindowText
: :   Font.Height = -11
: :   Font.Name = 'Tahoma'
: :   Font.Style = []
: :   OldCreateOrder = False
: :   PixelsPerInch = 96
: :   TextHeight = 13
: :   object KPropertiesFrame1: TKPropertiesFrame
: :     Left = 248
: :     Top = 80
: :     Width = 330
: :     Height = 249
: :     TabOrder = 0
: :     TabStop = True
: :   end
: :   object TEmptyPanel
: :     Left = 0
: :     Top = 0
: :     Width = 0
: :     Height = 0
: :     TTop = 378568736
: :   end
: :   object TTitle
: :     Left = 0
: :     Top = 0
: :     Width = 0
: :     Height = 0
: :     TTop = 378562912
: :   end
: :   object TInputBox
: :     Left = 0
: :     Top = 0
: :     Width = 0
: :     Height = 0
: :     TTop = 34719216
: :     Parent = KPropertiesFrame1
: :   end
: : end
: : 

: :
: : top의 숫자는 뭐 생관 없습니다.. 중요한건 parent 지정을 모두 하였음에도 inputbox만 parent지정이 됩니다..
: :
: : 또한 parent 지정이 되어있으나 frame 안으로 들어가지 않고 form에 위치하는 것을 볼수가 있습니다...
: :
: : 코딩 상으로는 맞게 한것 같은데 어디가 문제인지 ㅠㅠ 조언 부탁드립니다..
: :
: : ///////////////////////////////////////////////////////////////////////////////////////////////////
: :
: : 루도라 님이 쓰신 글 :
: : : TKPropertiesFrame 가 TWinControl 이라면 TEmptyPanel 의 Parent 를 TKPropertiesFrame 로 주면 될겁니다.
: : :
: : : Control := T...Control.Create(Component.Owner);
: : : Control.Name := Component.Name + 'Control';
: : : Control.Parent := Component as TWinControl;
: : :
: : : 이름만 봐서는 Frame 을 상속받은 컨트롤일거 같은데 그러면 TWinControl 이 맞겠지만 TWinControl 이 아닐 경우에는 아무래도 꼼수(?)가 필요할거 같네요. 컬렉션을 사용한다던지..
: : :
: : : ps. 아.. TabOrder 프로퍼티가 있는걸로봐서 TWinControl 이군요. ㅎㅎ
: : :
: : : 이원용 님이 쓰신 글 :
: : : : 컨트롤을 생성할때 컨트롤의 Owner을 Control을 생성하는 컴포넌트의 Owner로 지정하였더니
: : : :
: : : :
: : : : object Form1: TForm1
: : : :   Left = 0
: : : :   Top = 0
: : : :   Caption = 'Form1'
: : : :   ClientHeight = 300
: : : :   ClientWidth = 635
: : : :   Color = clBtnFace
: : : :   Font.Charset = DEFAULT_CHARSET
: : : :   Font.Color = clWindowText
: : : :   Font.Height = -11
: : : :   Font.Name = 'Tahoma'
: : : :   Font.Style = []
: : : :   OldCreateOrder = False
: : : :   PixelsPerInch = 96
: : : :   TextHeight = 13
: : : :   object KPropertiesFrame1: TKPropertiesFrame
: : : :     Left = 344
: : : :     Top = 128
: : : :     Width = 330
: : : :     Height = 249
: : : :     TabOrder = 0
: : : :     TabStop = True
: : : :     ExplicitLeft = 344
: : : :     ExplicitTop = 128
: : : :   end
: : : :   object TEmptyPanel
: : : :     Left = 0
: : : :     Top = 0
: : : :     Width = 0
: : : :     Height = 0
: : : :     TTop = 172950576
: : : :   end
: : : : end
: : : : 

: : : :
: : : : 이렇게 나오네요...제가 원하는 것은 KPropertiesFrame1 안에 TEmptyPanel 이 들어가게 하고 싶은데
: : : : Owner가 Form1 을 가르키다 보니 저렇게 나오는것 같습니다...
: : : :
: : : : 프레임 안에서 동적으로 컨트롤을 생성하더라도 우리가 디자인 타임에서 끌어다 놓듯이 화면에도 보여지고
: : : :
: : : : dfm 파일에도 정상적으로 들어가게 하고 싶습니다!!
: : : :
: : : : 아무래도 디자인 타임에서 컨트롤을 끌어다 놓을때 발생하는 함수들을 오버로딩하여 동적으로 컨트롤을 생성할때
: : : :
: : : : 실행 하게끔 해주어야 할거 같은데..이부분에서 막막합니다... 어떠한 함수들이 불려지는지 알 수 있는 지요..
: : : :
: : : : 아니면 알 수 있는 방법이라도 알려주시면 감사하겠습니다.!
: : : :
: : : :
: : : :
: : : : 루도라 님이 쓰신 글 :
: : : : : 새로 생성되어지는 Control 의 Owner 를 Control 을 생성하는 컴포넌트의 Owner 로 지정해보세요.
: : : : :
: : : : : procedure TComponentEdit.DoCreateControl;
: : : : : begin
: : : : :   Control := T...Control.Create(Component.Owner);
: : : : :   Control.Name := Component.Name + 'Control';
: : : : : end;
: : : : :
: : : : : 화면에 나타난다고 하신거 보면 Parent 지정 같은건 제대로 하신거 같은데..
: : : : :
: : : : : 이원용 님이 쓰신 글 :
: : : : : : 컴포넌트를 한개 만들었습니다.
: : : : : :
: : : : : : 이 컴포넌트는 컴포넌트 에디터를 가지고 있으며
: : : : : :
: : : : : : 에디터에서 버튼을 누르면 컴포넌트 자체에서 동적으로 control을 생성하며
: : : : : :
: : : : : : 디자인 화면에서 보여지게 되어있습니다.
: : : : : :
: : : : : : 그러나 여기서 동적으로 생성된 control은 사용자에게 보여지기는 하나
: : : : : :
: : : : : : 빌드 후 실행시 실제 프로그램 상에서는 나타나지 않습니다.
: : : : : :
: : : : : : 왜냐하면 dfm text에는 적용 되지 않기 때문입니다.
: : : : : :
: : : : : : 저는 동적으로 생성된 control이 dfm text 파일에 적용되는 방법을 알고 싶습니다....
: : : : : :
: : : : : : 툴 팔레트에서 컨트롤을 끌어다 놓을때 발생하는 함수가 무엇인지 궁금합니다.
: : : : : :
: : : : : : readState 와 createComponent 함수가지는 알아 냈으나 그다음에 실행되는 함수들이 무엇인지 궁금합니다..
: : : : : :
: : : : : : 생성된 컨트롤을 dfm text에 나오게 하는 함수를 알려주시면 감사하겠습니다...
: : : : : :
: : : : : : 부탁드립니다 ㅠㅠ

+ -

관련 글 리스트
14769 [질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 이원용 4682 2013/09/16
14788     Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 루도라 4729 2013/10/01
14790         Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 이원용 5485 2013/10/02
14791             Re:Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 루도라 5076 2013/10/04
14792                 Re:Re:Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 이원용 4533 2013/10/04
14793                     Re:Re:Re:Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 루도라 4344 2013/10/07
14794                         Re:Re:Re:Re:Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 이원용 4264 2013/10/07
14795                             Re:Re:Re:Re:Re:Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 루도라 4624 2013/10/07
(링크)     C++Builder Q/A > Re:Re:Re:Re:Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다.
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.