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
[40235] Re:[질문]VritualTreeView의 콤보박스처리시..
볼레롱 [bolero] 1045 읽음    2005-05-20 10:21
하안인 님이 쓰신 글 :
: VirtualTreeView에서 에디트나 콤보박스 처리를 할때
: 에디트 박스는
:                GetWindowText(FEdit->Handle, Buffer, 1024);
:                 S = Buffer;
:                 if (S != FData->Value[FColumn])
:                 {
:                     FData->Value[FColumn] = S;
:                     FData->Changed[FColumn] = true;
:                     FTree->InvalidateNode(FData->Node);
:                 }
:
:       위와 같이 해서 변경되는 값을 적용했는데..
:   콤보박스는 위와 같이 하면 데이타가 아무것도 들어가지 않고 셀자체가 ptNone형태로
: 바뀌는 것 같습니다.
: ItemIndex가지고 해야 된다고 하는데 어떻게 구현을 해야 하는지요...
:
: << 조금만 더하면 프로램에서 써 먹을수 있을 것 같은데... 만만하지는 않네요 >>
:
: 즐거운 하루 되세요..


안녕하세요. 

우선 시간이 안되어서 실제로 실행은 못 해보구요.
소스만 보고 답변 드립니다.

기존의 샘플 소스 보니가 변경한 값이  적용이 안되더군요.
음, 안되는 것은  고쳐 쓰라는 이야기인 듯 하네요 ^^

아무튼,

콤보박스의 경우,   데이타를 넣는 방식이

Value = "on|off"
또는
Value = "노랑|파랑|빨강|주황"

이런식으로 넣고,

데이타를 출력하는 GetText 에서 보면,

void __fastcall TPropertyEditorForm::TreeGetText(TBaseVirtualTree *Sender, PVirtualNode Node, TColumnIndex Column, TVSTTextType TextType, WideString &CellText) {   
   if (!Node) return;                                                //  only for safety the program !
   TPropertyData* Data = (TPropertyData*)Sender->GetNodeData(Node);  int Pos;
   if (Data) {
       switch (Column) {
           case 0:  CellText = "";  break;
           case 1:  CellText = Data->Comment;  break;
           case 2:  switch (Data->PropertyTyp) {
                        case ptNone:      CellText = Data->Value;  break;
                        case ptEdit:      CellText = Data->Value;  break;
                        case ptCombo:     Pos = Data->Value.Pos("|");  CellText = Data->Value.SubString(1, Pos-1);  break;
                    }
               break;
       }
   }
}


Pos = Data->Value.Pos("|"); 
CellText = Data->Value.SubString(1, Pos-1);

이렇게 해서  첫번째 값을   VitrualStringTree 에서 출력하고 있네요.

그리고,  편집에 들어가면, (콤보박스 띄울때)

bool __stdcall TPropertyEdit::PrepareEdit(TBaseVirtualTree* Tree, PVirtualNode Node, TColumnIndex Column) {
     ... 중략....

        case ptCombo:   ((TComboBox*)FEdit)->Visible = false;
                       Strg = FData->Value;
                       while (Strg != "") {
                           iP = Strg.Pos("|");
                           if (iP == 0) iP = Strg.Length()+1;
                              ((TComboBox*)FEdit)->Items->Add(Strg.SubString(1, iP-1));
                           Strg = Strg.Delete(1, iP);
                       }
                       ((TComboBox*)FEdit)->ItemIndex = 0;
                       ((TComboBox*)FEdit)->Style = Stdctrls::csDropDownList;
                        ((TComboBox*)FEdit)->OnKeyDown = &EditKeyDown;
                       Result = true;
     ... 중략....


구분자 (|) 를 이용해서  콤보박스를 출력하고,  첫번째 것을  선택하게 하고 있습니다.


그리고 편집이 완료 되었을때,

bool __stdcall TPropertyEdit::EndEdit(void) {
     ... 중략....

  case ptCombo:   /* must in Orginal the code working with ItemIndex */
                           FData->Changed = (((TComboBox*)FEdit)->ItemIndex != 0);
     ... 중략....

변경만 있었다고 기록할 수  선택한 것에대한 처리가 없더군요 ㅡ.ㅡ


이것을 수정하는 방법은 여러가지가 있을 듯 합니다만,  2가지정도만 이야기 해 보겠습니다.


1.  데이타값의 첫번째에  선택한 것을 넣도록  데이타를 다시 넣어줌.

즉,
bool __stdcall TPropertyEdit::EndEdit(void) {
     ... 중략....

  case ptCombo:   /* must in Orginal the code working with ItemIndex */
                           FData->Changed = (((TComboBox*)FEdit)->ItemIndex != 0);

이 부분에서 ,  데이타를 다시 배치 합니다.
만약 ,  처음 값이

                  Value = "노랑|파랑|빨강|주황"

이것 이었다고 하고,  빨강을 선택한 경우 ,


                  Value = "빨강|노랑|파랑|주황"

이렇게 바뀌도록 프로그래밍을 해 줍니다.

2.  데이타에  콤보박스의 선택 index 역할을 하는 변수를 추가하고,
    출력시에 이 index에 따라서  데이타를 출력합니다.

구조체 선언에,  Value 와 함께,  selectedindex 식으로  변수 추가하고,

void __fastcall TPropertyEditorForm::TreeGetText(TBaseVirtualTree *Sender, PVirtualNode Node, TColumnIndex Column, TVSTTextType TextType, WideString &CellText) {   
   if (!Node) return;                                                //  only for safety the program !
   TPropertyData* Data = (TPropertyData*)Sender->GetNodeData(Node);  int Pos;
   if (Data) {
       switch (Column) {
           case 0:  CellText = "";  break;
           case 1:  CellText = Data->Comment;  break;
           case 2:  switch (Data->PropertyTyp) {
                        case ptNone:      CellText = Data->Value;  break;
                        case ptEdit:      CellText = Data->Value;  break;
                        case ptCombo:     Pos = Data->Value.Pos("|");  CellText = Data->Value.SubString(1, Pos-1);  break;
                    }
               break;
       }
   }
}

이 부분에서 무조건 처음 거이 아닌,  selectedindex  가 가르치는 것을 출력하도록 수정합니다.

그리고, EndEdit 에서는  선택된 ItemIndex 를  selectedindex   에 넣어 줍니다.


이와 같이 원하시는 방법대로 수정해 쓰시면 될듯합니다.

수고하세요!

+ -

관련 글 리스트
40227 [질문]VritualTreeView의 콤보박스처리시.. 하안인 768 2005/05/19
40235     Re:[질문]VritualTreeView의 콤보박스처리시.. 볼레롱 1045 2005/05/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.