![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ComboBox [D5]
Globoor © (2004-06-10 10:17:00)Уважаемые эксперты.
Дано: Delphi5; Combobox, в который занесены фамилии людей.
Каким образом реализуется алгоритм, когда пользователь с клавиатуры начинает вводить первые буквы фамилии и если эта фамилия, которая начинается с этих букв, имеется в списке Combobox, то она тут же появляется в поле ввода.
Globoor (2004-06-10 12:34:00) [1]2 Clickmaker
Очень изящно придумано.
Globoor (2004-06-10 12:19:00) [2]Благодарю всех, кто ответил.
BFG9k (2004-06-10 11:35:00) [3]Хватит изобредать велосипед. Дано: Delphi7 - такой алгоритм в ComboBox там реализуется по умолчанию.
Ломброзо (2004-06-10 11:04:00) [4]CB_FINDSTRING шибко медленно работает, на .NET вообще просто умирает, ибо поиск осуществляется линейно, последовательно с нулевого элемента. Я бы рекомендовал чуток переделать алгоритм: список фамилий сперва сортировать, а потом искать нужную запись алгоритмом деления пополам.
Clickmaker (2004-06-10 10:56:00) [5]Дарю!
unit ComboBoxInc;
interface
uses Windows, Messages, StdCtrls, Classes;
type
TComboBoxInc = class(TComboBox)
private
FTagString: string;
FIncSearch: boolean;
Findex: LongInt;
protected
FKeyPressEnter: TNotifyEvent;
procedure KeyUp(var Key: Word; Shift: TShiftState); override;
public
constructor Create(AOwner: TComponent); override;
published
property IncSearch: boolean read FIncSearch write FIncSearch default true;
property TagString: string read FTagString write FTagString;
property OnKeyPressEnter: TNotifyEvent read FKeyPressEnter write FKeyPressEnter;
end;
procedure Register;
implementation
procedure TComboBoxInc.KeyUp(var Key: Word; Shift: TShiftState);
var
start: integer;
begin
if (Key = 13) then begin
if Assigned(OnKeyPressEnter) then OnKeyPressEnter(Self);
end else begin
if FIncSearch then begin
start := SelStart;
Findex := SendMessage(Handle, CB_FINDSTRING, Findex-1, Integer(PChar(Text)));
if ((Findex <> -1) and not ((Key = VK_DELETE) or (Key = 8))) then
SendMessage(Handle, CB_SETCURSEL, Findex, 0);
if (Findex = -1) then Findex := 0;
SelStart := start;
SelLength := GetTextLen - start;
end;
inherited KeyUp(Key, Shift);
end;
end;
constructor TComboBoxInc.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FIncSearch := true;
FTagString := '';
Findex := 0;
end;
procedure Register;
begin
RegisterComponents('Samples', [TComboBoxInc]);
end;
end.