Идёт загрузка страницы...

htp://aptem.net.ru





Хитрый TEdit

Приведу письмо читателя:

...я тоже пишу в 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 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;

Константин Хрипков <kostya@softincom.ru>. [000515]