Delphi combobox autocomplete - IT Справочник
Llscompany.ru

IT Справочник
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Delphi combobox autocomplete

ComboBox с автозавершением (AutoComplete) по подстроке

В интернете достаточно много информации по реализации функции автозавершения вводимого в TextBox или ComboBox текста — так, как это сделано в диалоговом окне «Пуск / Выполнить». Данную функцию можно реализовать с помощью интерфейсов IAutoComplete/IAutoComplete2. Эти интерфейсы позволяют формировать список вариантов автозавершения, подбирая те строки, которые начинаются с введенного в поле редактирования текста, но не позволяют выбирать те строки, которые содержат введенный текст в любом месте строки (см. рис. 1) — во всяком случае в интернете я не нашел информации по этому вопросу. Поэтому пришлось делать свое выпадающее окно автозавершения.

В целом выпадающее окно должно вести себя точно так же, как и стандартное выпадающее окно ComboBox’а (это окно создается системой, его класс называется «ComboLBox»):

  1. ComboBox не должен терять фокус при выпадении окна.
  2. Окно должно пропадать, когда фокус уходит с ComboBox’а; когда происходит переключение на другое окно; когда пользователь двигает форму, содержащую ComboBox.
  3. Выпадающее окно не должно получать фокус, т.е. когда пользователь выбирает какой-либо пункт списка автозавершения, либо просто прокручивает этот список мышью, заголовок формы, содержащей ComboBox, должен оставаться активным.

Второй пункт реализуется достаточно просто. Пункты первый и третий взаимосвязаны, и их я реализовать долгое время не мог. Родное выпадающее окно комбобокса (ComboLBox) судя по всему работает с применением захвата ввода от мыши (SetCapture/ReleaseCapture). Когда я попытался сделать свое выпадающее окно аналогичным образом, практически все получилось как задумано (комбобокс не терял фокус, форма не становилась неактивной), за единственным исключением — не работала полоса прокрутки в списке (в вопросе ¹ 57188 на Круглом столе тоже обсуждается эта проблема). Наконец, решение было найдено здесь. На основе этой статьи был сделан компонент TACComboBox. Тема показалась мне актуальной, поэтому я решил опубликовать результаты своих изысканий.

Компонент имеет следующие published-свойства:

property ACItems: TStrings; — список вариантов автозавершения; из строк, содержащихся в этом списке формируется список автозавершения, в зависимости от значения свойства ACType.

type TAutoCompleteType = (actSimple, actSubString, actCustom);

property ACType: TAutoCompleteType; — определяет алгоритм, по которому заполняется список автозавершения.

  • при ACType=actSimple в список автозавершения помещаются строки из ACItems, которые начинаются с введенного в поле комбобокса текста;
  • при ACType=actSubString в список автозавершения помещаются строки из ACItems, которые содержат введенный в поле комбобокса текст;
  • при ACType=actCustom для каждого элемента списка ACItems вызывается обработчик события OnCheckString, в котором определяется, следует ли добавлять очередной элемент в список автозавершения. Если обработчик устанавливает параметр AddString в True, элемент добавляется, если в False — не добавляется.

В принципе, для формирования списка автозавершения можно не пользоваться списком, заданным в свойстве ACItems. Для этого нужно написать наследника класса TACComboBox, в котором переопределить protected-метод PrepareACStrings. В параметре AText этому методу передается введенный в поле комбобокса текст; метод должен заполнить список FDropDown.Items (подробнее см. пример, прилагаемый к статье).

Опишу некоторые детали реализации компонента; подробные комментарии есть в исходниках к статье.


    Итак, делаем выпадающее окно. Возможность изменения размеров окна автозавершения, как это сделано в IAutoComplete, мне не нужна, поэтому в качестве выпадающего окна вполне подойдет обычный ListBox.

Delphi combobox autocomplete

Guten Abend zusammen,

ich habe eine Frage zur Combobox. Ich hдtte gerne, dass diese дhnlich fungiert wie das Suchfeld in Google, also: Sobald man sie anklickt, erscheint ein dropdownmenь, dass die 5 zuletzt verwendeten Suchbegriffe anzeigt. Bei jeder Дnderung des Texts soll die Anzeige dann gefiltert werden.

