RAD Studio VCL Reference
|
Specifies the position of the first selected character in the edit portion of the combo box.
property SelStart: Integer;
__property int SelStart;
Read SelStart to determine where the selection starts in the Text property. The first character is designated with 0, the second with 1, and so on. When SelLength is 0, SelStart is the position of the cursor.
Set SelStart to position the cursor in the edit region of the combo box. Setting SelStart to 0 positions the cursor before the first character, setting SelStart to 1 positions the cursor before the second character, and so on.
C++ Examples:
/* The following example shows how to complete partial strings typed into a combo box. The code represents the OnKeyPress event handler of the combo box, which performs most of the default keystroke handling before finding a matching list item and updating the text. Note: This OnKeyPress event handler does not deal with the case when the user types the Delete key. That case must be caught in the OnKeyDown event handler instead. */ void __fastcall TForm1::ComboBox1KeyPress(TObject *Sender, char &Key) { // first, process the keystroke to obtain the current string // This code requires all items in list to be uppercase if (Key >= 'a' && Key <= 'z') Key -= 32; // Force Uppercase only! TComboBox *pCB = dynamic_cast<TComboBox *>(Sender); AnsiString TmpStr; bool BackSpace = (Key == (char)VK_BACK); if (BackSpace && pCB->SelLength) TmpStr = pCB->Text.SubString(1,pCB->SelStart)+ pCB->Text.SubString(pCB->SelLength+pCB->SelStart+1,255); else if (BackSpace) // SelLength == 0 TmpStr = pCB->Text.SubString(1,pCB->SelStart-1)+ pCB->Text.SubString(pCB->SelStart+1,255); else //Key is a visible character TmpStr = pCB->Text.SubString(1,pCB->SelStart)+ Key + pCB->Text.SubString(pCB->SelLength+pCB->SelStart+1,255); if (TmpStr.IsEmpty()) return; // set SelSt to the current insertion point int SelSt = pCB->SelStart; if (BackSpace && SelSt > 0) SelSt--; else if (!BackSpace) SelSt++; Key = 0; // indicate that key was handled if (SelSt == 0) { pCB->Text = ""; return; } // Now that TmpStr is the currently typed string, see if we can locate a match bool Found = false; for (int i = 1; i < pCB->Items->Count; i++) if (TmpStr == pCB->Items->Strings[i-1].SubString(1,TmpStr.Length())) { pCB->Text = pCB->Items->Strings[i-1]; // update to the match that was found pCB->ItemIndex = i-1; Found = true; break; } if (Found) // select the untyped end of the string { pCB->SelStart = SelSt; pCB->SelLength = pCB->Text.Length() - SelSt; } else Beep(); } TStringList *CharSetList; void __fastcall TForm1::AddCharacterSet(String S) { CharSetList->Add(S); } #include <memory> //for STL auto_ptr class void __fastcall TForm1::FormCreate(TObject *Sender) { static std::auto_ptr<TStringList> _CharSetListCleaner(CharSetList = new TStringList); GetCharsetValues(AddCharacterSet); CharSetList->Sort(); ComboBox1->Items = CharSetList; }
Delphi Examples:
{ The following example shows how to complete partial strings typed into a combo box. The code represents the OnKeyPress event handler of the combo box, which performs most of the default keystroke handling before finding a matching list item and updating the text. Note: This OnKeyPress event handler does not deal with the case when the user types the Delete key. That case must be caught in the OnKeyDown event handler instead. Note: Set the TComboBox AutoComplete to false to turn off default auto completion. } procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char); var Found: boolean; i, ct, SelSt: Integer; TmpStr: string; begin { first, process the keystroke to obtain the current string } { This code requires all items in list to be uppercase} if Key in ['a'..'z'] then Dec(Key,32); {Force Uppercase only!} ct := (Sender as TComboBox).Items.Count; with (Sender as TComboBox) do begin SelSt := SelStart; if (Key = Chr(vk_Back)) and (SelLength <> 0) then TmpStr := Copy(Text, 1, SelStart) + Copy(Text, SelLength + SelStart + 1, 255) else if Key = Chr(vk_Back) then {SelLength = 0} TmpStr := Copy(Text, 1, SelStart-1) + Copy(Text, SelStart + 1,255) else {Key in ['A'..'Z', etc]} TmpStr := Copy(Text, 1, SelStart) + Key + Copy(Text, SelLength + SelStart + 1, 255); if TmpStr = '' then Exit; { update SelSt to the current insertion point } if (Key = Chr(vk_Back)) and (SelSt > 0) then Dec(SelSt) else if Key <> Chr(vk_Back) then Inc(SelSt); Key := #0; { indicate that key was handled } if SelSt = 0 then begin Text:= ''; Exit; end; {Now that TmpStr is the currently typed string, see if we can locate a match } Found := False; for i := 1 to ct do begin if Copy(Items[i - 1], 1, Length(TmpStr)) = TmpStr then begin Text := Items[i-1]; { update to the match that was found } ItemIndex := i-1; Found := True; Break; end; end; if Found then { select the untyped end of the string } begin SelStart := SelSt; SelLength := Length(Text) - SelSt; end else Beep; end; end; var CharSetList : TStringList; procedure TForm1.AddCharacterSet(const S: string); begin CharSetList.Add(S); end; procedure TForm1.FormCreate(Sender: TObject); begin CharSetList := TStringList.Create; Graphics.GetCharsetValues(AddCharacterSet); ComboBox1.Items := CharSetList; end;
Copyright(C) 2009 Embarcadero Technologies, Inc. All Rights Reserved.
|
What do you think about this topic? Send feedback!
|