Devexpress Функционал FindPanel в Combobox

  • Автор темы muzaMan
  • 1690
  • Обновлено
  • 25, Apr 2016
  • #1
Добрый день, коллеги!

Итак, нужен функционал поиска как в findpanel только в combobox(lookupcombobox и т.п.).

Точнее, при наборе части слов, найти те пункты из списка, в которых встречается это слово(а не только слова с которых начинается). Напимер : при наборе "маз" , нашлись строки Камаз, Автомобиль Камаз, и т.п.

з.ы. Delphi Seattle, Devexpress 15.2.2

muzaMan


Рег
10 Oct, 2009

Тем
2

Постов
3

Баллов
23
  • 25, Apr 2016
  • #2
muzaMan, post: 766995:
Добрый день, коллеги!

Итак, нужен функционал поиска как в findpanel только в combobox(lookupcombobox и т.п.).

Точнее, при наборе части слов, найти те пункты из списка, в которых встречается это слово(а не только слова с которых начинается). Напимер : при наборе "маз" , нашлись строки Камаз, Автомобиль Камаз, и т.п.

з.ы. Delphi Seattle, Devexpress 15.2.2
Напиши свой
 

LeshaRB


Рег
11 Jun, 2007

Тем
5

Постов
110

Баллов
160
  • 21, May 2016
  • #3
Думаю можно подправить исходный код, который отвечает за такое действие (поиск строки). Только придется побаловаться с pos() и регистром букв.
 

__Vlad__


Рег
03 Mar, 2008

Тем
0

Постов
5

Баллов
5
  • 24, May 2016
  • #4
muzaMan, post: 766995:
Добрый день, коллеги!

Итак, нужен функционал поиска как в findpanel только в combobox(lookupcombobox и т.п.).

Точнее, при наборе части слов, найти те пункты из списка, в которых встречается это слово(а не только слова с которых начинается). Напимер : при наборе "маз" , нашлись строки Камаз, Автомобиль Камаз, и т.п.

з.ы. Delphi Seattle, Devexpress 15.2.2
Я делал связку PoupupEdit в окне искал в гриде, в который втыкнул ричедит и делал в нем подсветку, пяток процедур и все ок плюсы, можна делать подсвет чего хочешь как хочешь, и искать в том же духе
 

newbotanik


Рег
29 Sep, 2015

Тем
0

Постов
5

Баллов
5
  • 05, Jul 2016
  • #5
Не помню где нашел, работает отлично! Переделал немножко, но в общем это все, держи:

{ кроме стандартных для лукапа свойств (ListSource, KeyFieldNames, ListFieldNames), установить следующие значения:

Properties.DropDownListStyle := lsEditList;

Properties.IncrementalFiltering := False;

Properties.IncrementalSearch := False;}

procedure SplitDelimitedString(AStrings: TStrings; const AText, ADelimiter: String); // Разбивка строки по словам

var

p, n: Integer;

Text: PChar;

begin

Text := PChar(AText);

AStrings.Clear;

n := Length(ADelimiter);

while Assigned(Text) do

begin

p := Pos(ADelimiter, Text) - 1;

if p < 0 then Break; AStrings.Add(Copy(Text, 1, p)); Inc(Text, p + n); end; if Assigned(Text) and (Length(Text) > 0) then

AStrings.Add(Text);

end;

procedure ApplySearchFilter(Combo: TcxDBLookupComboBox; const Fields, Text: String); // Установка фильтра для полей lookup-а, с разбивкой по словам и полям

var

i, j: Integer;

ItemLink: TObject;

Filter: TcxDataFilterCriteria;

FL: TcxFilterCriteriaItemList;

FieldList, TextWords: TStrings;

Controller: TcxDBDataController;

begin

Controller := Combo.Properties.DataController;

TextWords := TStringList.Create;

FieldList := TStringList.Create;

try

Filter := Controller.Filter;

Filter.BeginUpdate;

try

Filter.Active := False;

Filter.Clear;

Filter.Options := Filter.Options + [fcoCaseInsensitive];

Filter.Root.BoolOperatorKind := fboOr;

SplitDelimitedString(FieldList, Fields, ';');

SplitDelimitedString(TextWords, Text, ' ');

for i := 0 to FieldList.Count - 1 do

if (FieldList <> '') then
begin
FL := Filter.Root.AddItemList(fboAnd);
ItemLink := Controller.GetItemByFieldName(FieldList);
if Assigned(ItemLink) then
for j := 0 to TextWords.Count - 1 do
if (TextWords
J
<> '') then
FL.AddItem(ItemLink, foLike, '%' + TextWords[j] + '%', TextWords[j]);
end;
Filter.Active := True;
finally
Filter.EndUpdate;
if (Controller.FilteredRecordCount > 0) then
begin
if (Controller.FilteredRecordCount >= DropDownRows) then
Combo.Properties.DropDownRows := DropDownRows
else
Combo.Properties.DropDownRows := Controller.FilteredRecordCount;
Combo.Properties.DataController.FocusedRecordIndex := -1;
Combo.Properties.DataController.ChangeFocusedRecordIndex(Combo.Properties.DataController.FilteredRecordIndex[0]);
end
else
Combo.Properties.DropDownRows := 1;
end;
finally
TextWords.Free;
FieldList.Free;
end;
end;
 

Filipov Kamen


Рег
12 Nov, 2010

Тем
0

Постов
7

Баллов
7
  • 05, Jul 2016
  • #6
Извини, забыл про инструкцию по эксплуатации.



Используешь так:

На Properties.OnChange и Properties.OnCloseUp ставишь:

ApplySearchFilter(TcxDBLookupComboBox(Sender), TcxDBLookupComboBox(Sender).Properties.ListFieldNames, TcxDBLookupComboBox(Sender).Text);

На Properties.OnInitPopup ставишь:

ResetSearchFilter(TcxDBLookupComboBox(Sender));

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

procedure ResetSearchFilter(Combo: TcxDBLookupComboBox);

var

Controller: TcxDBDataController;

begin

if Combo.Properties.ListSource.DataSet.Active then

begin

Controller := Combo.Properties.DataController;

Controller.Filter.Active := False; // turn off filter

if (Controller.RecordCount >= 50) then // if using non-default DropDownRows

Combo.Properties.DropDownRows := 50

else

Combo.Properties.DropDownRows := Controller.RecordCount;

Controller.FocusedRecordIndex := -1;

Controller.ChangeFocusedRecordIndex(Controller.FilteredRecordIndex[0]);

end;

end;
 

Filipov Kamen


Рег
12 Nov, 2010

Тем
0

Постов
7

Баллов
7
Тем
49554
Комментарии
57426
Опыт
552966

Интересно