Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Edit с возможностью автоматического выбора

Delphi , Компоненты и Классы , TEdit

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;

Компонент THintEdit, наследуясь от TCustomEdit, предлагает автоматическое выборное свойство, аналогичное тому, которое есть в браузере Netscape Navigator.

Компонент имеет несколько свойств и методов:

  • HintList: свойство типа TStrings, содержащее список строковых значений для функции автоподбора.
  • Searching, CanSearch и CurSPos: приватные переменные, используемые для отслеживания того, находится ли пользователь в поиске, является ли поиск включенным, и текущей позиции в списке подсказок соответственно.
  • Change(): overridden метод, обновляющий текст при изменении выбора.
  • KeyDown(): overridden метод, обрабатывающий нажатия клавиш и обновляющий функцию автоподбора.

Поведение компонента можно суммировать следующим образом:

  1. Когда пользователь вводит символ, компонент проверяет, является ли он частью значения в списке подсказок.
  2. Если находит совпадение, выбирает соответствующее значение из списка подсказок.
  3. Пользователь может затем перемещаться вверх и вниз с помощью стрелок для выбора различных значений из списка подсказок.
  4. Когда пользователь нажимает Enter, выбранное значение отображается в поле редактирования.

Компонент также имеет несколько других свойств и методов, которые не используются в этом реализации, но наследуются от TCustomEdit.

Некоторые предложения по улучшению:

  • Метод Change() можно упростить с помощью метода FindString() для списка подсказок вместо перебора всех значений.
  • Метод KeyDown() можно оптимизировать, проверяя, является ли нажатие клавиши частью существующего выбора перед обновлением функции автоподбора.
  • Рассмотреть добавление дополнительных свойств и методов для настройки поведения компонента, таких как возможность указания максимального количества предложений или включения/отключения функции автоподбора.
  • Реализация можно улучшить с помощью использования встроенных функций Delphi, таких как метод TStringList.Find(), вместо реализации custom-logic.

В целом, это базовая реализация функции автоподбора в Delphi. С некоторыми улучшениями и дополнительными настройками, она может стать полезным компонентом для разработчиков при создании приложений с текстовыми полемами ввода.

В статье описывается компонент TCustomEdit, который позволяет автоматически выбрать строковое значение из скрытого списка при вводе пользователем.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TEdit ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:19:26/0.0041189193725586/0