Это поочередный поиск заданого значения (начало, середина, один символ и тд.), при чем регистр не имеет значения. Поиск по больших выборках даных
будет несколько долговат, но наглядный.
procedure SearchValue(AQuery: TADOQuery; AField, AValue: string);
var
i: integer;
NoRec: integer;
beginwith AQuery dobegin
First;
for i := 0 to RecordCount - 1 dobeginif (not Eof) and (Pos(AnsiLowerCase(AValue),
AnsiLowerCase(FieldByName(AField).AsString)) <> 0) thenbeginif MessageBox(HWND_DESKTOP, PChar('Заданое значение найдено!' + #10#13+
' Продолжать поиск'), 'Поиск', MB_YESNO +
MB_ICONINFORMATION + MB_DEFBUTTON1) = IDYES thenbegin
NoRec := RecNo;
Next;
endelse
Break;
endelse
Next;
end;
MoveBy(NoRec - RecordCount);
MessageBox(HWND_DESKTOP, PChar('Поиск завершен!'), 'Поиск', MB_OK +
MB_ICONINFORMATION + MB_DEFBUTTON1);
end;
end;
// А это пример того, как я вызывал// процедуру поиска через TActionListprocedure 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, которое является значением, которое нужно найти.
Процедура перебирает все записи в запросе, проверяя, существует ли это значение в указанном поле. Если она находит совпадение, то спрашивает пользователя продолжать поиск или остановить. Если пользователь выбирает остановку, то процедура перемещается к предыдущей записи и отображает сообщение о том, что поиск был завершен.
Вот некоторые предложения для улучшения этого кода:
Обработка ошибок: код не обрабатывает ошибки должным образом. Например, если запрос не может выполниться, то приложение будет крашиться. Нужно добавить блоки try-except для ловли любых исключений, которые могут возникнуть во время выполнения.
Выполнительность: поиск в большом количестве данных может быть медленным и ресурсоемким. Может быть полезно использовать индекс на поле, которое ищется, или реализовать более эффективный алгоритм поиска.
Интерфейс пользователя: код отображает сообщения для запроса ввода и вывода результатов. Это может быть раздражающим и может нарушить workflow пользователя. Рекомендуется использовать альтернативные элементы интерфейса, такие как панель поиска с кнопкой "Найти следующий".
Организация кода: процедура SearchValue является quite длинной и выполняет несколько не связанных задач (поиск, запрос ввода, отображение сообщений). Может быть полезно разбить ее на более маленькие процедуры или функции, каждая из которых выполняет конкретную задачу.
Вот обновленная версия кода с некоторыми из этих предложений реализованными:
procedureSearchValue(constAQuery:TADOQuery;constAField,AValue:string);vari:integer;begintrywithAQuerydobeginFirst;fori:=0toRecordCount-1dobeginifPos(AnsiLowerCase(AValue),AnsiLowerCase(FieldByName(AField).AsString))<>0thenbegin// Найдено совпадение, спрашиваем пользователя продолжать поиск или остановитьifMessageBox(HWND_DESKTOP,PChar('Заданное значение найдено!'+#10#13+' Продолжать поиск'),'Поиск',MB_YESNO+MB_ICONINFORMATION+MB_DEFBUTTON1)=IDYESthenbegin// Продолжить поискNext;endelsebegin// Остановить поиск, переместиться к предыдущей записи и отобразить сообщениеMoveBy(RecNo-RecordCount);MessageBox(HWND_DESKTOP,PChar('Поиск завершен!'),'Поиск',MB_OK+MB_ICONINFORMATION+MB_DEFBUTTON1);Exit;end;endelseNext;end;end;except// Обработать любые ошибки, которые могут возникнуть во время выполненияonE:ExceptiondoMessageBox(HWND_DESKTOP,PChar('Ошибка произошла: '+E.Message),'Ошибка',MB_OK);end;end;procedureTfmMain.acSearchExecute(Sender:TObject);varS:string;beginS:='';S:=InputBox('Поиск','Введите значение для поиска:',S);ifS<>''thenSearchValue(((Screen.ActiveControlasTDBGridEh).DataSource.DataSetasTADOQuery),(Screen.ActiveControlasTDBGridEh).SelectedField.FieldName,S);end;procedureTfmMain.acSearchUpdate(Sender:TObject);begin(SenderasTAction).Enabled:=Assigned(Screen.ActiveControl)and(Screen.ActiveControlisTDBGridEh);end;
Обратите внимание, что я удалил переменную NoRec и заменял ее на простой счетчик (i). Я также добавил обработку ошибок в процедуре SearchValue. Кроме того, я разбил код на более маленькие процедуры для улучшения организации и поддержки.
В статье описан алгоритм поочередного поиска заданного значения в больших выборках данных, реализованный с помощью процедуры SearchValue на языке Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.