...маленький компонент THintEdit, порожденный от TCustomEdit, который представляет собой с виду обычный TEdit элемент с возможностью автоматического выбора стринговых значений из скрытого списка (так, как это реализовано в Netscape Navigator'е). Описание особенно не нужно, так как выполнено все достаточно элементарно: значения для выбора заносятся в свойство HintList, тип свойства TStrings. При нажатии клавиш вверх/вниз выбираются значения, соответствующие набранным начальным символам.
Code: |
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;
|
- Назад
- Вперёд >>
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!