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
[146] [팁] C++ Builder에서의 VCL의 Support
박지훈.임프 [cbuilder] 12243 읽음    2001-07-30 16:34
이 팁은 담비님(천리안 FREKBS)님이 1999년 04월 08일에 천리안 프로그래머포럼에 올리신 것입니다.
담비님으로부터는 전제하여 올리는 데 대해 허락을 받았습니다.
좋은 정보를 공유하도록 허락해주신 담비님께 감사드립니다.
───────────────────────────────────────

안녕하세요! 담비입니다.

출처 : http://www.inprise.co.jp/tips/cbuilder/cb005/index.html

C++ Builder에서 VCL을 서포트하기 위한 설명이다. 이문서에는 이용할 수 있는
내용이 많이 포함되어 있기 때문에, 적절한 코딩을 하기 위해 유용하게 사용해
주기 바란다.
이 문서는 확장된 예약어나 VCL에서 사용되는 데이타형에 함께 설명한다.

목차는 다음과 같다.
1. __property
2. __published
3. __ fastcall
4. VCL에서 이용되는 데이타형
    1) AnsiString Class
    2) TDateTime Class
    3) 집합형(Set Class)
    4) 개발배열 파라미터

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. __property
C++ Builder는, 컴포넌트를 이용한 비쥬얼 개발을 서포트하기 위해서, C++에 몇가지
확장 개념을 받아들이고 있다.
프로퍼티라고 말하는 개념은, C++ 에는 없는것이지만 C++ Builder에서는 새로운
예약어인 __property에의해 이것을 나타낸다. __property는 클래스 선언에서
다음과 같이 사용한다.
   class myClass (
   private:
       int FCount;
       void SetCount(int);
   public:
       myClass() {  FCount = 0; };
       __property int Count
           = { read = FCount, write=SetCount };
   };


이 단순한 클래스는, Count라는 프로퍼티를 가진다. 프로퍼티는 읽기 및 쓰기 처리를
별개로 정의할 수 있는 변수와 같은 것이다. 이 예에서는, Fcount라는 변수가,
Count 프로퍼티의 실체이지만, 쓰기는 SetCount라는 함수에 의해 값을 설정할 수
있다.
SetCount 같은 쓰기 함수는, 프로퍼티의 설정에 부작용을 줄 수 있다.
예로, Count 프로퍼티의 값을 0부터 100까지로 제한하고 싶은 경우는, SetCount
함수를 다음과 같이 기술한다.
   void myClass::SetCount(int Value)
   {
       if (Value < 0)
           FCount = 0;
       else if (Value > 100)
           FCount = 100;
       else
           FCount = Value;
   }

이 효과는, Windows 콘트롤을 캡슐화한 컴포넌트의 프로퍼티를 보면 알수있다.
예로, Edit 컴포넌트의 SelStart 프포퍼티는, 텍스트의 선택 부분의 시작 위치를
나타내지만, 이 프로퍼티를 참조했을 때에는, Windows API에 의해 콘트롤의 선택
부분을 취득하고, 그 시작 위치를 돌려준다. 반대로 SelStart에 값을 설정했을
때에는, 콘트롤의 선택 시작 위치를 설정한다. 이것들의 조작은, C++ Builder의
코딩에서는 단순한 대입에 의해 행할 수 있다.

2. __published
VCL이 강력한 이유는, 그것이 설계시의 동작까지도 서포트하고 있기 때문이라고
말할 수 있다. C++ Builder의 비쥬얼한 개발 환경은, VCL이 설계시의 동작을
서포트 하는것에 의해 성립되고 있다.
오브젝트 인스펙터에 의해 설정되는 프로퍼티는, 컴포넌트가 가지고 있는 모든
프로퍼티는 아니다. 컴포넌트든, private과 public라는 엑세스 지정자와 같이,
설계시에 엑세스를 허가하는 멤버를 가진다. 키워드 __published는, 설계시에
엑세스를 허가하는 멤버를 선언하기 위해서 이용하는 C++ Builder에 의해 확장된
새로운 예약어이다.
많은 프로퍼티는, __published로 선언되고 있다. 이것들의 프로퍼티는, 오브젝트
인스펙터에 의해 설계시에 값을 설정할 수 있다. 또, 폼의 멤버함수인 이벤트
핸들러는 __published로 선언되고, 오브젝트 인스펙터에 의해 인벤트에 설정할 수
있다.

3. __fastcall
C++ Builder의 컴포넌트는, __fastcall 호출규약을 이용한다. __fastcall 호출규약은
__cdecl이나 __pascal, 기존의 WIN32의 표준 호출규약인 __stdcall과 같이 함수가
호출하는 규약을 결정한다. __fastcall은, 인수를 레지스터로 전달한다. 함수의
최초의 3개의 인수는, 레지스터에 담겨질수있는 크기이면 (좌에서 우의 순서로)
EAX, EBX, EDX에 저장된다.
C++ Builder에서 이벤트 핸들러를 작성하려고 하면, 다음과 같은 형태가 생성된다.
   void __fastcall TForm1::Button1Click(TObject *Sender)
   {

   }


Button1의 OnClick 이벤트에 설정되는 이 이벤트 핸들러는, TForm1의 멤버함수이다.
이들 함수는, 모든 __fastcall 호출규약이어야 하고, 예에서와 같이 __fastcall이
반드시 설정되어야만 한다.
__fastcall 함수명의 앞에는, 컴파일러에 의해 "@" 기호가 프리픽스로 붙여진다.
이 프리픽스는 변형되지 않는 C의 함수명과 변형되는 C++ 의 함수명 모두에
붙여진다.

4. VCL에서 이용되는 데이타형
VCL은, ObjectPascal에 의해 작성되고 있고, 여기에서 사용되고 있는 데이타형중에서
몇가지는 C++ 에서 서포트 되고있지 않다.
C++ Builder에서는, 이들 데이타형을 클래스화 하여 사용하고 있다. 예로, 문자열
프로퍼티는 AnsiString 클래스의 데이타이다. 또, Font의 Style 프로퍼티는,
TFontStyles라는 집합형인 Set 클래스이다.
이들 데이타가 취급하는것은 사용된 클래스 고유의 것이 있고, 이들을 이해하는것도
C++ Builder의 프로그래밍 수법을 이해하는 일부라고 말할수 있다.

1) AnsiString Class
AnsiString 클래스는, 델파이의 긴 문자열인 AnsiString형에 해당하고, 자원이
허락한다면, 최대 약 2G문자의 문자열을 저장할 수 있다. AnsiString 클래스의
변수는 연산자를 이용해 대입, 결합, 추가등의 조작을 할 수 있다. 다음과 같은
문자열의 조작은 모두 가능하다.
   AnsiString s1 = "Borland", s2, s3;

   s2 = "C++Builder";
   s1 += " " + s2;
   s3 = s1 + " and Delphi";

또, 다른 데이타형을 문자열에 대입하는 것도 할 수 있다.
   AnsiString s1, s2;

   double x;
   s1 = 400;
   x = 27.365;
   s2 = x /2;

AnsiString 클래스에서는 비교 연산자도 이용할 수 있다. 사용할 수 있는 연산자는
==,!= >, <, >=, <=이다. 이것들은 strcmp 함수를 이용한 비교와 동일한 기능을
한다.
   if (s1 == s2)  //if (strcmp(s1, s2) == 0)와 같다
   if (s1!= s2)  //if (strcmp(s1, s2)!= 0)와 같다
   if (s1 > s2)   //if (strcmp(s1, s2) > 0)와 같다

AnsiString 클래스를 NULL로 끝나는 문자열형으로 변환하려면, c_str 함수를
이용한다. 이 함수를 이용하면, 표준 라이브러리나, Windows API의 문자열을
끊는 함수로, AnsiString 클래스의 변수를 사용할 수 있다.
   AnsiString s("Borland C++Builder");
   char buf[32];

   strcpy(buf, s.c_str());

c_str 함수는, AnsiString 클래스의 문자열 영역에대한 포인터를 돌려주는 함수이다.
AnsiString 클래스는, 문자열 영역을 동적으로 확보하기 때문에 c_str함수로 취득한
포인터를 사용해 직접 문자열을 변경하는것과 같은 처리에는 주의가 필요하다.
   AnsiString s;
   s.SetLength(20); //이 함수를 호출하지 않고 영역이
                    //확보되고 있지 않기 때문에 에러가 된다.
   sprintf(s.c_str(), "%20d", 500);

c_str 함수를 이용해 취득한 어드레스에 대한 대입은, 특정 상황에서만 안전하게
가능하다.

2) TDateTime Class
Borland C++ Builder에서는 날짜와 시각을 나타내는 형으로 TDateTime Class를
준비하고 있다. TDateTime 클래스는, 델파이의 TDateTime형에 해당한다.
TDateTime 클래스의 변수는 다음과 같이 선언할 수 있다.

TDateTime dt;

초기값을 할당하고자 할 경우에는 다음과 같이 할 수 있다.
   TDateTime dt1("1997/5/1");
   TDateTime dt2 = AnsiString("97/5/1 8:30");
   //TDateTime 끊는다.
   TDateTime dt3(Now());
   //서기로 년월일을 끊는다.
   TDateTime dt4(1997, 6, 3);
   //시분초와 밀리초로 끊는다.
   TDateTime dt5(12, 45, 20, 0);

비교 연산자도 사용할 수 있다. ==,!= >, >=, <, <=는 두 날짜의 시각을 비교한다.

3) 집합형(Set Class)
VCL 컴포넌트에서는 집합형의 프로퍼티를 사용하는 것이 있다. 집합형은
Object Pascal의 데이타형이다. Borland C++ Builder에서는 템플레이트 클래스로
해서 사용하고하고 있다. ObjectPascal에서는 다음과 같이 해서 집합형을 정의할
수 있었다.

Digits = set of 0..9;

Borland C++ Builder에서는 이것을 다음과 같이 정의한다.

Set Digits;

집합형에 요소를 추가하려면 << 연산자를, 요소를 제거하려면 >> 연산자를 이용한다.
    TFontStyles Style;
    Style << fsBold << fsItalic;
    Style >> fsBold;

모든 요소를 없애려면 Clear 함수를 사용한다.

Style.Clear();

두 집합형을 결합하거나, 그  차이를 취하거나 하는것도 할 수 있다.
   TFontStyles Style1, Style2, Style3;

   Style1 << fsBold << fsUnderline;
   Style2 << fsItalic << fsUnderline;
   //fsBold, fsItalic, fsUnderline이 설정된다.
   Style3 = Style1 + Style2;
   //fsBold, fsItalic이 설정된다.
   Style3 = Style1 -Style2;
   //fsUnderline이 설정된다.
   Style3 = Style1 * Style2;

이들 조작은 +=, -=, *=라는 단항연산자에 의해서도 사용할 수 있다.

Style2 += Style1;

비교 연산자는 ==, !=만을 사용할 수 있다. 모든 요소가 일치되는가의 비교는
의미를 가지지 않는다. 특정 요소가 포함되었는지를 조사하려면 Contains를
사용한다.

if (Style1.Contains(fsBold))...

집합형을 사용한 프로퍼티의 값을 변경할 때는 주의가 필요하다. 프로퍼티의 값을
설정하면, 내부적으로는 프로퍼티의 Write메소드(Set함수)가 불려진다. 예로,
Font->Style에 대입은, SetStyle함수를 호출하고, 결과의 표시상태에도 변경이
행해진다. 그 때문에, Set 클래스의 연산자는 프로퍼티에대한 대입 조작을 행하지
않는한 바르게 반영되지 않는다. 프로퍼티에 대한 설정은 다음과 같이 기술한다.

Label1->Font->Style = Label1->Font->Style << fsBold;

5) 개방 배열 파라미터
TTable의 FindKey나 Format함수 같이, 개방배열 파라미터를 지정하는 함수로는,
OPENARRAY 매크로나 EXISTINGARRAY, SLICE 매크로를 이용한다.
이들 파라메타는 TVarRec형의 데이타 배열로 나타진다.

   int day = 10;
   Label1->Caption = Format("%s %d %s"
   OPENARRAY(TVarRec, ("오늘은 ", day, "일입니다.")));

+ -

관련 글 리스트
146 [팁] C++ Builder에서의 VCL의 Support 박지훈.임프 12243 2001/07/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.