Вниз
Скачать: CL | DM;

ComboBox   Найти похожие ветки 

← →
Globoor   (2004-06-10 10:17) [0]

Уважаемые эксперты.
Дано: Delphi5; Combobox, в который занесены фамилии людей.
Каким образом реализуется алгоритм, когда пользователь с клавиатуры начинает вводить первые буквы фамилии и если эта фамилия, которая начинается с этих букв, имеется в списке Combobox, то она тут же появляется в поле ввода.


← →
Clickmaker ©   (2004-06-10 10:56) [1]

Дарю!

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.


← →
Ломброзо ©   (2004-06-10 11:04) [2]

CB_FINDSTRING шибко медленно работает, на .NET вообще просто умирает, ибо поиск осуществляется линейно, последовательно с нулевого элемента. Я бы рекомендовал чуток переделать алгоритм: список фамилий сперва сортировать, а потом искать нужную запись алгоритмом деления пополам.


← →
BFG9k   (2004-06-10 11:35) [3]

Хватит изобредать велосипед. Дано: Delphi7 - такой алгоритм в ComboBox там реализуется по умолчанию.


← →
Globoor   (2004-06-10 12:19) [4]

Благодарю всех, кто ответил.


← →
Globoor   (2004-06-10 12:34) [5]

2 Clickmaker
Очень изящно придумано.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.018 c
3-1086245573
din
2004-06-03 10:52
2004.06.27
Какая функция подсчитывает количество лет DateDiff не проходит


4-1085052879
ekap
2004-05-20 15:34
2004.06.27
Как выдернуть информацию из другой программы..?


1-1087285327
Timon
2004-06-15 11:42
2004.06.27
Уважаемые Мастера помогите в проблеме (GRID DBGRID)...........


1-1087231621
Mer
2004-06-14 20:47
2004.06.27
Таймер


1-1086939093
an-na2002
2004-06-11 11:31
2004.06.27
Проблема с греческими буквами




   Наверх