Не помню где нашел, работает отлично! Переделал немножко, но в общем это все, держи:
{ кроме стандартных для лукапа свойств (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
<> '') 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;