Ich bin soweit gekommen, dass die Eingaben automatisch gespeichert werden, sodass ich mit einer einfachen funktion die 5 Vorschlдge abrufen und diese als Items in der Combobox hinzufьgen kann.

Ich hдtte nun aber gern, dass der oberste Vorschlag makiert ist, sodass man mit den Pfeiltasten etwas auswдhlen kann und die mit Enter bestдtigt (oder auch anklicken). Gleichzeitig soll es aber auch mцglich sein, die Vorschlдge zu ignorieren und einfach weiterzuschreiben. Die Combobox makiert aber automatisch den gesamten Text. Wie kann ich das verhindern?

Ich habe zwar schon einige дhnliche Beitrдge gefunden, diese haben mir aber leider nicht weitergeholfen. Hier mal meine Onchange-Routine (zunдchst nur mit einem Vorschlag):

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.297 Beitrдge

Delphi XE2 Professional

AW: Autocomplete (Combobox)

mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert — Praxis ist, wenn alles funktioniert und keiner weiss warum! AutoCompleteUnit;

uses Windows, StdCtrls, ComObj;

Const
SHACF_DEFAULT = $0;
SHACF_FILESYSTEM = $1;
SHACF_URLHISTORY = $2;
SHACF_URLMRU = $4;
SHACF_URLALL = (SHACF_URLHISTORY Or SHACF_URLMRU);
SHACF_AUTOSUGGEST_FORCE_ON = $10000000;
SHACF_AUTOSUGGEST_FORCE_OFF = $20000000;
SHACF_AUTOAPPEND_FORCE_ON = $40000000;
SHACF_AUTOAPPEND_FORCE_OFF = $80000000;

function AutoComplete(editField: TEdit; dwFlags: DWORD): Boolean;

type TShAutoCompleteFunc = function (hwndEdit: HWND; dwFlags: dWord): LongInt; stdcall ;

var SHAutoComplete: TShAutoCompleteFunc;
theDLL: THandle;

function AutoComplete(editField: TEdit; dwFlags: DWORD): Boolean;
begin
if @ShAutoComplete <> nil then
Result := (SHAutoComplete(editField.Handle, dwFlags) = 0)
else
Result := false;
end ;

initialization
theDLL := LoadLibrary(‘ shlwapi.dll ‘);
if theDLL <> 0 then
@ShAutoComplete := GetProcAdress(theDLL, ‘ SHAutoComplete ‘);
finalization
if theDLL <> 0 then FreeLibrary(theDLL);
end .

Registriert seit: 23. Dez 2011
150 Beitrдge

Delphi XE7 Architect

AW: Autocomplete (Combobox)

vielen Dank fьr Eure Antworten! Ich wollte mal es mal nach der Art von Hathor versuchen, da mir das Testprojekt gut gefдllt. Ich habe dazu jedoch ein paar Fragen, komme leider noch nicht von allein damit zurecht.

1. Ich habe ja bereits eine Funktion, welche die Fьnf Strings raussucht, die angeboten werden sollen (das muss nach einem bestimmten Prinzip funktionieren, ist hier aber ja egal). An welcher Stelle sollte ich das denn einfьgen?
2. Wo/wie rufe ich die Funktion denn auf? Im OnChange-Event des Editfeldes?
3. Wenn ich deinen Code ьbernehme und Compiliere bekommme ich folgende Fehlermeldung, sobald ich etwas in mein Edit-Feld eintrage:

Ich habe alles erstmal einfach ьbernommen, nur aus «GetProcAdress» musste ich «GetProcAddress» machen, da Delphi die Funktion sonst nicht erkennt, aber das wird ja wahrscheinlich nur ein Tippfehler gewesen sein. Danke nochmal fьr die Hilfe!

AW: Autocomplete (Combobox)

Im Anhang Source + EXE.
Hier ist der vollstдndige Sourcecode:

uses
Forms,
Main in ‘ Main.pas ‘ ,
UAutoComplete in ‘ UAutoComplete.pas ‘;

begin
Application.Initialize;
Application.Title := ‘ Example AutoComplete ‘;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end .
//————————————————
unit Main;

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, UAutoComplete, StdCtrls, ExtCtrls;

type
TMainForm = class (TForm)
InfoLbl: TLabel;
EditControl: TEdit;
OptionsBox: TGroupBox;
FileBox: TCheckBox;
HistoryBox: TCheckBox;
RecentBox: TCheckBox;
QuitBtn: TButton;
SepBevel: TBevel;
AppendBox: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure QuitBtnClick(Sender: TObject);
procedure OptionChange(Sender: TObject);
private
< Dйclarations privйes >
public
< Dйclarations publiques >
end ;

var
MainForm: TMainForm;
Params: TCompleteParams;

procedure TMainForm.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
OptionsBox.DoubleBuffered := True;
with Params do
begin
Options := [coeFileSystem,coeURLHistory,coeRecent];
Append := True;
end ;
if not AutoComplete(EditControl.Handle, Params) then raise
Exception .Create(‘ ERROR: Definition Auto-Complete ‘);
end ;

procedure TMainForm.QuitBtnClick(Sender: TObject);
begin
Close;
end ;

function ElementFromTag(Value: Integer): TCompleteOptionsElements;
begin
case Value of
1: Result := coeFileSystem;
2: Result := coeURLHistory;
3: Result := coeRecent;
else Result := coeFileSystem;
end ;
end ;

procedure TMainForm.OptionChange(Sender: TObject);
begin
if Sender is TCheckBox then
with TCheckBox(Sender), Params do
begin
if (Tag in [1..3]) then if Checked then
Include(Options, ElementFromTag(Tag)) else Exclude(Options, ElementFromTag(Tag));
if Tag = 4 then Append := Checked;
if not AutoComplete(EditControl.Handle, Params) then raise
Exception .Create(‘ ERROR: Definition Auto-Complete ‘);
end ;
end ;

type
Longword = Cardinal;

TCompleteOptionsElements = (coeFileSystem, coeURLHistory, coeRecent);
TCompleteOptions = set of TCompleteOptionsElements;

TCompleteParams = record
Options: TCompleteOptions;
Append: Boolean;
end ;

function SHAutoComplete(hwndEdit, dwFlags: Longword): Longword; stdcall ; external ‘ shlwapi.dll ‘;

const
SHACF_AUTOAPPEND_FORCE_OFF = $80000000;
SHACF_AUTOAPPEND_FORCE_ON = $40000000;
SHACF_FILESYSTEM = $00000001;
SHACF_URLHISTORY = $00000002;
SHACF_URLMRU = $00000004;
SHACF_NOAUTOCOMPLETE = $00000008;

AppendConsts: array [Boolean] of Longword = (SHACF_AUTOAPPEND_FORCE_OFF, SHACF_AUTOAPPEND_FORCE_ON);

function CompleteOptionsToFlags(Value: TCompleteOptions): Longword;
begin
if Value = [] then Result := SHACF_NOAUTOCOMPLETE else
begin
Result := 0;
if coeFileSystem in Value then Result := Result or SHACF_FILESYSTEM;
if coeURLHistory in Value then Result := Result or SHACF_URLHISTORY;
if coeRecent in Value then Result := Result or SHACF_URLMRU;
end ;
end ;

C# winforms combobox динамическое автозаполнение

У меня есть ComboBox и большое количество записей, чтобы показать в нем. Когда пользователь начинает печатать, я хочу загрузить записи, которые начинаются с ввода текста и предлагают пользователю для автозаполнения. Как описано в теме выше, я не могу загрузить их на сomboBox_TextChanged , потому что я всегда перезаписываю предыдущие результаты и никогда их не вижу.

Могу ли я реализовать это, используя только ComboBox ? (не TextBox или ListBox )

Я использую эти настройки:

10 Ответов

Я также сталкиваюсь с такого рода требованиями в последнее время. Я установил следующие свойства без написания кода it works.see, если это вам поможет.

Вот мое окончательное решение. Он прекрасно работает с большим количеством данных. Я использую Timer , чтобы убедиться, что пользователь хочет найти текущее значение. Это выглядит как комплекс, но это не так. Спасибо Максу Ламбертини за эту идею.

Это решение не очень круто. Поэтому, если у кого-то есть другое решение, Пожалуйста, поделитесь им со мной.

Да, конечно, можешь. но ему нужна некоторая работа, чтобы заставить его работать без проблем. Это какой-то код, который я придумал. Имейте в виду, что он не использует функции автозаполнения combobox, и это может быть довольно медленно, если вы используете его для просеивания большого количества элементов.

Я написал что-то вроде этого .

Я нашел ответ Макса Ламбертини очень полезным, но изменил его метод HandleTextChanged как таковой:

Этот код пишется на вашей форме загрузки. Он отображает весь тур в базе данных, когда пользователь вводит букву в поле со списком. Этот код автоматически предлагает и добавляет правильный выбор, как пользователь хочет.

В предыдущих ответах есть недостатки. Предлагает свою версию с выделением в выпадающем списке нужного пункта:

Это была большая боль, чтобы начать работать. Я попал в кучу тупиков, но конечный результат достаточно прямолинейен. Надеюсь, это может принести кому-то пользу. Возможно, потребуется немного слюны и полировки, вот и все.

Примечание: _addressFinder.CompleteAsync возвращает список из KeyValuePairs.

ThreadingHelpers — это просто набор статических методов вида:

Возьмите 2. Мой ответ ниже не привел меня полностью к желаемому результату, но он все еще может быть кому-то полезен. Функция автоматического выбора ComboBox вызывала у меня сильную боль. В этом случае используется TextBox, сидящий поверх ComboBox, что позволяет мне игнорировать все, что появляется в самом ComboBox, и просто реагировать на событие изменения выбора.

  1. создание формы
  2. Добавить ComboBox
    • Установите желаемый размер и местоположение
    • Установите DropDownStyle в DropDown
    • Установите значение TabStop в false
    • Установите DisplayMember в значение (я использую список KeyValuePairs)
    • Установить ValueMember на ключ
  3. Добавить Панель
    • Установите тот же размер, что и ComboBox
    • Накройте панель ComboBox (это означает, что стандартный ComboBox выше стандартного TextBox)
  4. Добавить TextBox
    • Поместите TextBox над верхней частью панели
    • Совместите нижнюю часть TextBox с нижней частью панели / ComboBox

С фоновым кодом

У вас могут быть или не быть проблемы с установкой DroppedDown свойства ComboBox. В конце концов я просто завернул его в блок try с пустым блоком catch. Не самое лучшее решение, но оно работает.

Пожалуйста, смотрите мой другой ответ ниже для получения информации о ThreadingHelpers.

Похожие вопросы:

Потерпеть меня. У меня есть ComboBox (WPF) в режиме ‘autocomplete’. Все просто, правда? Просто установите значение IsEditable в true.

Delphi combobox autocomplete

Компонент Delphi ComboBox представляет собой комбинацию списка строк ListBox со строкой ввода Edit. При этом «список строк» компонента Delphi ComboBox вначале скрыт, и раскрывается при щелчке мышкой по треугольничку раскрытия, который находится справа в строке ввода:

Таким образом, с помощью Delphi ComboBox место на Форме экономится для расмещения других элементов интерфейса программы. А при необходимости раскрытие списка строк можно вообще запретить.

Многие свойства и возможности компонента Delphi ComboBox по работе со строками (объектами Items) такие же как и у компонента Delphi ListBox, поэтому повторно описывать их не буду. Опишу отличия и дополнительные возможности.

Итак, за возможность раскрытия компонента ComboBox отвечает стиль — свойство Style:

Стиль компонента ComboBox1 равен
ComboBox1.Style = csDropDown
(список может быть раскрыт, можно писать в строке ввода)

Стиль компонента ComboBox2 равен
ComboBox1.Style = csSimple
(список не может быть раскрыт, можно писать в строке ввода)

При стиле csDropDownList компонент может быть раскрыт, но свойство Text может принимать значения только одной из строк, сохранённых в компоненте, то есть пользователь лишён возможности писать в строке ввода.

