Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ComboBox и автовыбор необходимого

249
13 марта 2007 года
DissDoc
639 / / 01.10.2004
Вообщем в комбобоксе есть список слов.. Так вот, необходимо когда пользователь вводит букву, автоматически добавлялось слово, продолжающее эту букву (что-то вроде T9) Как это сделать?
497
13 марта 2007 года
IL84
267 / / 24.04.2003
ComboBox сам все дополняет.
246
13 марта 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: DissDoc
Вообщем в комбобоксе есть список слов.. Так вот, необходимо когда пользователь вводит букву, автоматически добавлялось слово, продолжающее эту букву (что-то вроде T9) Как это сделать?


Вот кусок кода, только для Edit-a. Здесь FAutoList это указатель на объект типа TStringList, для комбобокса - заменишь его на св-во Items и процедуру оконную надо подменить у комбика на эту, вообщем разберешся.

Код:
class TEdAutoComplete
{
private:
    TEdit*        FEdit;
    TStringList* FAutoList;
    String         FFile;

    void __fastcall NewEditProc(TMessage& Message);
    TWndMethod   OldEditProc;
    ...
   
public:
    void __fastcall Attach(TEdit* AEdit);
    void __fastcall Detach();
public:
    __fastcall TEdAutoComplete();
    __fastcall ~TEdAutoComplete();
...
};

__fastcall TEdAutoComplete::TEdAutoComplete()
{
    FAutoList = new TStringList();
    FAutoList->Capacity = 30;
    FEdit = NULL;
    FFile = "";
    ...
}
//---------------------------------------------------------------------------
__fastcall TEdAutoComplete::~TEdAutoComplete()
{
    Detach();
    delete FAutoList;
    ...
}
//---------------------------------------------------------------------------
void __fastcall TEdAutoComplete::Attach(TEdit* AEdit)
{
    //TODO: Add your source code here
    if(FEdit) Detach();

    if(AEdit)
    {
        FEdit = AEdit;
        OldEditProc = FEdit->WindowProc;
        FEdit->WindowProc = NewEditProc;
    }
}
//---------------------------------------------------------------------------
void __fastcall TEdAutoComplete::Detach()
{
    //TODO: Add your source code here
    if(FEdit)
    {
        FEdit->WindowProc = OldEditProc;
       
        FEdit = NULL;
        if(FFile == "") return;
        if(FileExists(FFile))
            FAutoList->SaveToFile(FFile);
        else
        {
            FileClose(FileCreate(FFile)); //simple create file
            FAutoList->SaveToFile(FFile);
        }
    }
}

void __fastcall TEdAutoComplete::NewEditProc(TMessage& Message)
{

    if(Message.Msg == WM_CHAR) // if WM_CHAR...
    {
        char Key = Message.WParam;

        if(Key == VK_RETURN)
        {
            if(FEdit->Text.Length())
            {
                int indx = FAutoList->IndexOf(FEdit->Text);
                if(indx == -1) // no exists, insert
                    FAutoList->Insert(0, FEdit->Text);
                else           // exists, move top
                    FAutoList->Move(indx, 0);
            }

            OldEditProc(Message);
            return;
        }
        else
        {
            AnsiString TmpStr;
            bool BackSpace = (Key == (char)VK_BACK);
            if (BackSpace && FEdit->SelLength) // Pressed BackSpace and SelLength != 0
                TmpStr = FEdit->Text.SubString(1,FEdit->SelStart)+
                    FEdit->Text.SubString(FEdit->SelLength+FEdit->SelStart+1, 255);
            else if (BackSpace) // Pressed BackSpace and SelLength == 0
                TmpStr = FEdit->Text.SubString(1,FEdit->SelStart-1)+
                    FEdit->Text.SubString(FEdit->SelStart+1,255);
            else //Key is a visible character
                TmpStr = FEdit->Text.SubString(1,FEdit->SelStart)+ Key +
                    FEdit->Text.SubString(FEdit->SelLength+FEdit->SelStart+1,255);

            if (TmpStr.IsEmpty())
            {
                OldEditProc(Message);
                return;
            }
            // set SelSt to the current insertion point
            int SelSt = FEdit->SelStart;

            if (BackSpace && SelSt > 0)
                SelSt--;
            else if (!BackSpace)
                SelSt++;

            if (SelSt == 0) {
                FEdit->Text = "";
                OldEditProc(Message);
                return;
            }

            bool Found = false;
            for (int i = 0; i < FAutoList->Count; i++)
                if (TmpStr == FAutoList->Strings.SubString(1, TmpStr.Length()))
                {
                    FEdit->Text = FAutoList->Strings; // update to the match that was found
                    Found = true;
                    break;
                }

            if (Found)
            {
                Message.Result = 0; // processed ...
                FEdit->SelStart = SelSt;
                FEdit->SelLength = FEdit->Text.Length()-SelSt;
                return;
            }
        }//else
    }

    OldEditProc(Message);  //other message
}

Положил-бы весь в исходники, но сырой он пока...
249
13 марта 2007 года
DissDoc
639 / / 01.10.2004
Да сейчас смотрю на код. Вроде вопросов не должно больше возникнуть ;) Спасибо за помощь, Гизмо =)
Update.
Блин! Вот я затупил. Тут просто ввод с клавиатуры отлавливается. А я че-то искал совсем не тут. Мне даже код не пригодился.
309
14 марта 2007 года
el scorpio
1.1K / / 19.09.2006
Gizmo
Не изобретайте велосипед ;)
ComboBox1->AutoComplete = true;
Как раз то, что человек хотел
246
14 марта 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: el scorpio
Gizmo
Не изобретайте велосипед ;)
ComboBox1->AutoComplete = true;
Как раз то, что человек хотел



А если у него (как и у меня) Билдер версии 5? Где он возьмет св-во AutoComplete?

249
14 марта 2007 года
DissDoc
639 / / 01.10.2004
Не, у меня 6-ой билдер =))) И AutoComplete лишь упрощает мою жизнь. =)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог