Edit с возможностью автоматического выбора
|
EDIT твою мать!
FORMAT тебя за ногу!
|
Приведу письмо читателя:
...я тоже пишу в 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;
|
|