Количество строк, видимых при раскрытии списка, равно DropDownCount. Если реальное количество сохранённых строк больше этого количества, то автоматически появляется полоса прокрутки. Программист может заставить список раскрыться в нужный момент. Для этого нужно свойству DroppedDown присвоить значение True. Для этой же цели пользователь может использовать клавиатурную комбинацию ALT+ВНИЗ.

Максимально допустимое количество символов в текстовой строке задаётся параметром MaxLength, причём значение означает отсутствие ограничений. Свойство CharCase управляет преобразованием вводимого текста к верхнему (значение CharCase = ecUpperCase ) или нижнему (значение CharCase = ecLowerCase ) регистру. Значение ecNormal означает, что текст вводится без преобразования.

Основными событиями компонента Delphi ComboBox являются:

Обзор компонентов Delphi В начало урока Компонент Delphi ScrollBar

Илья, добавлено 26.12.11, 19:51:17
как при создание ComboBox на программном уровне записать данные в этот список? (стиль csDropDownList), кликаю по нему а он не открывается. (не скомпилировал) Автор, добавлено 27.12.11, 11:52:08
Прочитайте про ListBox, свойства записи в них аналогичны. Ну кому я ссылку давал вверху? Илья, добавлено 28.12.11, 10:54:10
большое спасибо, нашел все, возник еще вопрос: как считать данные из ComboBox? то есть допусти в комбобоксе записаны числа, юзер выбрал 2, мне надо 1. считать из комбобокс то что выбрал юзер, 2. записать в x, предварительно превратив тип числа в (к примеру) integer Автор, добавлено 28.12.11, 14:55:43
То что выбрал пользователь выделяется цветом, и имеет номер ComboBox.ItemIndex. Содержимое этой строки:

Это значение типа String. Его можно записать в переменную того же типа

var S: String;

S:=ComboBox.Items[ComboBox.ItemIndex];

Затем его можно преобразовать в Integer:

var N: Integer;

N:=StrToInt(ComboBox.Items[ComboBox.ItemIndex]);

А чтобы два раза не писать ComboBox пользуемся оператором присоединения with, в зоне действия которого имя компонента можно не указывать, а сразу свойство:

with ComboBox do
begin //Между begin и end ComboBox можно не писать. Но если оператор там всего один, то begin/end необязательны.
N:=StrToInt(Items[ItemIndex]);
end; Михаил, добавлено 28.07.12, 12:46:38
Здравствуйте, можете подсказать решение проблемы с dbcombobox( пишу суда, т.к. это самый близкий раздел к теме вопроса).
У меня есть табличная база данных с 2мя разделами: name и prise. dbcombobox заполнен значениями name. Так же на форме есть и dbedit в котором должны высвечиваться значения prise. При запуске программы в dbcombobox высвечивается последнее значение базы данных, в dbedit высвечивается соответствующее значение prise, но при выборе другого значения в dbcombobox значение dbedit не менятся. можно ли как-то это исправить? Автор, добавлено 28.07.12, 13:26:37
Терпеть ненавижу БД. Долго пытался забыть как с ними работать. Наконец, получилось. И вспоминать не хочу. Хотя когда-нибудь и придётся. Но не сейчас. Аноним, добавлено 20.10.12, 20:44:33
1 Артем, добавлено 5.06.13, 07:01:03
что означает s[i] Автор, добавлено 5.06.13, 07:27:12
Если S это переменная типа String, то S[i] означает символ, стоящий на i-м месте в переменной S. Отсчитывается от 1 (не от нуля). Артём, добавлено 5.07.13, 19:33:40
Здравствуйте, у меня вопрос,подскажите пожалуйста, как мне объединить combobox.text и combobox.items.text , есть FPath который добавляет пути файлов в combobox.items.append(FPath) и есть combobox.text:= FPath. Мне надо, чтобы при выделении текстового поля и его удаления combobox.text:= FPath , автоматически удалялась строка ComboBox1.Items.Delete(ComboBox1.ItemIndex). Евгений, добавлено 25.09.13, 17:32:07
Здравствуйте подскажите пожалуйста я хочу чтобы по выбору индекса в ComboBox’е
показывались или скрывались мемо, но они только скрываются вот код
begin
If ComboBox1.ItemIndex = 0 Then
begin
Label11.Visible:=True;
Memo3.Visible:=True;
end
else
begin
Label11.Visible:=False;
Memo3.Visible:=False;
end;
end;
begin
If ComboBox1.ItemIndex = 1 Then
begin
Label11.Visible:=True;
Memo3.Visible:=True;
end
else
begin
Label11.Visible:=False;
Memo3.Visible:=False;
end;
end; Евгений, добавлено 25.09.13, 17:36:12
В первой процедуре
If ComboBox1.ItemIndex = 0 Then
begin
Label9.Visible:=True;
Memo1.Visible:=True;
end
else
begin
Label9.Visible:=False;
Memo1.Visible:=False;
end;
end; Евгений, добавлено 25.09.13, 18:03:44
Да только если я добавляю и на другие индексы такой код и мемо не 1, а 2 или 3, то тогда при выборе 1-го индекса мено1 скрывается и прочие тоже
У меня 9 индексов код длинный и поэтому я не стал писать его весь.
ставлю на событие OnChange в ComboBox’е Автор, добавлено 25.09.13, 18:03:56
Зря не указали в каком событии выполняете данную процедуру. У меня в OnCloseUp всё работает правильно. Автор, добавлено 25.09.13, 18:07:38
Ну вот, теперь всё понятно. В OnChange неправильно работает, так как в этом событии значение ItemIndex не тот, который сейчас выбрали, а предыдущий. Евгений, добавлено 25.09.13, 18:10:49
Но перед 0 ничего нет! как тогда написать? Автор, добавлено 25.09.13, 18:18:20

procedure TForm1.ComboBox1CloseUp(Sender: TObject);
begin
If ComboBox1.ItemIndex = 0 Then
begin
Memo1.Visible:=True;
end
else
begin
Memo1.Visible:=False;
end;
end;

А если вас беспокоит, что ItemIndex в первый момент не определён, присвойте ему нужное значение, в OnCreate. Евгений, добавлено 25.09.13, 18:30:29
А потом начинать сразу с If ComboBox1.ItemIndex = 2? Автор, добавлено 25.09.13, 18:32:15
Ну да. Событие OnCloseUp Вернёт правильное значение ItemIndex. Евгений, добавлено 25.09.13, 20:04:29
Пришлось для каждого индекса своё мемо ставить и на OnChange так всё работает по другому не получилось! спасибо за помощь. Евгений, добавлено 30.11.13, 18:54:46
Здравствуйте. Подскажите пожалуйста как скрыть в ComboBoxe некоторое количество элементов например если в ComboBox1 выбран элемент 0 тогда в ComboBox2 показывать элементы с 0 10, а если в ComboBox1 выбран элемент 1 тогда в ComboBox2 показывать элементы с 11 20, а если нет выбранных в ComboBox1 тогда скрыть всё. Автор, добавлено 30.11.13, 19:23:04
Нужно не скрывать, а добавлять в пустой combobox те элементы, которые нужно показать. Делается это по событию OnChange первого бокса. Вначале очищаем второй бокс, а затем добавляем только то что нужно. Евгений, добавлено 30.11.13, 19:30:43
А скрыть можно? Автор, добавлено 30.11.13, 20:58:57
Нельзя. Евгений Александрович, добавлено 22.01.14, 11:16:16
Здравствуйте. На форме ComboBox1 со строками:
1
2
3
и ComboBox2 со строками:
3
1
1

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
ComboBox2.ItemIndex:=ComboBox1.ItemIndex;
end;

При выборе из ComboBox1 3-го значения, в ComboBox2 выбирается 2-е. Почему не работает? Причём, если б в ComboBox2 2-е и 3-е значения были бы разные, то работало бы. Автор, добавлено 22.01.14, 12:35:01
У меня работает. Именно с вашими строчками. Может, вы не учитываете, что Index отсчитывается от 0? Поэтому, выбирая вторую строку, ItemIndex равен 1. Евгений Александрович, добавлено 22.01.14, 14:44:40
Нет, учитываю. Но при выборе 3-ей строки ComboBox1 (ItemIndex=4), в ComboBox2 тоже ведь должна выбраться строка №3? Ан нет, выбирается вторая. Если добавить ещё подобных строк, то можно заметить, что в ComboBox2 будет выбираться первая сверху строка, значение которой равно значению, той строки, которая должна быть выбрана. Допустим, если в моём примере добавить ещё n строк в ComboBox1 и столько же единичек в ComboBox2, будет всё равно выбираться строка №2, потому что в ней единица встречается первый раз. Delphi у меня седьмая Автор, добавлено 22.01.14, 14:51:53
При выборе 3-й строки ItemIndex=2 а не 4. Сами вот убедитесь:

ComboBox2.ItemIndex:=ComboBox1.ItemIndex;
Caption:=IntToStr(ComboBox2.ItemIndex);
Евгений Александрович, добавлено 22.01.14, 15:10:03
Ой. Да ItemIndex=2. А про всё остальное? Почему строка ComboBox1 не равна строке ComboBox2? Автор, добавлено 22.01.14, 15:19:42
Да почему не равны. Равны. Ну сравните ItemIndex’ы. Вы щёлкаете по последней (3-й) строке, в заголовке высвечивается 2, в тексте 2-го бокса — 1. 1 — это же содержимое 3-й (последней) строки 2-го бокса, или нет? Евгений Александрович, добавлено 22.01.14, 16:25:00
Да. Но это также содержимое и 2-й строки и когда я открываю список 2-го бокса, видно, что выделена именно 2-я строка, а не 3-я. Автор, добавлено 22.01.14, 17:11:28
Я понял. Вы говорите о выделении цветом, а не об изменении ItemIndex. ItemIndex’ы совпадают, а вот почему цветом выделяется другая строка. Возможно, таков алгоритм выделения цветом строки — находит первую строку, где значение совпадает с искомым, и выделяет её. Я пробовал и на 4 строках, похоже так. Автор, добавлено 22.01.14, 17:15:32
Если взять 4 строки

и поставить кнопку и написать

то цветом будет выделена 2 строка — там значение совпадает с 4 строкой.

Delphi combobox autocomplete

В Windows есть такая фича — начинаешь ввод в combobox букв, сразу после курсора появляется подсвеченная запись, удовлетворяющая критерию.
В Execl есть такая же функция.

Как бы сделать такое в Дельфи?
Может у кого есть готовый код, компонент или ссылка на него?


clickmaker ( 2003-05-14 14:54 ) [1]

на torry.net в разделе VCL — List & ComboBoxes


Hint ( 2003-05-14 14:56 ) [2]


malamba ( 2003-05-14 15:13 ) [3]

О-о, спасибо большое.


malamba ( 2003-05-14 15:26 ) [4]

А можно ли сделать, чтобы при csDropDownList ( т.е. ввод не разрешен) я мог каким-нибудь способом облегчить выбор при большом списке


Михайлов Антон ( 2003-05-14 15:30 ) [5]

Обработай на нём OnKeyDown


malamba ( 2003-05-14 15:42 ) [6]

Но это ничего, что ввод запрещен?
Обрабатывать все равно?
Любопытно и интересно — попробую.


malamba ( 2003-05-14 15:50 ) [7]

Да, но все равно должен происходить запрос к массиву элементов.
Раньше при вводе букв и AutoComplete:=True; combobox сам производил поиск, а поскольку я перехватываю буквы, то должен сам вызывать эту процедуру.
Где бы ее найти, может кто знает?


Hint ( 2003-05-14 15:51 ) [8]


malamba ( 2003-05-14 16:06 ) [9]

Да, наверное, исходник


Михайлов Антон ( 2003-05-14 16:26 ) [10]


> А можно ли сделать, чтобы при csDropDownList ( т.е. ввод
> не разрешен) я мог каким-нибудь способом облегчить выбор
> при большом списке

Дык при csDropDownList можно давить на кнопачки (в клавиатуре 🙂 и он при совпадении будет выбирать в КомбоБоксе то, что совпало с надавленными кнопачками.


malamba ( 2003-05-15 09:27 ) [11]

Да, не совсем удобно ( не видно букв ), но работает.
Шайтан, однако.

Читать еще:  Delphi таблица символов
Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector