Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2012, 14:15   #1
Ferkel
Пользователь
 
Регистрация: 13.06.2012
Сообщений: 10
По умолчанию Поиск по слову в cxGrid

Здравствуйте. Необходимо наладить поиск по слову в cxGrid, чтобы при совпадении выделялась ячейка, в которой слово найдено. Нашел вот такой код (там в самом низу), но не могу его приладить в свою программу. Подскажите пожалуйста, как это сделать, а то делфи я занимаюсь относительно недавно, а поиск очень нужен. Спасибо.
Ferkel вне форума Ответить с цитированием
Старый 20.06.2012, 15:44   #2
X11
Пользователь
 
Регистрация: 20.01.2010
Сообщений: 54
По умолчанию

А что именно не получается?
X11 вне форума Ответить с цитированием
Старый 20.06.2012, 15:58   #3
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

опять же, почему поиск нужно делать в Gride а не самом DataSet используя Locate ?
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 20.06.2012, 16:42   #4
X11
Пользователь
 
Регистрация: 20.01.2010
Сообщений: 54
По умолчанию

locate ищет только по начальным символам
X11 вне форума Ответить с цитированием
Старый 20.06.2012, 16:44   #5
X11
Пользователь
 
Регистрация: 20.01.2010
Сообщений: 54
Сообщение

Где-нибудь в общем модуле:

Код:
type
  TcxDataControllerGroupsProtected = class(TcxDataControllerGroups);
function SearchIncxGrid(AView: TcxGridTableView; AText: string; AFromBeginning: boolean): boolean;
//const
//  MsgDataNotFound = 'Данные, удовлетворяющие условию поиска, не обнаружены';

var
  GroupsIndex: integer;
  GroupsCount: integer;
  ChildCount: integer;
  ColIndex: integer;
  RowIndex: integer;
  RecIndex: integer;
  CurIndex: integer;
  i, j, k: integer;
function
  Compare(ARecIndex, AColIndex: integer): boolean;
  begin
    Result :=
      AnsiContainsText
      (
        AView.DataController.DisplayTexts
        [
          ARecIndex,
          AView.VisibleColumns[AColIndex].Index
        ],
        AText
      );
  end;
begin
  Result := false;
  AView.DataController.ClearSelection;

  if AFromBeginning then
  begin
    // поиск с начала
    // строка  - первая
    // столбец - первый
    RowIndex := 0;
    ColIndex := 0;
  end
  else
  begin
    // поиск с текущей позиции
    // строка  - текущая
    // столбец - слещующий после текущего
    // если текущий столбец последний, то начинаем поиск
    // с первого столбца следующей строки
    RowIndex := AView.Controller.FocusedRowIndex;
    ColIndex := AView.Controller.FocusedColumnIndex;
    if AView.Controller.FocusedColumn.IsLast then
    begin
      ColIndex := 0;
      Inc(RowIndex);
    end
    else
      Inc(ColIndex)
  end;

  if AView.DataController.Groups.GroupingItemCount = 0 then
  begin
    // поиск в несгруппированном представлении
    for i := RowIndex to AView.ViewData.RowCount - 1 do
    begin
      RecIndex := AView.ViewData.Rows[i].RecordIndex;
      if RecIndex = -1 then
        Continue;

      for j := ColIndex to AView.VisibleColumnCount - 1 do
      begin
        Result := Compare(RecIndex, j);
        if Result then
        begin
          AView.Controller.FocusedRecordIndex := RecIndex;
          AView.Controller.FocusedColumnIndex := j;
          Break;
        end;
      end;

      ColIndex := 0;
      if Result then
        Break;
    end;
  end
  else
  begin
    // поиск в сгруппированном представлении
    GroupsCount := TcxDataControllerGroupsProtected(AView.DataController.Groups).DataGroups.Count;
    GroupsIndex := AView.DataController.Groups.DataGroupIndexByRowIndex[RowIndex];
    for i := GroupsIndex to GroupsCount - 1 do
    begin
      ChildCount := AView.DataController.Groups.ChildCount[i];
      for j := 0 to ChildCount - 1 do
      begin
        RecIndex := AView.DataController.Groups.ChildRecordIndex[i, j];
        if RecIndex = -1 then
          Continue;

        CurIndex := AView.DataController.GetRowIndexByRecordIndex(RecIndex, false);
        if (CurIndex > -1) and (CurIndex < RowIndex) then
          Continue;

        for k := ColIndex to AView.VisibleColumnCount - 1 do
        begin
          Result := Compare(RecIndex, k);
          if Result then
          begin
            AView.Controller.FocusedRowIndex    := AView.DataController.GetRowIndexByRecordIndex(RecIndex, true);
            AView.Controller.FocusedColumnIndex := k;
            Break;
          end;
        end;

        ColIndex := 0;
        if Result then
          Break;
      end;

      if Result then  Break;
    end;
  end;

  if Result then
    AView.Controller.FocusedRecord.Selected := true;

end;
Используем так:

Код:
if not SearchIncxGrid(GridDB1, edSearch.Text, GridDB1.DataController.FocusedRecordIndex = -1) then ничего не нашли
GridDB1.DataController.FocusedRecor dIndex = -1 означает, что если выбрана хоть одна запись, то ищет от неё, т.е. НЕ с начала.

Если ничего не выбрано или выбрана первая запись, а она с индексом 0, то ищет от начала грида.
X11 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в ListBox реализовать поиск по ключевому слову Applod Компоненты Delphi 0 23.11.2011 15:03
Поиск по Ключевому слову Applod Компоненты Delphi 0 22.11.2011 21:21
Копирование по слову Patriot_Rostov Microsoft Office Word 3 12.02.2011 20:44
Вопрос по слову LIKE kaa1977 SQL, базы данных 6 24.09.2009 15:48
Привязка div к слову Mattuza HTML и CSS 1 07.08.2009 19:43