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

Улучшение функциональности DBGrid: динамическая фильтрация данных в Delphi

Delphi , Базы данных , ADO

В современных приложениях, разработанных с использованием Delphi, часто возникает необходимость в улучшении взаимодействия пользователя с данными. Одним из способов достижения этого является добавление функционала динамической фильтрации для компонента DBGrid. В данной статье мы рассмотрим, как можно реализовать такую функциональность, используя пример кода на Object Pascal.

Класс для хранения расширенных элементов

Для начала, определим класс, который будет хранить идентификаторы элементов, используемые для поддержания состояния их развернутости.

type
  //Store ID's used to keep expanded items
  TPlanningFilterItem = class(TObject)
    public
      Sublevel, ProjectID, OnderdeelID, MedewerkerID: integer;
  end;

Захват клика по индикатору

Следующим шагом будет реализация процедуры захвата клика по индикатору в DBGrid. При двойном клике по определенной ячейке, мы будем добавлять или удалять фильтр.

procedure TFPlanningOverzicht.GridPlanningDblClick(Sender: TObject);
var
  P: TPoint;
  C: TGridCoord;
begin
  GetCursorPos(P);
  P := (Sender as TCustomGrid).ScreenToClient(P);
  C := (Sender as TCustomGrid).MouseCoord(P.X, P.Y);

  //Only capture indicator row X = 0
  //Ignore title indicator Y > 1
  if (C.X = 0) AND (C.Y > 0) then
    begin
      DatasetFilterToevoegenVerwijderen;
      FilterDataSet;
    end;
end;

Добавление или удаление фильтра

Далее, мы реализуем процедуру для добавления или удаления фильтра на основе текущих данных в DBGrid.

procedure TFPlanningOverzicht.DatasetFilterToevoegenVerwijderen;
var
  newFilterItem: TPlanningFilterItem;
  tmp: TPlanningFilterItem;
  I: Integer;
begin
  newFilterItem := TPlanningFilterItem.Create;
  newFilterItem.Sublevel := DPlanning.PlanningOverzicht.FieldByName('SUBLEVEL').AsInteger;
  newFilterItem.ProjectID := DPlanning.PlanningOverzicht.FieldByName('ProjectID').AsInteger;
  newFilterItem.OnderdeelID := DPlanning.PlanningOverzicht.FieldByName('OnderdeelID').AsInteger;
  newFilterItem.MedewerkerID := DPlanning.PlanningOverzicht.FieldByName('MedewerkerID').AsInteger;

  //Ignore expand when deepest lvl reached
  if newFilterItem.Sublevel > 2 then
    Exit;

  for I := 0 to GridFilterItems.Count - 1 do
  begin
    //Compare to existing
    tmp := GridFilterItems.Items[I];
    if (tmp.Sublevel = newFilterItem.Sublevel) AND
        (tmp.ProjectID = newFilterItem.ProjectID) AND
        (tmp.OnderdeelID = newFilterItem.OnderdeelID) AND
        (tmp.MedewerkerID = newFilterItem.MedewerkerID)
    then
    begin
      //If item currently expanded collapse and exit
      GridFilterItems.Delete(I);
      Exit;
    end;
  end;

  //Item not yet expanded, so expand
  GridFilterItems.Add(newFilterItem);
end;

Применение фильтра

Последним этапом будет процедура, которая применяет заданный фильтр к данным, отображаемым в DBGrid.

procedure TFPlanningOverzicht.FilterDataSet;
var
  I: Integer;
  tmp: TPlanningFilterItem;
  Filter: string;
  C: Integer;
begin
  //Always show top level items
  Filter := '(SUBLEVEL = ''' + IntToStr(1) + ''' ) OR ';

  for I := 0 to GridFilterItems.Count - 1 do
  begin
    tmp := GridFilterItems[I];

    //Expand when 1st row selected (shoud be written to your case)
    if (tmp.Sublevel= 1) then
    begin
      Filter := Filter +
      '(MedewerkerID = ''' + IntToStr(tmp.MedewerkerID) + ''' AND ' +
      'SUBLEVEL = ''' + IntToStr(2) + ''' ) OR ';
    end
    else
    begin
      //Expands for the second level (shoud be written to your case)
      Filter := Filter +
      '(MedewerkerID = ''' + IntToStr(tmp.MedewerkerID) + ''' AND ' +
      'OnderdeelID = ''' + IntToStr(tmp.OnderdeelID) + ''' AND ' +
      'SUBLEVEL = ''' + IntToStr(3) + ''' ) OR ';
    end;
  end;

  //Remove last OR
  Delete(Filter, Filter.Length - 2, 3);

  GridPlanning.DataSource.DataSet.Filter := Filter;
  GridPlanning.DataSource.DataSet.Filtered := True;
end;

Данный код позволяет пользователю динамически управлять отображением данных в DBGrid, что значительно улучшает удобство работы с большими объемами информации. Приведенные примеры процедур могут быть адаптированы для различных сценариев использования, в зависимости от конкретных требований и структуры данных приложения.

Подтвержденный ответ

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

Альтернативный ответ

Альтернативные решения могут включать использование встроенных механизмов фильтрации, предоставляемых компонентами Delphi, таких как TDataSetProvider и TClientDataSet, которые позволяют более гибко работать с данными и их представлениями. Тем не менее, представленные примеры кода являются базовым решением для динамической фильтрации и могут служить хорошей отправной точкой для более сложных проектов.


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

Создано по материалам из источника по ссылке.

Улучшение функциональности DBGrid в Delphi включает реализацию динамической фильтрации данных для повышения удобства работы пользователя с информацией.


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

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




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


:: Главная :: ADO ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-13 20:51:13/0.0035178661346436/0