|
가장 좋은 방법은, ListBox 같은 것을 동적생성하여 그때마다 보여주는 것입니다. ComboBox가 Edit와 ListBox의 결합된 것으로 목적에 가장 잘 맞게 보이지만, ComboBox가 가지는 특성이나 기타 VCL이 공통적으로 가지는 특성으로 인해서 목적을 달성하시기에 불편한점이 없지 않습니다.
일단, List를 그때그때마다 갱신을 시켜야 하는데, 리스트를 갱신시킬때마다 ComboBox의 내용은 사라집니다. 그래서 아래의 소스를 사용하시면 일시적으로 커서가 깜빡이는 현상이 발생합니다. 또한, OnClick 이벤트는 리스트에서 아이템이 선택되었을때 발생하는데, 이때 클릭을 하게되면 0번 아이템만 남고 나머지는 전부 소멸됩니다. 그래서 타이밍이 틀리면 원하는 아이템을 뽑아올 수가 없는거죠.
아래는 ComboBox 만을 사용한 간단한 예제입니다.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TStringList *ALL_ITEM;
bool SELECTED_VALUE = false;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
int itCount;
ALL_ITEM = new TStringList;
// 전체 아이템 가상 생성
for(itCount = 0; itCount < 1000; itCount ++)
ALL_ITEM->Add(random(10000));
// 생성된 아이템을 리스트에 넣음
ComboBox1Change(ComboBox1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete ALL_ITEM;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
int itItemIndex = ComboBox1->ItemIndex,
itSelStart = ComboBox1->SelStart,
itIndex;
// 우선 전체 아이템을 넣고...
ComboBox1->Items->Assign(ALL_ITEM);
// 비교를 하여 입력된 글자와 맞는 것만 추려냄
itIndex = ComboBox1->Items->Count - 1;
while(itIndex >= 0) {
if(ComboBox1->Items->Strings[itIndex].SubString(1, ComboBox1->Text.Length()) != ComboBox1->Text)
ComboBox1->Items->Delete(itIndex);
itIndex --;
}
// OnClick에서 값이 추출되었으면 그 값으로 설정
// 이 루틴이 있어야 하는 이유는 Assign에서 모든 선택 정보가 사라지기 때문..
if(SELECTED_VALUE) {
ComboBox1->ItemIndex = 0;
SELECTED_VALUE = false;
}
// 커서의 위치를 원래의 위치로 복구. 이것 역시.. Assign 때문에..
ComboBox1->SelStart = itSelStart;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Click(TObject *Sender)
{
SELECTED_VALUE = true;
}
//---------------------------------------------------------------------------
이용주 님이 쓰신 글 :
: ComboBox에 어떤 명령어를 넣을적에 한글자만 치면 거기에 해당하는 관련명령어들이 리스트처럼 나오게 하는 방법에 대해서 알고 싶어서 글을 남깁니다. 고수님들의 많은 조언 부탁드립니다..
|