скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

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;






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook