Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Поочередный поиск заданного значения

Delphi , Базы данных , Поиск

Поочередный поиск заданного значения

Автор: Панасюк Артем

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

procedure SearchValue(AQuery: TADOQuery; AField, AValue: string);
var
  i: integer;
  NoRec: integer;
begin
  with AQuery do
  begin
    First;
    for i := 0 to RecordCount - 1 do
    begin
      if (not Eof) and (Pos(AnsiLowerCase(AValue),
        AnsiLowerCase(FieldByName(AField).AsString)) <> 0) then
      begin
        if MessageBox(HWND_DESKTOP, PChar('Заданое значение найдено!' + #10#13+
         '   Продолжать поиск'), 'Поиск', MB_YESNO +
          MB_ICONINFORMATION + MB_DEFBUTTON1) = IDYES then
        begin
          NoRec := RecNo;
          Next;
        end
        else
          Break;
      end
      else
        Next;
    end;
    MoveBy(NoRec - RecordCount);
    MessageBox(HWND_DESKTOP, PChar('Поиск завершен!'), 'Поиск', MB_OK +
      MB_ICONINFORMATION + MB_DEFBUTTON1);
  end;
end;

// А это пример того, как я вызывал
// процедуру поиска через TActionList

procedure TfmMain.acSearchExecute(Sender: TObject);
var
  S: string;
begin
  S := '';
  S := InputBox('Поиск', 'Введите значение для поиска:', S);
  if S <> '' then
    SearchValue(((Screen.ActiveControl as TDBGridEh).DataSource.DataSet as
      TADOQuery), (Screen.ActiveControl as
      TDBGridEh).SelectedField.FieldName, S);
end;

procedure TfmMain.acSearchUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled :=
    Assigned(Screen.ActiveControl) and
    (Screen.ActiveControl is TDBGridEh);
end;

Here is the translation of the content into Russian:

Это код Delphi для поиска значения в таблице базы данных. Процедура SearchValue принимает три параметра: AQuery, которое является экземпляром TADOQuery; AField, которое является именем поля, в котором нужно найти значение; и AValue, которое является значением, которое нужно найти.

Процедура перебирает все записи в запросе, проверяя, существует ли это значение в указанном поле. Если она находит совпадение, то спрашивает пользователя продолжать поиск или остановить. Если пользователь выбирает остановку, то процедура перемещается к предыдущей записи и отображает сообщение о том, что поиск был завершен.

Вот некоторые предложения для улучшения этого кода:

  1. Обработка ошибок: код не обрабатывает ошибки должным образом. Например, если запрос не может выполниться, то приложение будет крашиться. Нужно добавить блоки try-except для ловли любых исключений, которые могут возникнуть во время выполнения.
  2. Выполнительность: поиск в большом количестве данных может быть медленным и ресурсоемким. Может быть полезно использовать индекс на поле, которое ищется, или реализовать более эффективный алгоритм поиска.
  3. Интерфейс пользователя: код отображает сообщения для запроса ввода и вывода результатов. Это может быть раздражающим и может нарушить workflow пользователя. Рекомендуется использовать альтернативные элементы интерфейса, такие как панель поиска с кнопкой "Найти следующий".
  4. Организация кода: процедура SearchValue является quite длинной и выполняет несколько не связанных задач (поиск, запрос ввода, отображение сообщений). Может быть полезно разбить ее на более маленькие процедуры или функции, каждая из которых выполняет конкретную задачу.

Вот обновленная версия кода с некоторыми из этих предложений реализованными:

procedure SearchValue(const AQuery: TADOQuery; const AField, AValue: string);
var
  i: integer;
begin
  try
    with AQuery do
    begin
      First;
      for i := 0 to RecordCount - 1 do
      begin
        if Pos(AnsiLowerCase(AValue), AnsiLowerCase(FieldByName(AField).AsString)) <> 0 then
        begin
          // Найдено совпадение, спрашиваем пользователя продолжать поиск или остановить
          if MessageBox(HWND_DESKTOP, PChar('Заданное значение найдено!' + #10#13 +
             '   Продолжать поиск'), 'Поиск', MB_YESNO + MB_ICONINFORMATION + MB_DEFBUTTON1) = IDYES then
          begin
            // Продолжить поиск
            Next;
          end
          else
          begin
            // Остановить поиск, переместиться к предыдущей записи и отобразить сообщение
            MoveBy(RecNo - RecordCount);
            MessageBox(HWND_DESKTOP, PChar('Поиск завершен!'), 'Поиск', MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON1);
            Exit;
          end;
        end
        else
          Next;
      end;
    end;
  except
    // Обработать любые ошибки, которые могут возникнуть во время выполнения
    on E: Exception do
      MessageBox(HWND_DESKTOP, PChar('Ошибка произошла: ' + E.Message), 'Ошибка', MB_OK);
  end;
end;

procedure TfmMain.acSearchExecute(Sender: TObject);
var
  S: string;
begin
  S := '';
  S := InputBox('Поиск', 'Введите значение для поиска:', S);
  if S <> '' then
    SearchValue(((Screen.ActiveControl as TDBGridEh).DataSource.DataSet as TADOQuery), (Screen.ActiveControl as TDBGridEh).SelectedField.FieldName, S);
end;

procedure TfmMain.acSearchUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled :=
    Assigned(Screen.ActiveControl) and
      (Screen.ActiveControl is TDBGridEh);
end;

Обратите внимание, что я удалил переменную NoRec и заменял ее на простой счетчик (i). Я также добавил обработку ошибок в процедуре SearchValue. Кроме того, я разбил код на более маленькие процедуры для улучшения организации и поддержки.

В статье описан алгоритм поочередного поиска заданного значения в больших выборках данных, реализованный с помощью процедуры SearchValue на языке Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Поиск ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-02 21:53:30/0.0042440891265869/0