|
하안인 님이 쓰신 글 :
: 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 에 넣어 줍니다.
이와 같이 원하시는 방법대로 수정해 쓰시면 될듯합니다.
수고하세요!
|