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

Обработка событий DataSet в Delphi и Pascal без создания отдельных процедур

Delphi , Компоненты и Классы , TTable и TQuery

 

В процессе работы с базами данных в Delphi и Pascal часто возникает необходимость обработки событий, связанных с изменениями данных в таблицах. Например, события BeforeDelete, BeforeInsert и BeforePost. В стандартной библиотеке Delphi такие события определяются как методы объектов, а не анонимные методы или лямбды. Это может создать определенные трудности для разработчиков, желающих использовать анонимные методы для обработки событий, так как анонимные методы и метод-параметры имеют разные типы и не могут быть прямым образом приведены друг к другу.

В данной статье мы рассмотрим несколько подходов для обработки событий DataSet в Delphi и Pascal без необходимости создания отдельных процедур для каждого события каждой таблицы.

Основные проблемы

  1. Необходимость создания отдельных процедур для каждого события каждой таблицы.
  2. Невозможность прямого приведения анонимных методов к методам-параметрам.
  3. Требование использования дополнительных структур для хранения ссылок на анонимные методы.

Решение с использованием общей процедуры

Один из самых простых способов обработки событий DataSet — это использование общей процедуры, которая будет вызываться для всех таблиц. Например, можно создать процедуру AllTablesBeforeDelete, которая будет логировать операцию удаления для каждой таблицы:

type
  TForm1 = class(TForm)
    MyTable1Test: TTable;
    MyTable2Test: TTable;
    MyTable3Test: TTable;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure AllTablesBeforeDelete(DataSet: TDataSet);
  end;

procedure TForm1.AllTablesBeforeDelete(DataSet: TDataSet);
begin
  LogTableOperation(DataSet.Name + 'BeforeDelete');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyTable1Test.BeforeDelete := AllTablesBeforeDelete;
  MyTable2Test.BeforeDelete := AllTablesBeforeDelete;
  MyTable3Test.BeforeDelete := AllTablesBeforeDelete;
end;

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

Решение с использованием анонимных методов и хэш-таблиц

Для использования анонимных методов можно использовать хэш-таблицу, которая будет хранить ссылки на анонимные методы для каждого объекта DataSet. Это позволяет избежать необходимости создания отдельных процедур и использовать анонимные методы для обработки событий.

type
  TDataSetAnonimouseEvent = reference to procedure(DataSet: TDataSet);

  TForm3 = class(TForm)
    FDQuery1: TFDQuery;
    bntAddNewEvent: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure bntAddNewEventClick(Sender: TObject);
  private
    { Private declarations }
    FEventLinks : TDictionary<TComponent, TDataSetAnonimouseEvent>;
  public
    { Public declarations }
    procedure AllTablesBeforeDelete(DataSet: TDataSet);
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.AllTablesBeforeDelete(DataSet: TDataSet);
begin
  // Проверяем, есть ли анонимный метод для данного компонента
  if FEventLinks.ContainsKey(DataSet) then
  begin
    // Вызываем анонимный метод
    FEventLinks[DataSet](DataSet);
  end;
end;

procedure TForm3.bntAddNewEventClick(Sender: TObject);
begin
  // Привязываем анонимный метод к конкретному компоненту
  FEventLinks.Add(FDQuery1,
    procedure(DataSet: TDataSet)
    begin
      ShowMessage('Анонимный метод!');
    end
  );
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  FEventLinks := TDictionary<TComponent, TDataSetAnonimouseEvent>.Create;

  FDQuery1.BeforeDelete := AllTablesBeforeDelete;
end;

procedure TForm3.FormDestroy(Sender: TObject);
begin
  FreeAndNil(FEventLinks);
end;

Этот подход позволяет использовать анонимные методы для обработки событий и избежать необходимости создания отдельных процедур для каждого события каждой таблицы.

Решение с использованием оберток

Еще один подход — использование оберток (wrappers), которые позволяют привести анонимные методы к методам-параметрам. Например, можно создать обертку, которая будет вызывать анонимный метод и передавать ему объект DataSet:

type
  TMakeObjectFunc = class
  public
    class procedure Log(d: TDataSet);
  end;

{ TMakeObjectFunc }

class procedure TMakeObjectFunc.Log(d: TDataSet);
begin
  LogTableOperation('MyTableTestBeforeDelete');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyTableTest.BeforeDelete := TMakeObjectFunc.Log;
end;

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

Решение с использованием функции преобразования

Еще один способ — использование функции преобразования, которая будет преобразовывать анонимные методы в методы-параметры. Например, можно создать функцию AnonProcToDataSetNotifyEvent, которая будет преобразовывать анонимные методы в методы-параметры:

type
  TDataSetNotifyEvent = procedure(DataSet: TDataSet) of object;

  TForm1 = class(TForm)
    MyTableTest: TTable;
    procedure FormCreate(Sender: TObject);
  end;

function AnonProcToDataSetNotifyEvent(DataSet: TDataSet;
  const AnonProc: TDataSetAnonimouseEvent): TDataSetNotifyEvent;
begin
  Result := procedure(DataSet: TDataSet)
  begin
    AnonProc(DataSet);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyTableTest.BeforeDelete := AnonProcToDataSetNotifyEvent(MyTableTest,
    procedure (D: TDataSet)
    begin
      LogTableOperation('MyTableTestBeforeDelete');
    end
  );
end;

Этот подход позволяет использовать анонимные методы для обработки событий и избежать необходимости создания отдельных процедур для каждого события каждой таблицы.

Заключение

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

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

Контекст статьи — рассмотрение различных методов обработки событий DataSet в Delphi и Pascal, позволяющих избежать создания отдельных процедур для каждого события каждой таблицы, с акцентом на использование анонимных методов и функций преобразования.


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

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




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


:: Главная :: TTable и TQuery ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-22 17:57:09/0.0035290718078613/0