Советы по Delphi

         

Хитрый 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 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]



Содержание раздела