Спадкоємець від tibupdatesql з друкарською транзакцією

Спадкоємець від TIBUpdateSQL з друкарською транзакцією

Тут спроба впровадити в IBX принцип поділу транзакцій на "читають" і "пишуть" для компонентів типу IBCustomDataset. Використання в якості базового компонента IBUpdateSQL пояснюється бажанням мінімізувати роботу зі зміни вихідного коду і його достатністю - переробка IBDataset може спричинити за собою ймовірні проблеми при використанні нових версій IBX.

Для розуміння механізму IBUpdateSQL необхідно виділити наступні властивості і методи: private
FQueries: array [TUpdateKind] of TIBQuery;
public
property Query [UpdateKind: TUpdateKind]: TIBQuery read GetQuery; Властивість-масив FQueries зберігає покажчики на об'єкти типу TIBQuery, значення яких в початковий момент рівні nil. При першому зверненні до Query викликається метод GetQuery - він створює об'єкт і ініціалізує його властивостей IBDatabase і IBTransaction. Зазначу, що імовірна ситуація, коли один або кілька об'єктів TIBQuery просто не будуть створені, тобто не відбувалися зміни даних і FDataset не звертався до методу UpdateObject.Apply. Простіше кажучи, компонент IBUpdateSQL робить "ручну" роботу на кшталт var
MySql: TIBSQL;

MySql: = TIBSQL.Create (nil);
MySql.database: = dm.Base;
MySql.Transaction: = dm.trRead;
MySql.SQL: = 'la-la-la';

finalization
if Assigned (MySql) then
MySql.Free; Все це реалізовано в методі GetQuery.

Для вирішення завдання по "впровадження" транзакції необхідно написати код:
  1. обробки події SetUpdateTransaction
  2. внести зміни в GetQuery
  3. обробити подія Notification
  4. обійти приватність і статичність
Якщо з першими трьома пунктами більш-менш зрозуміло, то останній пункт вимагає підміни FQueries і деяких методів. Нижче наведено рішення, яке в різних варіаціях використовується мною на протязі декількох років.