...я тоже пишу в Delphi и могу поделиться своим опытом. В дополнение к этому письму, чтобы не быть голословным, прилагаю маленький компонент 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 doif Copy(FHintList[i],1,l)=Text then beginSearching:=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:=trueelse CanSearch:=false;case Key ofVK_DOWN:beginif (CurSPos<HintList.Count-1) and (SelLength>0) thenif Copy(FHintList[CurSPos+1],1,SelStart)=Copy(Text,1,SelStart) then beginl:=SelStart;Inc(CurSPos);Text:=FHintList[CurSPos];SelStart:=Length(Text);SelLength:=-(Length(Text)-l);end;Key:=VK_RETURN;end;VK_UP:beginif (CurSPos>0) and (SelLength>0) thenif Copy(FHintList[CurSPos-1],1,SelStart)=Copy(Text,1,SelStart) then beginl:=SelStart;Dec(CurSPos);Text:=FHintList[CurSPos];SelStart:=Length(Text);SelLength:=-(Length(Text)-l);end;Key:=VK_RETURN;end;VK_RETURN:beginSelStart:=0;SelLength:=Length(Text);end;end;inherited;end; destructor THintEdit.Destroy; begin FHintList.Free;inherited;end; |
Константин Хрипков <>. [000515]