Catalog · How the catalog works
Delphi-Generic-Database
Classes para Conexão Agnóstica à Bancos de Dados e Exibição de Dados em Componentes de Forma Persistente
- ★ 7 on GitHub
Anyone may press Interesting, signed in or not. It helps others find this project.
README
Delphi-Generic-Database
Delphi-Generic-Database é uma biblioteca Delphi para conexão genérica a bancos de dados e exibição dos dados em componentes nativos FMX de forma rápida, simples e desacoplada. Toda a lógica de engine é isolada via Strategy Pattern.
Bancos de Dados Suportados
| Engine | SQLite | MySQL/MariaDB | Firebird | Interbase | PostgreSQL | SQL Server | Oracle |
|---|---|---|---|---|---|---|---|
| FireDAC | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
| dbExpress | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
| ZeOSLib | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
| UniDAC | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
Arquitetura
Source/
????????? Connection/ # Camada de acesso a dados
??? ????????? Connection.pas # IConnection + TConnection (Strategy Pattern)
??? ????????? Connection.Types.pas # TDriver, TEngine, TConnectionParams
??? ????????? Query.pas # TQuery ??? execu????o de consultas
??? ????????? QueryBuilder.pas # TQueryBuilder ??? constru????o SQL gen??rica
??? ????????? Helpers/QueryHelper.pas # Helper de extens??o para TQuery
??? ????????? Registry/ # EngineRegistry ??? auto-registro via Factory.initialization
??? ????????? Strategy/ # Interfaces: IConnectionStrategy, IQueryStrategy, IEngineFactory, IDriverConfigurator
??? ????????? Engine/ # Implementa????es por biblioteca de acesso ??? ver Engine/README.md
??? ??? ????????? Adapters/
??? ??? ????????? Connection.All.pas # Todas as engines (uses Connection.*.All)
??? ??? ????????? dbExpress/ # Connection.dbExpress.All.pas + Core/ + Drivers/
??? ??? ????????? FireDAC/ # Connection.FireDAC.All.pas + Core/ + Drivers/
??? ??? ????????? ZeOS/ # Connection.ZeOS.All.pas + Core/ + Drivers/
??? ??? ????????? UniDAC/ # Connection.UniDAC.All.pas + Core/ + Drivers/
??? ????????? Config/ # Carregamento de configura????o
??? ????????? Connection.Config.All.pas
??? ????????? Connection.Config.Types.pas
??? ????????? Connection.Config.Intf.pas
??? ????????? Connection.Config.Factory.pas
??? ????????? Core/ # Connection.Config.Loader.Abstract.pas
??? ????????? Mapper/ # Connection.Config.*.Mapper.pas
??? ????????? Static/ # Loaders TConnectionConfig* (INI, JSON, XML, YAML, TOML)
??? ????????? Adapters/ # Connection.Config.Adapter.*.pas
????????? Connector/ # Binding de TQuery a componentes FMX
??? ????????? Connector.pas # TConnector ??? m??todos ToGrid, ToStringGrid, ToListBox, ToListView, ToComboBox, ToComboEdit, ToEdit
??? ????????? Options/ # Helpers de op????es (units `Options.*`)
??? ????????? Options.Intf.pas
??? ????????? Options.Integer.pas
??? ????????? Options.Array.pas
??? ????????? Options.JSON.pas
????????? Types/ # Tipos auxiliares (units `Types.*` e `Type.*` onde indicado)
??? ????????? Types.Locale.pas
??? ????????? Types.Strings.pas
??? ????????? Types.Float.pas
??? ????????? Type.DateTime.pas # `TTimeDate`, `TLocaleTimeDate` (antes TimeDate.pas)
??? ????????? Type.Money.json / Type.Money.json.inc
??? ????????? Types.Array.Intf.pas # `IArrayInterface<T>`
??? ????????? Types.ArrayGuard.Intf.pas
??? ????????? Types.Array.pas # record `IArray<T>` + `TArrayGuard`
??? ????????? Types.Array.String.pas / .Field / .Variant / .Assoc
??? ????????? Types.Array.StringHelper.pas / .FieldHelper / .VariantHelper
????????? Helpers/ # Class helpers para componentes FMX
??? ????????? FMX.Edit/ # TEdit helper
??? ????????? FMX.ComboBox/ # TComboBox helper
??? ????????? FMX.ComboEdit/ # TComboEdit helper
??? ????????? FMX.Grid/ # TGrid helper
??? ????????? FMX.StringGrid/ # TStringGrid helper
??? ????????? FMX.ListBox/ # TListBox helper
??? ????????? FMX.ListView/ # TListView helper
??? ????????? FMX.Objects/ # Objetos FMX helpers
??? ????????? ArrayHelper/ # Helper gen??rico de array
??? ????????? DictionaryHelper/ # Helper gen??rico de dicion??rio
????????? Extensions/ # Extens??es de componentes FMX
??? ????????? FMX.Edit/ # FMX.Edit.Extension ??? funcionalidades extras para TEdit
??? ????????? FMX.ListView/ # FMX.ListView.Extension ??? suporte multi-vers??o (Berlin..Sydney)
????????? SmartPointer/ # Gerenciamento autom??tico de ciclo de vida
??? ????????? ISmartPointer.pas
??? ????????? TSmartPointer.pas # TSmartPointer<T> ??? RAII gen??rico compat??vel com TInterfacedObject
????????? EventDriven/
??? ????????? EventDriven.pas # Delega????o de eventos no padr??o MVE (Model-View-Event)
????????? Reflection/
??? ????????? RTTI.pas # Utilit??rios de reflex??o RTTI
??? ????????? Registry.pas # Registry gen??rico
??? ????????? MimeType.pas # Detec????o de MIME types por extens??o/stream
????????? Vendor/ # Depend??ncias embutidas
????????? FastMM4/ # Memory manager FastMM4
????????? FastMM5/ # Memory manager FastMM5
????????? XSuperObject/ # Parser JSON de alta performanceComponentes Principais
Connection — Conexão Genérica a Bancos de Dados
TConnection implementa IConnection e delega toda a lógica de engine para IConnectionStrategy. As implementações ficam em Source/Connection/Engine/Adapters/<engine>/: pasta Core/ (Factory, Connection.Strategy, Query.Strategy) e Drivers/ (um .pas por TDriver). Agregadores: Connection.All (quatro engines), Connection.dbExpress.All, Connection.FireDAC.All, Connection.ZeOS.All, Connection.UniDAC.All — cada um faz uses de Core + drivers da engine (ou de outros .All). Incluir só o Factory em Core/ também funciona — o registro ocorre via initialization.
Conexão direta (gerenciamento manual):
uses
Connection, Connection.Types,
FireDAC.Factory; // registra FireDAC no EngineRegistry
var
DB: TConnection;
begin
DB := TConnection.Create(TEngine.FireDAC);
try
DB.Driver := TDriver.MySQL;
DB.Host := 'localhost';
DB.Port := 3306;
DB.Database := 'mydb';
DB.Username := 'root';
DB.Password := 'secret';
DB.Connected := True;
// ... uso
finally
DB.Destroy;
end;
end;Conexão com SmartPointer — FireDAC/SQLite:
TSmartPointer<T> elimina o try/finally manual: a conexão e a query são liberadas automaticamente ao sair do escopo. O TConnector é obtido via cast implícito de ISmartPointer<TConnector>, também sem Free explícito.
uses
Connection, Connection.Types, Query, QueryBuilder, Connector,
ISmartPointer, TSmartPointer,
FireDAC.Factory;
var
DB: TSmartPointer<TConnection>;
SQL: TSmartPointer<TQuery>;
QBuilder: TQueryBuilder;
Connector: TConnector;
begin
// SmartPointer gerencia TConnection — sem try/finally
DB := TSmartPointer<TConnection>.Create(TConnection.Create(TEngine.FireDAC));
DB.Ref.Driver := TDriver.SQLite;
DB.Ref.Database := ExtractFilePath(ParamStr(0)) + 'DB.SQLITE';
if not DB.Ref.Connected then
DB.Ref.Connected := True;
QBuilder := TQueryBuilder.ForConnection(DB.Ref.GetConnectionStrategy);
// SmartPointer gerencia TQuery
SQL := TSmartPointer<TQuery>.Create(QBuilder.View('SELECT id AS Codigo, nome AS Estado, sigla AS Sigla FROM estado ORDER BY id'));
// TConnector via ISmartPointer — liberado com o escopo
Connector := ISmartPointer<TConnector>(TConnector.Create(SQL.Ref));
Connector.ToCombo(ComboBoxSQLite, 'Codigo', 'Estado', '{"Index":1}');
Connector.ToCombo(EditSQLite, 'Codigo', 'Estado', '{"Field":{"Codigo":3}}');
Connector.ToCombo(ComboEditSQLite, 'Codigo', 'Estado', '{"Index":5}');
Connector.ToListBox(ListBoxSQLite, 'Codigo', 'Estado', '{"Field":{"Estado":"Bahia"}}');
Connector.ToGrid(StringGridSQLite, '{"Field":{"Sigla":"AP"}}');
Connector.ToGrid(GridSQLite, '{"Field":{"Estado":"Distrito Federal"}}');
Connector.ToListView(ListViewSQLite, 'Codigo', 'Estado', ['Codigo', 'Estado', 'Sigla'], '{"Field":{"Sigla":"PA"}}');
end;Conexão com SmartPointer — dbExpress/SQLite:
Idêntico ao anterior mas usando dbExpress.Factory. O TConnector é gerenciado com try/finally explícito enquanto TConnection e TQuery ficam sob TSmartPointer.
uses
Connection, Connection.Types, Query, QueryBuilder, Connector,
TSmartPointer,
dbExpress.Factory;
var
DB: TSmartPointer<TConnection>;
SQL: TSmartPointer<TQuery>;
QBuilder: TQueryBuilder;
Connector: TConnector;
begin
DB := TSmartPointer<TConnection>.Create(TConnection.Create(TEngine.dbExpress));
DB.Ref.Driver := TDriver.SQLite;
DB.Ref.Database := ExtractFilePath(ParamStr(0)) + 'DB.SQLITE';
if not DB.Ref.Connected then
DB.Ref.Connected := True;
QBuilder := TQueryBuilder.ForConnection(DB.Ref.GetConnectionStrategy);
SQL := TSmartPointer<TQuery>.Create(QBuilder.View('SELECT id AS Codigo, nome AS Estado, sigla AS Sigla FROM estado ORDER BY id'));
Connector := TConnector.Create(SQL.Ref);
try
Connector.ToCombo(ComboBoxSQLite, 'Codigo', 'Estado', '{"Index":1}');
Connector.ToCombo(EditSQLite, 'Codigo', 'Estado', '{"Field":{"Codigo":3}}');
Connector.ToCombo(ComboEditSQLite, 'Codigo', 'Estado', '{"Index":5}');
Connector.ToListBox(ListBoxSQLite, 'Codigo', 'Estado', '{"Field":{"Estado":"Bahia"}}');
Connector.ToGrid(StringGridSQLite, '{"Field":{"Sigla":"AP"}}');
Connector.ToGrid(GridSQLite, '{"Field":{"Estado":"Distrito Federal"}}');
Connector.ToListView(ListViewSQLite, 'Codigo', 'Estado', ['Codigo', 'Estado', 'Sigla'], '{"Field":{"Sigla":"PA"}}');
finally
Connector.Free;
end;
end;Configuração a partir de arquivo:
Inclua as units com um único agregador (Connection.Config.All) e use TConnection + factory ou loader estático:
uses
Connection.Config.All,
FireDAC.Factory;
var
Conn: TConnection;
begin
Conn := TConnectionConfigFactory.FromFile('config.ini').LoadFromFile('config.ini');
Conn.Connected := True;
end;Ou diretamente o loader em Source/Connection/Config/Static/ (herdam de TConnectionConfigLoader e delegam o mapeamento às units Mapper\Connection.Config.*.Mapper.pas):
uses Connection.Config.All, FireDAC.Factory;
var Conn: TConnection;
begin
Conn := TConnectionConfigINI.LoadFromFile('config.ini');
Conn.Connected := True;
end;Formatos suportados: INI, JSON, XML, YAML, TOML. Documentação detalhada: Source/Connection/Config/README.md. Pacote opcional: Source/Packages/GenericDatabase.Connection.Config.dpk.
Layout das engines (Core/Drivers e agregadores): Source/Connection/Engine/README.md. Pacotes .dpk: Source/Packages/README.md.
Query — Execução de Consultas
TQuery encapsula a execução de SQL sobre uma IConnection de forma agnóstica à engine.
uses Query;
var Q: TQuery;
begin
Q := TQuery.Create(Conn);
Q.SQL := 'SELECT * FROM users WHERE active = :active';
Q.Params['active'] := True;
Q.Open;
while not Q.EOF do
begin
Writeln(Q.Fields['name'].AsString);
Q.Next;
end;
end;QueryBuilder — Construção SQL Genérica
TQueryBuilder é um record que oferece métodos genéricos para montar e executar SELECT, INSERT, UPDATE, DELETE e REPLACE usando os tipos Array* como entrada de colunas e filtros.
uses QueryBuilder, ArrayVariant;
var
QB: TQueryBuilder;
Data: TArrayVariant;
begin
QB.Use(Conn.GetConnectionStrategy);
Data := TArrayVariant.Create;
Data['name'] := 'John';
Data['email'] := 'john@example.com';
QB.Insert('users', Data, {Run=}True);
end;Connector — Binding de TQuery a Componentes FMX
TConnector substitui os componentes DB* do VCL (DBGrid, DBEdit, etc.) para FMX, conectando uma TQuery diretamente aos componentes nativos do FireMonkey, inclusive de forma bidirecional.
| Método | Componente | Parâmetros-chave |
|---|---|---|
ToGrid |
TGrid / TStringGrid | filtro JSON opcional |
ToListBox |
TListBox | campo-chave, campo-label, filtro JSON |
ToListView |
TListView | campo-chave, campo-label, campos extras, filtro JSON |
ToCombo |
TComboBox / TComboEdit / TEdit | campo-chave, campo-label, filtro JSON |
O parâmetro de filtro aceita JSON com duas estratégias:
| Estratégia | JSON | Significado |
|---|---|---|
| Por índice | {"Index": 5} |
Seleciona a linha pelo índice (base 0) |
| Por campo | {"Field": {"nome_campo": "valor"}} |
Seleciona a primeira linha cujo campo bata com o valor |
Exemplo completo — Firebird via FireDAC:
uses
Connection, Connection.Types, Query, QueryBuilder, Connector,
FireDAC.Factory;
var
DB: TConnection;
SQL: TQuery;
QBuilder: TQueryBuilder;
Conn: TConnector;
begin
DB := TConnection.Create(TEngine.FireDAC);
try
DB.Driver := TDriver.Firebird;
DB.Host := 'localhost';
DB.Port := 3050;
DB.Database := '/firebird/data/DB.FDB';
DB.Username := 'sysdba';
DB.Password := 'masterkey';
DB.Connected := True;
QBuilder := TQueryBuilder.ForConnection(DB.GetConnectionStrategy);
SQL := nil;
try
SQL := QBuilder.View('SELECT "id" AS "Codigo", "nome" AS "Estado", "sigla" AS "Sigla" FROM "estado" ORDER BY "id"');
Conn := TConnector.Create(SQL);
try
// TComboBox — seleciona pelo índice
Conn.ToCombo(ComboBoxFirebird, 'Codigo', 'Estado', '{"Index":1}');
// TEdit — seleciona pelo valor do campo Codigo = 3
Conn.ToCombo(EditFirebird, 'Codigo', 'Estado', '{"Field":{"Codigo":3}}');
// TComboEdit — seleciona pelo índice 5
Conn.ToCombo(ComboEditFirebird,'Codigo', 'Estado', '{"Index":5}');
// TListBox — filtra por nome de estado
Conn.ToListBox(ListBoxFirebird,'Codigo', 'Estado', '{"Field":{"Estado":"Bahia"}}');
// TStringGrid — filtra por sigla
Conn.ToGrid(StringGridFirebird,'{"Field":{"Sigla":"AP"}}');
// TGrid — filtra por nome completo
Conn.ToGrid(GridFirebird, '{"Field":{"Estado":"Distrito Federal"}}');
// TListView — múltiplos campos visíveis, filtra por sigla
Conn.ToListView(ListViewFirebird, 'Codigo', 'Estado', ['Codigo', 'Estado', 'Sigla'], '{"Field":{"Sigla":"PA"}}');
finally
Conn.Destroy;
end;
finally
SQL.Free;
end;
finally
DB.Destroy;
end;
end;Exemplo — MySQL/MariaDB via FireDAC:
DB := TConnection.Create(TEngine.FireDAC);
DB.Driver := TDriver.MySQL;
DB.Host := 'localhost';
DB.Port := 3306;
DB.Database := 'demodev';
DB.Username := 'root';
DB.Password := 'masterkey';
DB.Connected := True;
QBuilder := TQueryBuilder.ForConnection(DB.GetConnectionStrategy);
SQL := QBuilder.View('SELECT id AS Codigo, nome AS Estado, sigla AS Sigla FROM estado ORDER BY id');
Conn := TConnector.Create(SQL);
Conn.ToCombo(ComboBoxMySQL, 'Codigo', 'Estado', '{"Index":1}');
Conn.ToListBox(ListBoxMySQL, 'Codigo', 'Estado', '{"Field":{"Estado":"Bahia"}}');
Conn.ToGrid(GridMySQL, '{"Field":{"Estado":"Distrito Federal"}}');
Conn.ToListView(ListViewMySQL, 'Codigo', 'Estado', ['Codigo', 'Estado', 'Sigla'], '{"Field":{"Sigla":"PA"}}');Exemplo — PostgreSQL via FireDAC:
DB := TConnection.Create(TEngine.FireDAC);
DB.Driver := TDriver.PostgreSQL;
DB.Host := 'localhost';
DB.Port := 5432;
DB.Schema := 'public';
DB.Database := 'demodev';
DB.Username := 'postgres';
DB.Password := 'masterkey';
DB.Connected := True;
SQL := TQueryBuilder.ForConnection(DB.GetConnectionStrategy).View(
'SELECT "id" AS "Codigo", "nome" AS "Estado", "sigla" AS "Sigla" FROM "estado" ORDER BY "id"');
Conn := TConnector.Create(SQL);
Conn.ToGrid(StringGridPostgreSQL, '{"Field":{"Sigla":"AP"}}');
Conn.ToGrid(GridPostgreSQL, '{"Field":{"Estado":"Distrito Federal"}}');Exemplo — SQL Server via FireDAC:
DB := TConnection.Create(TEngine.FireDAC);
DB.Driver := TDriver.MSSQL;
DB.Host := 'localhost';
DB.Port := 1433;
DB.Database := 'demodev';
DB.Username := 'sa';
DB.Password := 'masterkey';
DB.Connected := True;
SQL := TQueryBuilder.ForConnection(DB.GetConnectionStrategy).View('SELECT "id" AS "Codigo", "nome" AS "Estado", "sigla" AS "Sigla" FROM "estado" ORDER BY "id"');
Conn := TConnector.Create(SQL);
Conn.ToListView(ListViewMSSQL, 'Codigo', 'Estado', ['Codigo', 'Estado', 'Sigla'], '{"Field":{"Sigla":"PA"}}');Exemplo — Oracle via FireDAC:
DB := TConnection.Create(TEngine.FireDAC);
DB.Driver := TDriver.Oracle;
DB.Host := 'localhost';
DB.Port := 1521;
DB.Schema := 'HR';
DB.Database := 'ORCL';
DB.Username := 'hr';
DB.Password := 'masterkey';
DB.Connected := True;
SQL := TQueryBuilder.ForConnection(DB.GetConnectionStrategy).View('SELECT "id" AS "Codigo", "nome" AS "Estado", "sigla" AS "Sigla" FROM HR."estado" ORDER BY "id"');
Conn := TConnector.Create(SQL);
Conn.ToGrid(GridOracle, '{"Field":{"Estado":"Distrito Federal"}}');
Conn.ToListView(ListViewOracle, 'Codigo', 'Estado', ['Codigo', 'Estado', 'Sigla'], '{"Field":{"Sigla":"PA"}}');Tipos Array — Arrays Associativos PHP-Like
Quatro variantes de arrays associativos para uso como parâmetros do QueryBuilder e estruturas internas:
| Classe | Herança | Uso |
|---|---|---|
TArrayString |
TStringList |
Array bidimensional exclusivamente de strings |
TArrayVariant |
TDictionary<Variant, Variant> |
Array genérico com chaves e valores Variant |
TArrayField |
TDictionary<Variant, TField> |
Mapeamento de campo para TField |
TArrayAssoc |
TDictionary<Variant, TPair<Variant, TArrayAssoc>> |
Array multidimensional aninhado |
SmartPointer — Gerenciamento de Ciclo de Vida
TSmartPointer<T> é um record RAII que libera automaticamente objetos ao sair de escopo. Compatível com TInterfacedObject (usa _Release em vez de Free quando aplicável).
uses TSmartPointer;
var SP: TSmartPointer<TMyClass>;
begin
SP := TMyClass.Create;
SP.Ref.DoSomething; // liberado automaticamente ao fim do escopo
end;EventDriven — Delegação de Eventos (MVE)
EventDriven.pas provê infraestrutura para delegação de eventos no padrão MVE (Model-View-Event), separando a lógica de UI da lógica de negócio em aplicações FMX.
Bibliotecas de Configuração e Serialização (Vendor)
Além das dependências de acesso a dados, o projeto inclui (via Boss) as seguintes bibliotecas utilitárias:
| Biblioteca | Repositório | Finalidade |
|---|---|---|
| FastMM4 | github.com/pleriche/FastMM4 |
Memory manager clássico para Delphi Win32 |
| FastMM5 | github.com/pleriche/FastMM5 |
Memory manager moderno, multi-plataforma |
| XSuperObject | github.com/onryldz/x-superobject |
Parser e serializador JSON de alta performance |
| ZeOSLib | github.com/zeoslib/zeoslib |
Adapter de acesso a banco de dados (engine ZeOS) |
| Neslib.Yaml | github.com/neslib/Neslib.Yaml |
Parser e emitter YAML via LibYAML — Win32/64, Android, iOS |
| delphi-neon | github.com/paolo-rossi/delphi-neon |
Serialização JSON com RTTI (biblioteca Neon; não é o formato Nette NEON) |
| DelphiTOML | github.com/SilenceCCF/DelphiTOML |
Parser TOML v1.1 completo para Delphi |
Exemplo de leitura de configuração YAML (Neslib.Yaml):
uses Neslib.Yaml;
var
Doc: IYamlDocument;
Root: TYamlNode;
begin
Doc := TYamlDocument.Load('config.yaml');
Root := Doc.Root;
Writeln(Root['database']['host'].ToString);
end;Exemplo de serialização com Neon:
uses Neon.Core.Persistence.JSON;
type
TConfig = class
public
Host: String;
Port: Integer;
end;
var
Cfg: TConfig;
JSON: TJSONObject;
begin
Cfg := TConfig.Create;
Cfg.Host := 'localhost';
Cfg.Port := 3306;
JSON := TNeon.ObjectToJSON(Cfg) as TJSONObject;
Writeln(JSON.ToJSON);
end;Exemplo de leitura TOML (DelphiTOML):
uses TOML;
var
Doc: TTOMLDocument;
begin
Doc := TTOMLParser.ParseFile('config.toml');
try
Writeln(Doc['database']['host'].AsString);
Writeln(Doc['database']['port'].AsInteger.ToString);
finally
Doc.Free;
end;
end;Instalação via Boss
boss install github.com/nicksonjean/Delphi-Generic-DatabaseInstalação Manual
git clone https://github.com/nicksonjean/Delphi-Generic-Database.gitAdicione as seguintes pastas ao search path do projeto em Project > Options > Resource Compiler > Directories and Conditionals > Include file search path:
../Delphi-Generic-Database/Source/Connection
../Delphi-Generic-Database/Source/Connection/Engine/Adapters/FireDAC/Core
../Delphi-Generic-Database/Source/Connection/Engine/Adapters/FireDAC/Drivers
../Delphi-Generic-Database/Source/Connection/Config
../Delphi-Generic-Database/Source/Connection/Registry
../Delphi-Generic-Database/Source/Connection/Strategy
../Delphi-Generic-Database/Source/Connector
../Delphi-Generic-Database/Source/EventDriven
../Delphi-Generic-Database/Source/Extensions/FMX.Edit
../Delphi-Generic-Database/Source/Extensions/FMX.ListView
../Delphi-Generic-Database/Source/Helpers/ArrayHelper
../Delphi-Generic-Database/Source/Helpers/DictionaryHelper
../Delphi-Generic-Database/Source/Helpers/FMX.ComboBox
../Delphi-Generic-Database/Source/Helpers/FMX.ComboEdit
../Delphi-Generic-Database/Source/Helpers/FMX.Edit
../Delphi-Generic-Database/Source/Helpers/FMX.Grid
../Delphi-Generic-Database/Source/Helpers/FMX.ListBox
../Delphi-Generic-Database/Source/Helpers/FMX.ListView
../Delphi-Generic-Database/Source/Helpers/FMX.Objects
../Delphi-Generic-Database/Source/Helpers/FMX.StringGrid
../Delphi-Generic-Database/Source/Reflection
../Delphi-Generic-Database/Source/SmartPointer
../Delphi-Generic-Database/Source/Types
../Delphi-Generic-Database/Source/Types/Array
../Delphi-Generic-Database/Source/Types/Locale
../Delphi-Generic-Database/Source/Vendor/FastMM5
../Delphi-Generic-Database/Source/Vendor/XSuperObjectSubstitua
FireDACpelo adapter desejado (dbExpress,ZeOSouUniDAC) conforme sua engine.
ToDo
- [x] Suporte completo a todos os bancos de dados (SQLite, Firebird/Interbase, MySQL/MariaDB, PostgreSQL, SQLServer, Oracle)
- [x] Adapters: FireDAC, dbExpress, ZeOS, UniDAC
- [x] Strategy Pattern — zero
$IFDEFde engine no código principal - [x] EngineRegistry com auto-registro via
initialization - [x] Configuração via INI, JSON e XML
- [x] QueryBuilder genérico (SELECT, INSERT, UPDATE, DELETE, REPLACE)
- [x] SmartPointer genérico com suporte a
TInterfacedObject - [x] Refatoração removendo arquivos
*.incde Connection, Connector e Types/Array - [ ] Suporte a TeeGrid no Connector
- [ ] DBNavigator para TGrid e TStringGrid
- [ ] Paginação / "Carregar Mais" para ListBox e ListView
- [ ] Testes unitários
Bugs Conhecidos
- [ ] Warnings do dbExpress para
StartTransaction,CommiteRollback(símbolos deprecated) - [ ] Testes unitários para validar comportamento cross-engine
⁰¹²³⁴⁵⁶⁷⁸⁹

