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

C++빌더 Q&A
C++Builder Programming Q&A
[70213] Re:Re:Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다.
이원용 [] 4534 읽음    2013-10-04 16:02
우선 답변 달아주셔서 너무 감사 드립니다!

저는 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에 나오게 하는 함수를 알려주시면 감사하겠습니다...
: : : :
: : : : 부탁드립니다 ㅠㅠ

+ -

관련 글 리스트
70126 [질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 이원용 4684 2013/09/16
70190     Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 루도라 4730 2013/10/01
70206         Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 이원용 5487 2013/10/02
70207             Re:Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 루도라 5078 2013/10/04
70213                 Re:Re:Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 이원용 4534 2013/10/04
70218                     Re:Re:Re:Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 루도라 4345 2013/10/07
70224                         Re:Re:Re:Re:Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 이원용 4266 2013/10/07
70228                             Re:Re:Re:Re:Re:Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다. 루도라 4626 2013/10/07
(링크)     Delphi Q/A > Re:Re:Re:Re:[질문]동적으로 생성한 control 을 dfm 에 추가시키는 방법이 궁금합니다.
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.