Edit с возможностью автоматического выбора

=== Edit с возможностью автоматического выбора ===
...маленький компонент THintEdit, порожденный от TCustomEdit, который представляет собой с виду обычный TEdit элемент с возможностью автоматического выбора стринговых значений из скрытого списка (так, как это реализовано в Netscape Navigator'е). Описание особенно не нужно, так как выполнено все достаточно элементарно: значения для выбора заносятся в свойство HintList, тип свойства TStrings. При нажатии клавиш вверх/вниз выбираются значения, соответствующие набранным начальным символам.
unit HintEdit;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;
type
 THintEdit = class(TCustomEdit)
 private
 { Private declarations }
 FHintList: TStrings;
 Searching,
 CanSearch: boolean;
 CurSPos: integer;
 protected
 { Protected declarations }
 procedure Change; override;
 procedure KeyDown(var Key: Word; Shift: TShiftState); override;
 public
 { Public declarations }
 constructor Create(AOwner: TComponent); override;
 property HintList: TStrings read FHintList write FHintList;
 destructor Destroy; override;
 published
 { Published declarations }
 property Anchors;
 property AutoSelect;
 property AutoSize;
 property BiDiMode;
 property BorderStyle;
 property CharCase;
 property Color;
 property Constraints;
 property Ctl3D;
 property DragCursor;
 property DragKind;
 property DragMode;
 property Enabled;
 property Font;
 property HideSelection;
 property ImeMode;
 property ImeName;
 property MaxLength;
 property OEMConvert;
 property ParentBiDiMode;
 property ParentColor;
 property ParentCtl3D;
 property ParentFont;
 property ParentShowHint;
 property PasswordChar;
 property PopupMenu;
 property ReadOnly;
 property ShowHint;
 property TabOrder;
 property TabStop;
 property Text;
 property Visible;
 property OnChange;
 property OnClick;
 property OnDblClick;
 property OnDragDrop;
 property OnDragOver;
 property OnEndDock;
 property OnEndDrag;
 property OnEnter;
 property OnExit;
 property OnKeyDown;
 property OnKeyPress;
 property OnKeyUp;
 property OnMouseDown;
 property OnMouseMove;
 property OnMouseUp;
 property OnStartDock;
 property OnStartDrag;
 end;
procedure Register;
implementation
{$R *.DCR}
procedure Register;
begin
 RegisterComponents('Netscape', [THintEdit]);
end;
constructor THintEdit.Create;
begin
 inherited;
 FHintList := TStringList.Create;
 Searching := false;
 CanSearch := true;
 CurSPos := -1;
end;
procedure THintEdit.Change;
var
 i, l: integer;
begin
 if Searching then
 Exit;
 if not CanSearch then
 Exit;
 if Text = then
 Exit;
 l := Length(Text);
 for i := 0 to FHintList.Count - 1 do
 if Copy(FHintList[i], 1, l) = Text then
 begin
 Searching := true;
 CurSPos := i;
 Text := FHintList[i];
 Searching := false;
 SelStart := Length(Text);
 SelLength := -(Length(Text) - l);
 break;
 end;
 inherited;
end;
procedure THintEdit.KeyDown;
var
 l: integer;
begin
 if Chr(Key) in ['A'..'z', 'А'..'Я', 'а'..'я'] then
 CanSearch := true
 else
 CanSearch := false;
 case Key of
 VK_DOWN:
 begin
 if (CurSPos < HintList.Count - 1) and (SelLength > 0) then
 if Copy(FHintList[CurSPos + 1], 1, SelStart) = Copy(Text, 1, SelStart)
 then
 begin
 l := SelStart;
 Inc(CurSPos);
 Text := FHintList[CurSPos];
 SelStart := Length(Text);
 SelLength := -(Length(Text) - l);
 end;
 Key := VK_RETURN;
 end;
 VK_UP:
 begin
 if (CurSPos > 0) and (SelLength > 0) then
 if Copy(FHintList[CurSPos - 1], 1, SelStart) = Copy(Text, 1, SelStart)
 then
 begin
 l := SelStart;
 Dec(CurSPos);
 Text := FHintList[CurSPos];
 SelStart := Length(Text);
 SelLength := -(Length(Text) - l);
 end;
 Key := VK_RETURN;
 end;
 VK_RETURN:
 begin
 SelStart := 0;
 SelLength := Length(Text);
 end;
 end;
 inherited;
end;
destructor THintEdit.Destroy;
begin
 FHintList.Free;
 inherited;
end;
Author: Константин Хрипков
Source: https://delphisources.ru/pages/faq/base/edit_with_choose.html
ID: 00968
----
=== Подстановка в TEdit (автодополнение) ===
* Подсказка при вводе в Edit
Source: http://delphiworld.narod.ru/
ID: 00976