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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[309] 동일한 컴포넌트가 하나의 폼안에 여러개 존재할 때... 일일이 지시하기 귀찮을 때
하느리 [handebug] 8448 읽음    2002-01-21 13:59
동일한 컴포넌트가 하나의 폼 안에 여러개 존재하고, 일일이 이 컴포넌트를 지시하기가 귀찮을 때가 있을 것입니다. 이 때, 이를 반복문을 통하여 일괄처리하도록 하는 방법이 있습니다.
가령, TEdit 컴포넌트가 한 폼안에 20개 아니, 100개 넘고, 동일한 처리를 하여 주어야 할 때, 이걸 일일이 기술하여 주는 것은 정말 귀찮아 집니다. 이때 아래 방법으로 해 보세요.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

방법은 모든 컴포넌트에는 Tag라는 속성(일반적으로 사용하지 않는 속성)이 있습니다. 이를 이용하는 것이죠. 우선 일괄처리할 컴포넌트의 Tag에 내가 원하는 숫자를 일렬로 넣습니다. 즉, 100, 101, 102,... 119 이런 식으로요. 그리고, 폼에 하나의 함수를 추가합니다.
void* __fastcall TForm1::ComponentPtr (char *CName, long tag)
{
  	for ( int i = 0; i < ComponentCount; i ++ )
    {
     	if ( Components [i]->ClassNameIs (CName) && (Components [i]->Tag == tag ) )
        	return	(void *)Components [i];
    }
  	for ( int i = 0; i < ComponentCount; i ++ )
    {
     	if ( Components [i]->ClassNameIs (CName) )
        	return	(void *)Components [i];
    }
  	return (void *)0;  //  meanless
}

당연히 헤더에도 이 함수를 추가해 줍니다.
class TForm1 : public TForm
{
.
.
private:	// User declarations
    void* __fastcall ComponentPtr (char *CName, long tag);  // components inner array
.
.
}


마지막으로 매크로를 해더에 포함시킵니다.
#define ALED(ord)           ((TALed*)ComponentPtr("TALed", ord))
#define BUTTON(ord)         ((TButton*)ComponentPtr("TButton", ord))
#define BITBTN(ord)         ((TBitBtn*)ComponentPtr("TBitBtn", ord))
#define SPINBUTTON(ord)     ((TCSpinButton*)ComponentPtr("TCSpinButton", ord))
#define RADIOBUTTON(ord)    ((TRadioButton*)ComponentPtr("TRadioButton", ord))
#define CHECKBOX(ord)       ((TCheckBox*)ComponentPtr("TCheckBox", ord))
#define EDIT(ord)           ((TEdit*)ComponentPtr("TEdit", ord))
#define ADVSTR(ord)         ((TAdvStringGrid*)ComponentPtr("TAdvStringGrid", ord))
#define TRACKBAR(ord)       ((TTrackBar*)ComponentPtr("TTrackBar", ord))


이제부터 해당 컴포넌트가 동일한 작업을 해야 한다면 매크로를 사용하여 처리하면 됩니다.
아래와 같이....
for ( short i = 0; i < 20; i++ )
{
    EDIT (100+i)->Text = "";  // () 안에 들어가는 것은 Tag에서 설정한 그 값입니다.
}

만약에 다른 컴포넌트를 이런 식으로 사용해야 하면, 매크로만 더 추가하면 됩니다.
여기에서 보실 것은 Tag를 이용하여 각각의 컴포넌트를 지시할 수 있다는 것. Tag가 숫자라는 것
따라서 무궁무진하게 이용할 수 있습니다.

예를 한가지 더 들면, TEdit Component Object가 10개 있고, 이를 vertical로 30 간격으로 배열해야 한다면,
for ( short i = 0; i < 10; i++ )
{
    EDIT (100+i)->Top = 30*i;
}
미루 [sxdotori]   2004-03-31 10:03 X
전 이렇게 씁니다..

Label1 ..2..3..10...이름을 일련 번호로 주고....

#define AAA(IDX, DATA) {\
    Label##IDX->Tag= DATA;\
}

AAA(1,1);
AAA(2,5);
...
AAA(10,45);
대신 이건 포 루프는 못돌리지만 코드는 간단...
보기 편함....

+ -

관련 글 리스트
309 동일한 컴포넌트가 하나의 폼안에 여러개 존재할 때... 일일이 지시하기 귀찮을 때 하느리 8448 2002/01/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.