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

muzaMan

New member
Joined
Oct 10, 2009
Messages
1
Reaction score
0
Добрый день, коллеги!

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

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

з.ы. Delphi Seattle, Devexpress 15.2.2
 
Last edited by a moderator:

LeshaRB

Premium Member
VIP
Joined
Jun 11, 2022
Messages
320
Reaction score
451
Location
Canada
Deposit
$ 150
Добрый день, коллеги!

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

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

з.ы. Delphi Seattle, Devexpress 15.2.2

Напиши свой
 

__Vlad__

Member
Joined
Mar 3, 2008
Messages
7
Reaction score
0
Age
23
Думаю можно подправить исходный код, который отвечает за такое действие (поиск строки). Только придется побаловаться с pos() и регистром букв.
 

newbotanik

Member
Joined
Sep 29, 2015
Messages
6
Reaction score
0
Добрый день, коллеги!

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

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

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

плюсы, можна делать подсвет чего хочешь как хочешь, и искать в том же духе
 
Last edited by a moderator:

AbdulAbdalla

Member
Joined
Sep 3, 2009
Messages
18
Reaction score
3
Age
37
Try looping all components and use the .ClassName property to check against a specific class.
 

Filipov Kamen

Member
Joined
Nov 12, 2010
Messages
8
Reaction score
3
Не помню где нашел, работает отлично! Переделал немножко, но в общем это все, держи:

{ кроме стандартных для лукапа свойств (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

Member
Joined
Nov 12, 2010
Messages
8
Reaction score
3
Извини, забыл про инструкцию по эксплуатации... :D
Используешь так:

На 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;
 
Top