Блог


Последние записи


Теги

Информация

Delphi, DevExpress, примеры, решения

Фильтр по тегу: слов


Фильтр в cxLookupCombobox

2 варианта



Как сделать фильтрацию в TcxLookupCombobox?


Кроме стандартных для cxLookupCombobox свойств (ListSource, KeyFieldNames, ListFieldNames), нужно установить следующие значения:
<cxLookupCombobox>.Properties.DropDownListStyle  := lsEditList;
<cxLookupCombobox>.Properties.IncrementalFiltering := false;



Далее выполняем разделение строки на слова
// Разбивка строки по словам
procedure SplitDelimitedString(AStrings: TStrings; 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;



// Установка фильтра для полей lookup-а, с разбивкой по словам и полям
procedure ApplySearchFilter(Controller: TcxDBDataController; Fields: string; Text: string);
var
  i, j: integer;
  ItemLink: TObject;
  Filter: TcxDataFilterCriteria;
  FL: TcxFilterCriteriaItemList;
  FieldList, TextWords: TStrings;
begin
  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[i] <> '' then
        begin
          FL := Filter.Root.AddItemList(fboAnd);
          ItemLink := Controller.GetItemByFieldName(FieldList[i]);
          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;
    end;
  finally
    TextWords.Free;
    FieldList.Free;
  end;
end;


// вызов
procedure TForm1.cxDBLookupComboBox1PropertiesChange(Sender: TObject);
var
  S: TcxDBLookupComboBox;
begin
  S := TcxDBLookupComboBox(Sender);
  ApplySearchFilter(S.Properties.DataController, S.Properties.ListFieldNames, S.Text);

  // для тестирования
  Label1.Caption := S.Properties.DataController.Filter.FilterText;
end;





Второй вариант
А ещё можно сделать связку cxGridViewRepository (TcxGridDBTableView) + TcxExtLookupCombobox и получить в выпадающем списке полноценную сетку - cxGridDBTableView
добавлено: 13 июл 12 просмотры: 4078, комментарии: 0



cxGrid подсветка символов в ячейках

На событие OnCustomDrawCell для колонки, в которой нужно выполнять подсветку символов используем вот такой код:

procedure GridDB1TELCustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var R: TRect;
    s1,S2: string;
    X,dx,cx,C,Y: integer;
begin
  if checkHighLight.EditValue = false then exit;// если отключена подсветка

  ADone := true;// сами полностью всё пророисовываем
  R := AViewInfo.Bounds;
  s1 := AViewInfo.Text;
  C := Length(edSearch.Text);
  cx := ACanvas.TextWidth(edSearch.Text);
  ACanvas.FillRect(R);
  X := R.Left;

  if AViewInfo.Selected then
    ACanvas.Font.Color := clWhite
  else
    ACanvas.Font.Color := clBlack;

  ACanvas.Canvas.TextOut(R.Left + 1, R.Top + 1, S1);
  ACanvas.Font.Color := clRed;
  repeat
    Y := Pos(edSearch.Text, S1);
    if Y > 1 then
    begin
      S2 := Copy(S1,1,Y-1);
      dx := ACanvas.TextWidth(s2);
      Delete(S1,1,Y-1);
      Inc(X,dx);
    end;

    if Y > 0 then
    begin
      ACanvas.Canvas.TextOut(X + 1, R.Top + 1, copy(S1, 1, C));
      Delete(S1,1,C);
      Inc(X,cx);
    end;
  until Y = 0;
end;


А чтобы без прокрутки символы подсвечивались, нужно выполнять обновление, перерисовку грида:
<TableView>.LayoutChanged;
добавлено: 13 июл 12 просмотры: 2009, комментарии: 0