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
}
ComboBox и автовыбор необходимого
Вообщем в комбобоксе есть список слов.. Так вот, необходимо когда пользователь вводит букву, автоматически добавлялось слово, продолжающее эту букву (что-то вроде T9) Как это сделать?
ComboBox сам все дополняет.
Цитата: DissDoc
Вообщем в комбобоксе есть список слов.. Так вот, необходимо когда пользователь вводит букву, автоматически добавлялось слово, продолжающее эту букву (что-то вроде T9) Как это сделать?
Вот кусок кода, только для Edit-a. Здесь FAutoList это указатель на объект типа TStringList, для комбобокса - заменишь его на св-во Items и процедуру оконную надо подменить у комбика на эту, вообщем разберешся.
Код:
Положил-бы весь в исходники, но сырой он пока...
Update.
Блин! Вот я затупил. Тут просто ввод с клавиатуры отлавливается. А я че-то искал совсем не тут. Мне даже код не пригодился.
Не изобретайте велосипед ;)
ComboBox1->AutoComplete = true;
Как раз то, что человек хотел
Цитата: el scorpio
Gizmo
Не изобретайте велосипед ;)
ComboBox1->AutoComplete = true;
Как раз то, что человек хотел
Не изобретайте велосипед ;)
ComboBox1->AutoComplete = true;
Как раз то, что человек хотел
А если у него (как и у меня) Билдер версии 5? Где он возьмет св-во AutoComplete?
Не, у меня 6-ой билдер =))) И AutoComplete лишь упрощает мою жизнь. =)