Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Инкрементальный поиск в ListBox 2

Автор: Ralph Friedman

Я видел приложение, в котором ListBox позволял осуществлять инкрементальный поиск. При вводе очередного символа он позиционирует вас к первой ячейке, начало значения которой совпадает с введенным пользователем текстом, или выделяет все строки с текстом, содержащим введенный текст.

Как это осуществить на Delphi?

Здесь придется немного воспользоваться Win API. Установите свойство формы KeyPreview в True и сделайте примерно следующее:


unit LbxSrch;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Forms, StdCtrls;

type
  TFrmLbxSrch = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    ListBox1: TListBox;
    Label1: TLabel;
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure ListBox1Enter(Sender: TObject);
  private { Private declarations }
    FPrefix: array[0..255] of char;
  public
    { Public declarations }
  end;

var
  FrmLbxSrch: TFrmLbxSrch;

implementation

{$R *.DFM}

procedure TFrmLbxSrch.FormKeyPress(Sender: TObject; var Key: Char);
{ Помните о том, что свойство KeyPreview должно быть установлено в True }
var
  curKey: array[0..1] of char;
  ndx: integer;
begin
  if ActiveControl = ListBox1 then
  begin
    if key = #8 {Backspace (клавиша возврата)} then
    begin
      if FPrefix[0] <> #0 then
      begin
        FPrefix[StrLen(FPrefix) - 1] := #0;
      end
    end
    else
    begin
      curKey[0] := Key;
      curKey[1] := #0;
      StrCat(FPrefix, curKey);
      ndx := SendMessage(ListBox1.Handle, LB_FINDSTRING,
        -1, longint(@FPrefix));
      if ndx <> LB_ERR then
        ListBox1.ItemIndex := ndx;
    end;

    Label1.Caption := StrPas(FPrefix);
    Key := #0;
  end;
end;

procedure TFrmLbxSrch.ListBox1Enter(Sender: TObject);
begin
  FPrefix[0] := #0;
  Label1.Caption := StrPas(FPrefix);
end;

end.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay