NeXT Docs
← nextlowcode.com.br

Referência de API — VB6

NeXT LowCode SDK · funções e controles OCX (uc*) · extraído da fonte real

Documentação de referência do SDK VB6, extraída da fonte real em vb6\sdk\. Documenta apenas membros declarados Public (e Event, que em UserControl é exposto). Assinaturas reproduzidas como no código; a linha de propósito é inferida do corpo/uso.

O SDK VB6 é distribuído em nível de fonte (projeto NeXTFramework) ou como OCX único compilado. Referências externas usadas: ADODB 2.8, stdole2, e os OCX THREED32, MSMASK32, MSCOMCTL, MSCOMCT2.


Conceito em 1 minuto

O SDK é dirigido por metadados, não um gerador de código. Cada controle uc* na tela carrega dois metadados de projeto:

  • DataField — a coluna que ele representa.
  • TypeControl — o tipo do valor (TipoCaracter), que decide formatação e a

conversão para literal SQL (função central Conv).

O engine (modForms.bas) percorre os controles do Form em tempo de execução, monta o SQL e persiste. Auditoria (codusuario/time_stamp) só é gravada quando a coluna existe (CampoVerificarExistencia), usando o global gCodUsuario.

Nada é gerado em disco. A fonte da verdade é o metadado, lido a cada operação.

Quick-start (padrão low-code de um cadastro)

' 1) configurar a base uma vez (Sub Main / carga do app)
gConfigDB.DBProvider = DBPROVIDERMSACCESS      ' ou DBPROVIDERMYSQL / DBPROVIDERSQLSERV
gConfigDB.DBPath = App.Path & "\app.mdb"
AbreConexao True
SDKConfigPadrao

' 2) na tela, arraste controles low-code e defina no designer:
'    txtCodigo (ucCodigo) -> DataField="codcli", PK=True           (a PK)
'    txtNome   (ucText)   -> DataField="nome"
'    cboCidade (ucCombo)  -> DataField="codcidade", SQL="SELECT codcidade,nome FROM tbcidade"
'    ucToolbar1           -> DataTable="tbcliente", DataField="codcli"

' 3) o ucToolbar faz o CRUD automaticamente (Novo/Salvar/Navegar/Limpar).
'    O form escreve SÓ o que o toolbar nao faz: excluir + load-on-code.
Private Sub cmdToolbar_CommandClick(ByVal p_TypeCommand As TypeCommand)
    If p_TypeCommand = TC_Del Then
        FormExcluir Me, "tbcliente", txtCodigo, "codcli"
        Inicio
    End If
End Sub

Private Sub txtCodigo_Validate(Cancel As Boolean)   ' digitar o codigo carrega o registro
    FormLerRegistro Me, "tbcliente", txtCodigo, "codcli"
End Sub
Um cadastro CRUD completo custa ~3 linhas de código de CRUD (só o TC_Del). Novo/Salvar/Próximo/Anterior/Limpar são 100% automáticos no ucToolbar.

PARTE 1 — Funções (módulos e classes)

modMain.bas

  • Public Sub Main() — ponto de entrada do projeto/host.

modForms.bas — Engine de formulários (CRUD automático)

Motor genérico que percorre os controles uc* de um Form (via DataField/ TypeControl) e monta SELECT/INSERT/UPDATE/DELETE automaticamente. Auditoria só é gravada quando a coluna existe; filtro por empresa só quando p_CodEmpresa > 0.

  • Public Sub FormLerRegistro(ByRef p_Form As Form, ByVal p_Table As String, ByRef p_txtPK As Object, ByVal p_PK As String, Optional ByRef p_txtPKFK As ucText, Optional ByVal p_PKFK As String, Optional ByVal p_Operacao As QTipoOperacao = LerRegistro, Optional ByVal p_CodEmpresa As Long = 0) — lê um registro pela PK (ou PK+PKFK), preenche todos os controles ligados por DataField, carrega grids de detalhe e coloca o form em FEAlteracao. Suporta navegação Ler/Próximo/Anterior.
  • Public Sub FormSalvar(ByRef p_Form As Form, ByVal p_Table As String, ByRef p_txtPK As VBControlExtender, ByVal p_PK As String, Optional ByRef p_txtPKFK As ucText, Optional ByVal p_PKFK As String, Optional ByVal p_CodEmpresa As Long = 0) — decide INSERT vs UPDATE (por valor/tipo da PK e verificação COUNT), monta o comando a partir dos controles ligados, executa em transação, salva grids de detalhe (objGrid.Save) e relê o registro. Gera PK nova via CodInicioPK/CodInicioPKMax quando necessário.
  • Public Sub FormExcluir(ByRef p_Form As Form, ByVal p_Table As String, ByRef p_txtPK As Object, ByVal p_PK As String, Optional ByVal p_Confirmar As Boolean = True, Optional ByVal p_CodEmpresa As Long = 0) — exclui o registro pela PK (confirmação opcional), limpa os campos, põe o form em FENovo e atualiza grids em modo listagem.
FormHabilitar e LimpaCampos, embora do "engine de forms", estão em modFuncoes.bas (abaixo).

modFuncoesDB.bas — Engine de banco (ADO)

  • Public Function AbreConexao(Optional ByVal p_blnConexaoInicial As Boolean = False) As Boolean — abre a conexão ADO global (conBD) usando gConfigDB. Retorna sucesso.
  • Public Sub ExecutaComandoADOConn(ByVal p_strCommand As String, Optional ByRef p_conDb As ADODB.Connection = Nothing) — executa um comando SQL direto numa Connection.
  • Public Function ExecutaComando(ByRef p_strComando As String, Optional ByRef p_conDb As ADODB.Connection = Nothing, Optional ByVal p_blnGravaLog As Boolean = True) As Long — executa INSERT/UPDATE/DELETE via ADODB.Command; retorna nº de afetados; log opcional; trata reconexão MySQL.
  • Public Function ExecutaComandoArray(ByRef p_arrSQL() As String) As Long — executa um array de comandos SQL em sequência; retorna total afetado.
  • Public Function RecuperaRegistroUnicoValor(ByVal p_strSQL As String, Optional p_OutraBaseDados As ADODB.Connection = Nothing) As Variant — retorna o primeiro campo do primeiro registro (escalar).
  • Public Sub RecuperaRegistros(ByRef p_QRecordSet As ADODB.Recordset, ByRef p_Comando As String, Optional ByVal p_RetornaDesconectado As Boolean = True, Optional p_OutraBaseDados As ADODB.Connection = Nothing, Optional ByVal p_blnGravarLog As Boolean = True, Optional ByVal p_blnKeySetOptmistic As Boolean = False, Optional ByVal p_RecordSetIncusaoAlteracao As Boolean = False) — abre um Recordset (por padrão desconectado) de um SELECT.
  • Public Function AdaptaQueryMySQL(ByRef p_strQuery As String) As String — adapta a query para dialeto MySQL.
  • Public Function AdaptaQuerySQLServer(ByRef p_strQuery As String) As String — adapta a query para dialeto SQL Server.
  • Public Function CampoVerificarExistencia(ByVal p_strTabela As String, ByVal p_strCampo As String) As Boolean — verifica se uma coluna existe (auditoria condicional).
  • Public Function LastInsertId() As Long — último ID auto-incremento inserido.
  • Public Function CodInicioPK(ByVal p_strTabela As String, ByVal p_strPK As String, ByVal p_blnUtilizarMax As Boolean, Optional ByVal p_lngValorDefault As Long) As Double — próximo valor de PK (via tbpk quando gPKAvancado, ou MAX(pk)+1).
  • Public Function CodInicioPKMax(ByVal p_strTabela As String, ByVal p_strPK As String, Optional ByVal p_strPKFK As String, Optional ByVal p_lngCodPKFK As Long) As Double — próximo PK dentro de agrupamento por PKFK (chave composta).

modFuncoes.bas — Utilitários gerais / engine de UI

Seleção dos membros mais usados (o módulo é extenso):

  • Public Sub FormHabilitar(ByRef p_objForm As Form, ByVal p_iEstadoForm As FormEstado, Optional ByVal p_strCampoCodigo As String = "txtCodigo", Optional ByVal p_strBotaoComando As String = "cmdBotoes", Optional ... ) — habilita/desabilita campos e botões da toolbar conforme o estado CRUD (FormEstado). Núcleo do engine de UI. (Vários parâmetros opcionais mapeiam índices de botões; ver fonte.)
  • Public Sub LimpaCampos(ByRef p_objForm As Form, Optional ByVal p_blnLimparListView As Boolean = True) — limpa todos os controles ligados do form (e ListViews opcionalmente).
  • Public Sub SetaFoco(ByRef Controle As Object, Optional ByVal p_blnEmpty As Boolean = False) — coloca foco num controle (opc. limpando-o).
  • Public Sub SetaMouse(Optional ByVal p_Tipo As MousePointerConstants = vbArrowHourglass) — altera o cursor (ampulheta por padrão).
  • Public Sub Mensagem(ByVal Mens As String, Optional ByVal Complemento As String) — mensagem padronizada ao usuário.
  • Public Sub TrataErro(ByVal p_Formulario As String, Optional ByVal p_strMensagem As String = "", ...) — trata/mostra/loga erro padrão.
  • Public Function TrataErroCritico(ByVal p_Formulario As String, Optional ByVal p_blnRollBackTrans As Boolean = True) As VbMsgBoxResult — erro crítico com rollback opcional.
  • Public Sub GravaLogErro(...) / Public Sub GravaLogComando(ByVal Comando As String) — logs de erro/transação.
  • Public Sub MostraInicio() / Public Sub MostraFim() — mensagens de início/fim de registros.
  • Public Function FormShow(ByVal p_NomeForm As String, Optional ByVal p_blnModal As Boolean = False) As Boolean — exibe um form pelo nome (modal opcional).
  • Public Function FormShow2(ByVal p_Form As Form, Optional ByVal p_blnModal As Boolean = False) As Boolean — exibe uma instância de form já carregada.
  • Public Function FormLoad(ByVal p_strNmForm As String) As Boolean — carrega (Load) um form pelo nome.
  • Public Function FormFindControl(ByRef p_Formulario As Form, ByVal p_strControlName As String) As Boolean — verifica se um controle existe no form pelo nome.
  • Validações: Public Function CheckCPF(ByVal CPF As String) As Boolean; Public Function CheckCNPJ(ByVal CNPJ As String) As Boolean; Public Function VerificaCPFCNPJ(ByRef Controle As Control, ByVal TipoPessoa As TipoPessoa, ...); Public Function ConsisteData(ByVal Campo As String, Optional ByVal p_blnPermiteBranco As Boolean = False, Optional ByVal p_blnMostraMsg As Boolean = True) As Boolean; Public Function ConsisteHora(ByVal p_strHora As String, Optional ByVal p_blnPermiteBranco As Boolean = False) As Boolean; Public Function ValidarPeriodoDatas(ByVal p_strDataInicial As String, ByVal p_strDataFinal As String) As Boolean; Public Function ValidarDigitoEAN13(ByVal p_strEAN13) As Boolean.
  • Digitação/formatação: Public Function InibeCaracteres(ByVal ValorAsc As Long, ByVal Tipo As QTipoCaracter) As Long; Public Sub FormatarCampo(ByRef p_Controle As TextBox, ByRef p_Panel As SSPanel, ByVal p_TipoCampo As FormatarCampoTipo, ...); Public Sub FormataData(ByRef ControleTexto As Object).
  • Diversos: Public Sub AbreURL(ByVal p_strURL As String); Public Sub WhatsAppAbrir(ByVal p_strFone As String, Optional ByVal p_strMsg As String); Public Function RetornarHostName() As String; Public Function UBound2(ByRef p_Array As Variant) As Long; funções de processo Windows (VerificarProcessoWindows, TerminarProcessoWindows).

modFuncoesCombo.bas — ComboBox nativo

  • Public Sub CarregarComboSQL(ByRef p_objCombo As ComboBox, ByVal p_SQL As String, Optional ByVal p_lngCodigoSel As Long, ...) — popula o combo a partir de um SELECT (código/descrição) e seleciona um código.
  • Public Sub CarregarComboArray(ByRef p_objCombo As ComboBox, ByRef p_Array As Variant, Optional ByVal p_lngCodigoSel As Long, ...) — popula o combo a partir de um array.
  • Public Sub ProcuraCombo(ByRef Combo As ComboBox, ByVal Valor As Variant, ...) — seleciona no combo o item cujo ItemData/texto corresponde ao valor.
  • Public Function RetornarValorCombo(ByRef p_objCombo As ComboBox, Optional ByVal p_blnRetornarListIndexSeNaoSelecionado As Boolean = False) As Long — retorna o ItemData do item selecionado (ou ListIndex).

modFuncoesData.bas — Datas e horas

  • Public Function FData(ByVal Qdata As Variant, Optional ByVal p_blnHora As Boolean = False) As String — formata data (DD/MM/AAAA, hora opcional) para exibição.
  • Public Function FDataMySQL(ByVal p_strData As String, Optional ByVal p_blnHora As Boolean = False) As String — formata para literal MySQL (AAAA-MM-DD).
  • Public Function FDataYMD(...) As String / Public Function FDataDMA(...) As String — conversões Y-M-D / D/M/A.
  • Public Function FHora(ByVal p_strValor As Variant, Optional ByVal p_blnConsiste As Boolean = False) As String — formata hora (consistência opcional).
  • Public Function AdicionarDiasData(ByVal p_strData As String, ByVal p_intDias As Long, Optional ByVal p_blnDataComercial As Boolean = True) As String — soma dias (com opção de dias úteis).
  • Public Function RetornarTimeStamp(Optional ByVal p_strFData As String, Optional ByVal p_intNumAdicionar As Long, ...) As String — timestamp atual/derivado para auditoria.
  • Public Function FDataTimeStamp(ByVal p_strTimeStamp As String, Optional ByVal p_blnHora As Boolean = True, ...) As String — formata timestamp para exibição.
  • Public Function RetornarUltimoDiaMes(ByVal p_lngMes As Long, ByVal p_lngAno As Long) As Long; Public Function RetornarDiaSemana(...); Public Function VerificarDataUtil(ByVal p_strData As String) As Boolean; Public Function RetornaDataDiaUtil(ByVal p_strData As String) As String; Public Function CompararDatas(...) As Long; Public Function ExtensoData(...); Public Function ExtensoMonth(...); Public Sub RetornarPeriodoInicialFinal(...).

modFuncoesString.bas — Strings, números, moeda, hash, base64

Convenção: F* formata para exibição; D* desformata/converte para armazenamento.

  • Conversão central: Public Function Conv(ByVal Campo As Variant, ByVal Tipo As TipoCaracter, ...) — converte/escapa um valor para literal SQL conforme TipoCaracter (numérico, data, moeda, procura/LIKE, etc.). Usada por todo o engine.
  • Public Function ENulo(ByRef Valor As Variant, Optional ByVal Tipo As TipoCaracter = Alfanumerico, Optional ByVal p_blnConvertNull As Boolean = False, Optional ByVal p_lngTamMax As Long) As Variant — trata Null/vazio, retornando default por tipo.
  • Moeda/qtde/peso: FMoeda, DMoeda/DMoedaP/DMoedaDbl, FQtde/DQtde, FPeso/DPeso/DPesoDbl, Arredondar/Arredondar2.
  • Máscaras: FormataCep, FormataTelefone, FormataCPFCNPJ, FormataIE; fiscais FCFOP/DCFOP, FNCM/DNCM, FCEST/DCEST.
  • Texto: AllTrim, LimitaTexto, AlinhaTexto, Zeros, CNumerico, RetirarCaracteresEspeciais, RetirarEspacos/RetirarEspacosDuplicados/RetirarEnter, Concatenar, RastreiaString, QtdeCaracteres, SplitLinha, URLEncode.
  • Extenso/XML/HTML: ExtensoValor, ExtensoNF, FTagXML/FTagXML2, RetornarValorXMLTag, ConverterCaracteresHTML, CorteHTML.
  • Cripto/hash/base64: Criptografa(usuario, senha, Modo, ...), SHA1, sha1hex, HexaToString/StringToHexa, Base64Encode/Base64ToText/TextToBase64, ConvertFileToBase64/ConvertBase64ToFile.
  • Public Function ConvertFieldType(ByVal p_FieldType As DataTypeEnum) As TipoCaracter — mapeia tipo ADO para TipoCaracter.

modFuncoesListView.bas — ListView (MSCOMCTL)

  • Public Sub lvwLimpar(ByRef p_lvwListView As ListView, Optional ByVal p_blnAjustar As Boolean = False, ...) — limpa o ListView.
  • Public Sub lvwAjustar(ByRef LV As ListView, Optional ByVal p_intColFixa As Long, Optional ByVal p_intColFixa2 As Long, ...) — ajusta larguras (colunas fixas opcionais).
  • Public Sub lvwAdicionarItem(ByRef p_lvwListView As ListView, ByRef p_strTexto As String, ...) — adiciona um item.
  • Public Sub lvwAdicionarSubItem(ByRef p_lvwListView As ListView, ByRef p_strTexto As String, ...) — adiciona um subitem à linha corrente.

modRelatorio.bas — Relatório genérico

  • Public Function GerarRelatorioSQL(ByVal p_SQL As String, ByVal p_Titulo As String, Optional ByVal p_Formato As String = "HTML") As String — executa um SELECT e gera arquivo de relatório (HTML/TXT); retorna o caminho.
  • Public Sub AbrirArquivo(ByVal p_Path As String) — abre um arquivo no aplicativo associado.

modGDI.bas — Wrapper GDI+ (suporte aos controles gráficos)

Majoritariamente interno. Públicas: ColorARGB, ColorSetAlpha, GetRGB_GDIP2VB/GetRGB_VB2GDIP, GetEncoderClsid/GetDecoderClsid, DEFINE_GUID, PtrToStrW/PtrToStrA, GetPropValue.

modDeclaracoesSDK.bas — Declarações globais

Enums: TipoCampo (TCVarChar=0 … TCDouble=15), QTipoCaracter (Letras/Numeros/CaracterEspecial), QTipoOperacao (LerRegistro=0/ProximoRegistro=1/RegistroAnterior=2), RetornoOperacao, FormatarCampoTipo (fctMoeda=1/fctQtde=2/fctData=3/fctHora=4/fctString=5), FormatarCampoEvento, Conv_Car, Alinhamento (alEsquerda/alDireita/alCentro), Criptografia_Modo, TipoPessoa (tpFisica=0/tpJuridica=1).

Types + globais:

  • CONFIG_DATABASE = { DBProvider, DBPath, DBServer, DBUser, DBPassword, DBDatabase, DBPort } (String) → Public gConfigDB As CONFIG_DATABASE.
  • CONFIG_GERAL = { CasasDecimaisValor, CasasDecimaisQtde, CasasDecimaisPeso, GravarUpper, ProcuraAvancada, ValidarCNPJCPF, LogErros, LogTransacao, PathLog } → Public gConfig As CONFIG_GERAL.
  • ERR_CLS → Public gErr As ERR_CLS. PROCESSENTRY32 (Win32).

Globais: strQuery (query montada pelo engine), gCodUsuario As Long (0 = sem auditoria), conBD As ADODB.Connection, Conexao As clsConexao, gPKAvancado As Boolean (False=MAX+1, True=tabela tbpk), gDebug As Boolean.

Consts: DBPROVIDERMSACCESS="Microsoft.Jet.OLEDB.4.0", DBPROVIDERMYSQL="MSDASQL.1", DBPROVIDERSQLSERV="SQLOLEDB.1", cNOMESOFTWARE="NeXT LowCode SDK", operadores OPLIKE/OPDATA, mensagens MSGxxx, tags de estado, cURLWHATSAPPAPI, etc.

Sub: Public Sub SDKConfigPadrao() — aplica defaults sensatos em gConfig.

clsConexao.cls

Wrapper da conexão ADO que rastreia estado transacional via eventos.

  • Public WithEvents conexaoBD As ADODB.Connection — a conexão observada.
  • Public blnTrans As Boolean — True enquanto há transação aberta.

clsStringBuilder.cls

Construtor de strings eficiente (chunk buffer).

  • Propriedades: length (Get), Capacity (Get), ChunkSize (Get/Let), ToString (Get), TheString (Get/Let).
  • Métodos: Append/AppendByVal/AppendLine, Clear, Insert/InsertByVal, Remove, Find, HeapMinimize.

NeXTSDK.cls — Fachada pública (GlobalMultiUse)

Expõe a API ao host; cada método delega ao módulo qualificado. Hospeda também os enums de domínio globais do projeto:

  • TipoCaracter: Alfanumerico=0, Numerico=1, DataDMY=2, Procura=3, ProcuraFull=4, ValorNumerico=5, Quantidade=6, DataTimeStamp=8, AlfanumericoBranco=9, NumericoNotNull=10, ProcuraNumerico=11, Peso=15, HoraMinSeg=17, AlfanumericoCaixaAltaBaixa=18, AlfanumericoBrancoNull=19, QuantidadeNotNull=20, ValorNumericoNotNull=21, DataDMYHora=22, ValorNumerico4Casas=23, ValorNumerico2Casas=27, SemFormatacao=99
  • FormEstado: FEInclusao=1, FEAlteracao=2, FEExclusao=3, FENovo=4, FEConsulta=5

Membros (e a quem delegam):

  • AbreConexao(Optional pConexaoInicial As Boolean = False) As Boolean → FuncoesDB.AbreConexao.
  • ExecutaComando(ByRef pSQL As String, Optional pGravaLog As Boolean = True) As Long → FuncoesDB.ExecutaComando.
  • FormLerRegistro(pForm As Object, pTable As String, ptxtPK As Object, pPK As String, Optional pOperacao As Long = 0) → modForms.FormLerRegistro.
  • FormSalvar(pForm As Object, pTable As String, ptxtPK As Object, pPK As String) → modForms.FormSalvar.
  • FormExcluir(pForm As Object, pTable As String, ptxtPK As Object, pPK As String) → modForms.FormExcluir.
  • FormHabilitar(pForm As Object, pEstado As FormEstado) → Funcoes.FormHabilitar.
  • LimpaCampos(pForm As Object, Optional pLimparListView As Boolean = True) → Funcoes.LimpaCampos.
  • SetaFoco(pControle As Object, Optional pEmpty As Boolean = False) → Funcoes.SetaFoco.
  • SetaMouse(Optional pTipo As MousePointerConstants = vbArrowHourglass) → Funcoes.SetaMouse.
  • TrataErro(pFormulario As String, Optional pMensagem As String = "") → Funcoes.TrataErro.
  • SDKConfigPadrao() → modDeclaracoesSDK.SDKConfigPadrao.
  • ConfigurarBanco(pProvider As String, Optional pPath, pServer, pDatabase, pUser, pPassword, pPort As String) — preenche gConfigDB.
  • Propriedades: PKAvancado (Get/Let → gPKAvancado), CodUsuario (Get/Let → gCodUsuario), ProviderMSAccess/ProviderMySQL/ProviderSQLServer (Get → consts).
  • ConsultarEscalar(pSQL As String) As String — 1º campo da 1ª linha.
  • FormatarMoeda(pValor As Double) As String → FMoeda; MoedaParaNumero(pTexto As String) As Double → DMoedaDbl.
  • ProcurarRegistro(pTitulo As String, pSQL As String) As String — abre frmLookupSDK e retorna a chave escolhida.
  • RelatorioSQL(pSQL As String, pTitulo As String, Optional pFormato As String = "HTML") As String — gera relatório e exibe.

PARTE 2 — Controles OCX (uc*)

Convenções comuns. Os controles data-bound compartilham propriedades padrão de UserControl VB6 (passthrough): Name, hwnd, Enabled, Font, BackColor, ForeColor, ToolTipText, Caption, Container, Tag etc. Abaixo destacam-se as propriedades de metadados/binding e específicas, mais métodos e eventos. Todos expõem os eventos de persistência InitProperties/ReadProperties/WriteProperties (padrão do VB6), omitidos das tabelas. Validate() é um método (Function As Boolean), não um evento.

ucText — caixa de texto genérica

PropriedadeTipoAcessoDescrição
DataFieldVariantGet/LetColuna ligada
DataTableVariantGet/LetTabela
TypeControlTipoCaracterGet/LetTipo (dirige Conv/formatação)
ValueVariantGetValor tipado
TextStringGet/LetTexto exibido
BackColorOnFocusOLE_COLORGet/LetCor de fundo em foco

Métodos: Refresh, Size(Width, Height), ValidateControls, Validate() As Boolean. Eventos: (só persistência).

ucCodigo — campo de código/PK com procura

Enums: TypeFind (TF_Nenhum=0, TF_Clientes=1, TF_Produtos=2, TF_NF=3, TF_Fornecedores=4); TypeDetail (TD_Nenhum=0, TD_Cliente=1, TD_Produto=2, TD_Transportador=3).

PropriedadeTipoAcessoDescrição
DataFieldVariantGet/LetColuna ligada
DataTableVariantGet/LetTabela
TypeControlTipoCaracterGetTipo (numérico)
ValueLongGetValor do código
TextStringGet/LetTexto do código
PKBooleanGet/LetIndica se é a chave primária
FindVisibleBooleanGet/LetExibe botão de procura
CopyVisibleBooleanGet/LetExibe botão de cópia
CodTypeFindTypeFindGet/LetTipo de lookup de procura
CodTypeDetailTypeDetailGet/LetTipo de detalhe/cadastro
ControlNameStringGet/LetNome lógico

Métodos: Size, Refresh, ValidateControls, Validate() As Boolean, ExibirNome(p_Name As String). Eventos: Procura() — clique no botão de procura.

ucMask — campo com máscara (MaskEdBox)

Propriedades: DataField, DataTable, TypeControl, Mask (String), Format (String), PromptInclude (Boolean), PromptChar (String), Text, Value (Get). Métodos: Refresh, Validate() As Boolean. Eventos: Change().

ucMemo — texto multilinha

Propriedades: DataField, DataTable, TypeControl, Text, Value (Get), MaxLength. Métodos: Refresh, Validate() As Boolean. Eventos: (só persistência).

ucCPFCNPJ — documento (Física/Jurídica + máscara)

Status: stub de design na fonte atual. Não expõe propriedade/método/evento Public (só um handler privado de foco). Sem binding exposto por ora.

ucNumeroSpin — numérico com spin

PropriedadeTipoAcessoDescrição
DataFieldVariantGet/LetColuna ligada
DataTableVariantGet/LetTabela
TypeControlTipoCaracterGet/LetTipo do valor
TextStringGet/LetTexto exibido
ValueVariantGet/LetValor numérico
MinLongGet/LetValor mínimo
MaxLongGet/LetValor máximo
IncrementLongGet/LetPasso do spin

Métodos: Refresh, Validate() As Boolean. Eventos: Change().

ucData — campo de data (com calendário)

Propriedades: DataField, DataTable, TypeControl (Get), Text, NowIsEmpty (Boolean, Get/Let) (se vazio assume data atual), BackColorOnFocus (OLE_COLOR), Container (Get/Set). Métodos: Size, Refresh, ValidateControls, Validate() As Boolean. Eventos: (só persistência).

ucHora — campo de hora

Propriedades: DataField, DataTable, TypeControl (Get), Text, NowIsEmpty (Boolean), Container (Get/Set). Métodos: Size, Refresh, ValidateControls, Validate() As Boolean. Eventos: (só persistência).

ucCheck — checkbox (grava 0/1)

Propriedades: DataField, DataTable, Value (Long, Get/Let). Métodos: Refresh, ValidateControls, Size. Eventos: Click(), MouseDown(Button, Shift, X, y).

ucOption — radio button

Propriedades: Caption (String), Value (Long), DataField, DataTable, Enabled, ForeColor/BackColor, Font (Get/Set), Name (Get). Métodos: (só acessores). Eventos: Click().

ucCombo — combo SQL-driven com detalhe

Enums: TypeComboEnum (TC_Nenhum=0, TC_CondicaoPagto=7, TC_Funcionario=8, TC_CFOP=10, TC_UF=50, TC_TipoOperacao=51, TC_RegrasFiscais=52, TC_ClassTrib=53, TC_CSTIBSCBS=54, TC_NFSePadrao=55); ComandoConstants (Com_Nenhum=0, Com_ParcelasReceber=1); DetalheConstants (Det_Nenhum=0, Det_Cliente=1, Det_CondicaoPagto=7, Det_Funcionario=8, Det_CFOP=10, Det_TipoOperacao=51, Det_RegrasFiscais=52, Det_ClassTrib=53, Det_CSTIBSCBS=54, Det_Generico=99); DescricaoLayoutEnum (DL_DescricaoeCodigo=0, DL_SomenteDescricao=1, DL_SomenteCodigo=2).

PropriedadeTipoAcessoDescrição
DataFieldVariantGet/LetColuna ligada (valor selecionado)
DataTableVariantGet/LetTabela
DataFieldFKStringGet/LetColuna FK (filtro)
DataValueFKStringGet/LetValor da FK para filtrar itens
TypeControlTipoCaracterGet/LetNumérico → grava Value; senão Text
TypeComboTypeComboEnumGet/LetPreset de carga (UF, CFOP…)
DescricaoLayoutDescricaoLayoutEnumGet/LetComo exibir item (cód/desc)
SQLStringGet/LetSELECT de carga customizado
ValueLongGet/LetCódigo (ItemData) selecionado
ListIndexLongGet/LetÍndice selecionado
TextStringGet/LetTexto selecionado
ComandoComandoConstantsGet/LetAção do botão de comando
DetalheDetalheConstantsGet/LetCadastro de detalhe vinculado

Métodos: Recarregar() (recarrega conforme SQL/TypeCombo/FK), Clear(), AddItem(p_Item As String), Refresh, ValidateControls, Size, Validate() As Boolean. Eventos: Change(), Click(), MouseDown(...), ComandoClick(p_Index As Long), DetalheClick(p_Index As Long) (abre cadastro relacionado).

ucGrid — grade (listagem ou master-detail)

PropriedadeTipoAcessoDescrição
DataFieldVariantGet/LetCampo/chave de ligação com o master
DataValueVariantGet/LetValor da chave master corrente
DataTableVariantGet/LetTabela de detalhe
SQLStringGet/LetSELECT de carga
ModoListagemBooleanGet/LetTrue = listagem; False = detalhe editável
ChangedBooleanGetEdição pendente
ColunasStringGet/LetDefinição serializada das colunas
RowsLongGetQuantidade de linhas
CheckboxesBooleanGet/LetHabilita checkboxes
ColumnHeadersIColumnHeadersGetColeção de cabeçalhos

Métodos: Limpar([p_blnAjustarColunas]), ClearColumns, AddColumn(p_Name, p_Align, [p_Width=1500], [p_Field], [p_Control], [p_Tipo=0]), AplicarColunas, MapColumnField(p_Column, p_Field, p_Control), ClearControls, RemoveRow([p_lngRow]), AddRow([p_lngRow]), AddRowCol(p_Col As Collection), AddRowArray(p_Array() As String), AddRowEmpty() As Long, Save() As Boolean, Load() As Boolean, Atualizar([p_SQL]), Validate() As Boolean, ColIndex(p_Field) As Long, GetValue(p_Row, p_Field) As String, SetValue(p_Row, p_Field, p_Value), Refresh. Eventos: ItemClick(Item As ListItem), ItemCheck(Item As ListItem), Selecionou(Codigo As String).

ucAddRemove — barra Adicionar/Remover de um ucGrid

Enum: TypeAddRemove (TC_Add, TC_Remove, TC_Clear, TC_ClearAll = 0..3).

PropriedadeTipoAcessoDescrição
GridNameStringGet/LetNome do ucGrid alvo
ControlFocusStringGet/LetControle a focar após ação
AddEnable/AddVisibleBooleanGet/LetBotão Adicionar
RemoveEnable/RemoveVisibleBooleanGet/LetBotão Remover
ClearEnable/ClearVisibleBooleanGet/LetBotão Limpar
ClearAllEnable/ClearAllVisibleBooleanGet/LetBotão Limpar Tudo

Eventos: AddRemoveClick(p_TypeAddRemove As TypeAddRemove).

ucToolbar — barra CRUD padrão

Enum: TypeCommand (TC_New, TC_Save, TC_Del, TC_Next, TC_Previous, TC_Baixa, TC_Print, TC_Print2, TC_Excel, TC_Nota, TC_PDF, TC_Anexo, TC_Procura, TC_Help, TC_Limpar, TC_Exit = 0..15).

Propriedades: binding DataField (String), DataTable (String), ControlFocus (String); e para cada botão um par Enable/Visible (Boolean, Get/Let): New*, Save*, Del*, Next*, Prev*, Baixa*, Print*, Print2*, Excel*, Nota*, PDF*, Attach*, Find*, Help*, Clear*, Exit*. Métodos: LabelCaption(p_Command As TypeCommand, p_Caption As String). Eventos: CommandClick(p_TypeCommand As TypeCommand).

Auto-CRUD: com DataTable/DataField/ControlFocus definidos no designer e a PK em txtCodigo (convenção), o toolbar executa Novo/Salvar/Navegar/Limpar automaticamente após disparar CommandClick. O TC_Del fica vazio de propósito (o host trata a exclusão destrutiva).

ucImagem — imagem com binding

PropriedadeTipoAcessoDescrição
DataFieldStringGet/LetColuna ligada
DataTableStringGet/LetTabela
TypeControlTipoCaracterGet/LetTipo do valor
TextStringGet/LetValor textual (caminho/base64)
CaminhoStringGet/LetCaminho do arquivo de imagem
CaptionStringGet/LetLegenda

Métodos: (só acessores). Eventos: nenhum público. Persiste o caminho da imagem.

ucFrame — container/moldura (não data-bound)

Propriedades: hwnd (Get), BackColor, ForeColor, Enabled, Font (Get/Set), BorderStyle, Caption, ToolTipText, Name (Get). Métodos: Refresh. Eventos: Click(), DblClick().

ucLabelText — rótulo read-only ligado a coluna

Propriedades: DataField, DataTable, Text, Caption, Alignment, FillStyle/FillColor (sem TypeControl). Métodos: Refresh, Size. Eventos: Click(), DblClick().

ucLabelPlus — rótulo avançado GDI+ (imagem/gradiente/callout)

Rótulo renderizado em GDI+ com ícone (fonte de ícones), sombra, gradiente, borda arredondada, callout/balão, blur acrílico, rotação e carga de imagem por URL; binding leve por SQL. Conjunto muito extenso de propriedades (grupos: Caption, Cor/fundo, Borda, Sombra, Callout, Imagem, Ícone, HotLine, Interação). Métodos-chave: CarregarSQL(pSQL), Draw(hdc, hGraphics, PosX, PosY), Refresh, LoadPicture(SrcImg) As Boolean, PictureFromURL(sUrl, [UseCache], [DrawProgress]) As Boolean, PictureGetStream() As Byte(), PictureDelete(), DrawLine(...), Polygon(...). Eventos: Click, DblClick, MouseDown/Move/Up, MouseEnter/Leave/Over/Out, PrePaint/PostPaint, KeyPress/KeyUp/KeyDown, OLEDragDrop/OLEDragOver, PictureDownloadProgress/Complete/Error, TabFocus.

Controles gráficos (dashboards)

Visualização em GDI+, carga por SQL. Todos expõem Image([Width], [Height]) As IPicture, Refresh, GetWindowsDPI() As Double, RGBtoARGB(...) e os eventos Click, DblClick, MouseDown/Move/Up.

  • ucChartBar — barras/linhas, múltiplas séries, legenda, eixos. Métodos: Clear, AddSerie(SerieName, SerieColor, Values As Collection, [cCustomColors]), UpdateSerie(...), AddAxisItems(AxisItems As Collection, ...), CarregarSQL([pSQL]). Props: SQL, Title/TitleFont, ChartStyle, LabelsPositions, LegendAlign, AxisMax/AxisMin, cores/linhas.
  • ucChartArea — área/linha. Métodos: Clear, AddLineSeries(SerieName, Values As Collection, SerieColor), AddAxisItems(...), CarregarSQL([pSQL]). Props: SQL, AxisMax/AxisMin, LegendAlign, cores/linhas.
  • ucPieChart — pizza/rosca. Métodos: Clear, AddItem(ItemName, Value, ItemColor, [Special]), GetCenterPie(X, y), CarregarSQL([pSQL]). Props: Count (Get), ItemColor(Index), DonutWidth, Rotation, ChartStyle, LabelsPositions, LegendAlign. Evento extra: ItemClick(Index As Long).
  • ucTreeMaps — treemap. Métodos: Clear, CarregarSQL(pSQL), AddLineSeries(SerieName, SerieColor, cValues As Collection, [cLabels], [cIconsFonts], [cKeys], [cCustomColors]). Props: LabelsPositions, IconsPositions/IconFont, LegendAlign, ShowToolTips, CornerRound. Evento extra: ItemClick(Key As Variant).
  • ucProgressCircular — progresso circular/gauge animado. Métodos: CarregarSQL(pSQL), AddPaletteColors(lPalette()), GetPaletteColors() As Long(), DrawGradientArc(...). Props: Value (Single), Min/Max, Angle/StartAngle/GradientAngle, Caption1/Caption2 (+ForeColor/Font), DisplayInPercent, ShowAnimation/AnimationInterval, estilos de anel (PF_*/PB_*/Center*).

Observações finais

  • ucCPFCNPJ é o único controle sem membro público (stub de design na fonte atual).
  • Os controles data-bound expõem eventos de domínio específicos (Procura,

ComandoClick, DetalheClick, CommandClick, AddRemoveClick, ItemClick, ItemCheck, Selecionou, Change), não os eventos genéricos Click/Mouse*. Os controles gráficos e ucLabelPlus usam Public Event (incluindo Click/Mouse*).

  • Validate() é método (Function As Boolean), não evento.
  • Eventos de persistência (InitProperties/ReadProperties/WriteProperties) foram

omitidos por serem padrão do VB6 UserControl.

Referência de API — .NET

NeXT LowCode SDK · NeXT.LowCode.Core + NeXT.LowCode.WinForms · extraído da fonte real

Documentação de referência do SDK .NET, extraída da fonte real em dotnet\src\. Documenta apenas membros public.

  • NeXT.LowCode.Core (netstandard2.0) — engine e acesso a dados, sem UI.

Namespaces NeXT.LowCode.Core e NeXT.LowCode.Core.Data.

  • NeXT.LowCode.WinForms (net481) — os controles low-code e o helper de forms.

Namespace NeXT.LowCode.WinForms.


Conceito em 1 minuto

O SDK é dirigido por metadados, não um gerador de código. Cada controle na tela implementa IFormControl e carrega dois metadados:

  • DataField — a coluna que ele representa.
  • TypeControl — o tipo do valor (TipoCaracter), que decide formatação e

conversão para parâmetro SQL.

O FormEngine (núcleo) percorre a lista de controles em tempo de execução, monta o SQL parametrizado (anti-injeção) e persiste. Na camada WinForms, o WinFormsFormHelper coleta automaticamente os IFormControl/IFormDetail da árvore de Controls, e o LowCodeToolbar faz o CRUD sem você escrever SQL.

Nada é gerado em disco. A fonte da verdade é o metadado, lido a cada operação.

Quick-start (WinForms)

// 1) configurar a base uma vez (provider + connection string)
var db = new Database(new SqliteProvider(), "Data Source=app.db");

// 2) na tela, arraste controles low-code e defina DataField/TypeControl:
//    txtCodigo (LowCodeCodigo)  -> DataField="codcli", TypeControl=Numerico   (PK)
//    txtNome   (LowCodeTextBox) -> DataField="nome"
//    cboCidade (LowCodeComboBox)-> DataField="codcidade", Sql="SELECT codcidade,nome FROM tbcidade"

// 3) a toolbar faz o CRUD — sem SQL no form:
toolbar.Db = db;
toolbar.DataTable = "tbcliente";
toolbar.DataField = "codcli";
toolbar.PkControl = txtCodigo;   // liga o load-on-code (digitar o código carrega o registro)

// (equivalente manual, se não usar a toolbar)
WinFormsFormHelper.FormSalvar(db, this, "tbcliente", txtCodigo, "codcli");
WinFormsFormHelper.FormLerRegistro(db, this, "tbcliente", txtCodigo, "codcli",
    operacao: TipoOperacao.ProximoRegistro);

PARTE 1 — Funções (núcleo + helpers)

Enums (Enums.cs, namespace NeXT.LowCode.Core)

enum TipoCaracter

Tipo do valor de um campo. Decide a formatação para exibição e a conversão para parâmetro SQL.

MembroValorMembroValor
Alfanumerico0AlfanumericoBranco6
Numerico1NumericoNotNull7
DataDMY2DataDMYHora8
Procura3AlfanumericoPlaca9
ProcuraFull4Quantidade10
ValorNumerico5Peso11
ProcuraNumerico12AlfanumericoCaixaAltaBaixa13
AlfanumericoBrancoNull14

enum Alinhamento

Esquerda = 0, Direita = 1, Centro = 2

enum TipoOperacao

Navegação de registros. LerRegistro = 0, ProximoRegistro = 1, RegistroAnterior = 2

enum FormEstado

Estado do formulário (habilitação de controles). FEInclusao = 1, FEAlteracao = 2, FEExclusao = 3, FENovo = 4, FEConsulta = 5

enum DescricaoLayout

Layout do item exibido em combo SQL-driven. DescricaoeCodigo = 0, SomenteDescricao = 1, SomenteCodigo = 2

enum TypeCommand

Comandos de uma toolbar de CRUD. TC_New = 0, TC_Save = 1, TC_Del = 2, TC_Next = 3, TC_Previous = 4, TC_Print = 6, TC_Procura = 12, TC_Help = 13, TC_Limpar = 14, TC_Exit = 15

enum TypeAddRemove (namespace NeXT.LowCode.WinForms, em LowCodeAddRemove.cs)

Comandos da barra de itens. Add = 0, Remove = 1, Clear = 2, ClearAll = 3


interface IFormControl (IFormControl.cs)

Contrato que todo controle low-code implementa para participar do engine.

MembroTipoAcesso
DataFieldstringget/set — coluna da tabela (vazio = não persiste)
DataTablestringget/set — tabela alvo (informativo)
TypeControlTipoCaracterget/set — tipo do valor (formatação/conversão)
Textstringget/set — representação textual (entrada/saída principal)
Valueobjectget — valor "bruto" (ex.: combo → chave selecionada)
Visibleboolget/set
Enabledboolget/set

interface IFormDetail (IFormDetail.cs)

Contrato de uma grade de detalhe (master-detail); encapsula a própria persistência e carga.

MembroAssinaturaDescrição
DetailTablestring { get; }tabela filha (ex.: tbemprestimoitem)
DetailFKstring { get; }coluna FK que aponta para o cabeçalho
Changedbool { get; }true se a grade foi alterada desde a última carga
ColunasDestinostring[] { get; }colunas do BD gravadas
TiposDestinoTipoCaracter[] { get; }tipos das colunas destino
GetRows()DataTable GetRows()linhas em memória (nomes == ColunasDestino)
Load(...)void Load(Database db, long valorFK)recarrega a exibição do BD para o mestre dado

static class StringHelper (StringHelper.cs)

Formatação/conversão de valores (pt-BR). Sem dependência de UI ou banco.

Propriedades estáticas: CasasDecimaisValor (int, default 2), CasasDecimaisQtde (int, default 3), CasasDecimaisPeso (int, default 3), GravarUpper (bool, default false).

Métodos estáticos:

AssinaturaPropósito
string FMoeda(object valor, int casasDecimais = 0, bool naoExibirCasasDecimais = false)Formata moeda pt-BR (vírgula decimal, milhar)
decimal DMoedaDbl(object valor, int casasDecimais = 0)Converte para decimal com segurança
string DMoedaP(object valor, int casasDecimais = 0)Moeda com PONTO decimal (SQL/export, invariant)
string FQtde(object valor, int casasDecimais = 0)Formata quantidade pt-BR
decimal DQtde(object valor, int casasDecimais = 0)Quantidade → decimal
string FPeso(object valor, int casasDecimais = 0)Formata peso pt-BR
decimal DPeso(object valor, int casasDecimais = 0)Peso → decimal
string FormataCPFCNPJ(string valor)Formata CPF (11) ou CNPJ (14)
string FormataCep(string valor)Formata CEP (8 dígitos → nnnnn-nnn)
string FormataTelefone(string valor)Formata telefone (10/11 dígitos)
string CNumerico(object valor)Extrai apenas os dígitos
string AllTrim(string valor)Trim + colapsa espaços duplos
string Rp(string texto)Duplica aspas simples (prefira parâmetros SQL)
string Zeros(string valor, int qtde = 2, bool preencherZerosEmpty = false, bool truncaSeMaior = false)Preenche zeros à esquerda
string DInscricaoEstadual(string valor)Remove tudo que não é alfanumérico
string FData(object valor, bool incluirHora = false)Formata data dd/MM/yyyy (opc. com hora)
DateTime? DData(string valor)Parse de data (dd/MM/yyyy, yyyy-MM-dd, com/sem hora)
string RetornarTimeStamp()Timestamp de auditoria yyyyMMddHHmmss
object ENulo(object valor, TipoCaracter tipo = TipoCaracter.Alfanumerico, bool convertNull = false, int tamMax = 0)Converte valor do BD para exibição respeitando o tipo
decimal ToDecimal(object valor)Converte qualquer valor para decimal (pt-BR e invariant)

interface IDbProvider (Data\IDbProvider.cs, namespace NeXT.LowCode.Core.Data)

Abstração do provedor de banco; concentra o que varia entre SGBDs.

MembroAssinaturaPropósito
CreateConnectionDbConnection CreateConnection(string connectionString)Cria (sem abrir) uma conexão
ParameterPrefixstring { get; }Prefixo de parâmetro nomeado (ex.: "@")
NextPkSqlstring NextPkSql(string tabela, string pk, string pkFK)SQL do próximo PK (MAX+1), opc. filtrado por FK (@p0)
ColunaExistebool ColunaExiste(DbConnection conn, DbTransaction trans, string tabela, string coluna)Verifica existência de coluna via metadados nativos

sealed class SqliteProvider : IDbProvider (Data\SqliteProvider.cs)

Provedor SQLite (Microsoft.Data.Sqlite). PK via COALESCE(MAX(pk),0)+1; metadados via PRAGMA table_info.

MembroRetorno
ParameterPrefix"@"
CreateConnection(string)new SqliteConnection(...)
NextPkSql(tabela, pk, pkFK)SELECT COALESCE(MAX(pk),0)+1 FROM tabela [WHERE pkFK = @p0]
ColunaExiste(...)via PRAGMA table_info(tabela)
Outros bancos: implemente IDbProvider (ex.: MySQL, SQL Server) e passe ao Database. O restante do SDK não muda.

class Database (Data\Database.cs)

Camada de acesso a dados. Instância configurada com IDbProvider + connection string.

Anti-injeção: toda leitura/escrita usa parâmetros nomeados (@p0, @p1, …). Cada elemento de object[] parametros vira um DbParameter (@p{i} = parametros[i] ?? DBNull.Value). Input do usuário nunca é concatenado no SQL — apenas nomes de tabela/coluna (vindos do código do desenvolvedor) entram no texto.

Construtor: Database(IDbProvider provider, string connectionString) — lança ArgumentNullException se provider nulo; ArgumentException se connection string vazia.

Propriedades: Provider (IDbProvider get), ConnectionString (string get).

Métodos:

AssinaturaPropósito
DbConnection AbreConexao()Cria e abre uma conexão
int ExecutaComando(string sql, params object[] parametros)INSERT/UPDATE/DELETE; retorna linhas afetadas
int ExecutaComando(DbConnection conn, DbTransaction trans, string sql, params object[] parametros)Idem, em conexão/transação existente
DataTable RecuperaRegistros(string sql, params object[] parametros)SELECT → DataTable
DataTable RecuperaRegistros(DbConnection conn, DbTransaction trans, string sql, params object[] parametros)Idem, em conexão/transação existente
object RecuperaRegistroUnicoValor(string sql, params object[] parametros)Scalar; null se DBNull/null
object RecuperaRegistroUnicoValor(DbConnection conn, DbTransaction trans, string sql, params object[] parametros)Idem, em conexão/transação existente
long CodInicioPKMax(string tabela, string pk, string pkFK = null, long codPKFK = 0)Próximo PK (MAX+1) via dialeto do provider
long CodInicioPKMax(DbConnection conn, DbTransaction trans, string tabela, string pk, string pkFK = null, long codPKFK = 0)Idem, dentro de conexão/transação (evita race no INSERT)
double RetornarCodigoProximoAnterior(string tabela, string chave, double codAtual, TipoOperacao tipo = TipoOperacao.ProximoRegistro)Próximo/anterior código (navegação)
void ExecutaTransacao(Action<DbConnection, DbTransaction> acao)Executa acao em transação (Commit/Rollback automático)
bool ColunaExiste(string tabela, string coluna)True se a coluna existe (cacheado); em falha assume false

static class FormEngine (FormEngine.cs)

Engine de formulários dirigido por metadados — CRUD automático iterando sobre IList<IFormControl> e lendo DataField/TypeControl de cada controle. Desacoplado de qualquer UI.

AssinaturaPropósito
bool FormLerRegistro(Database db, IList<IFormControl> controles, string tabela, IFormControl ctrlPK, string nomePK, IFormControl ctrlPKFK = null, string nomePKFK = null, TipoOperacao operacao = TipoOperacao.LerRegistro, IList<IFormDetail> detalhes = null)Lê registro pela PK (e opc. PK/FK composta), preenche os controles e recarrega grades de detalhe
bool FormLerRegistro(Database db, IList<IFormControl> controles, string tabela, IFormControl ctrlPK, string nomePK, out FormAuditInfo auditInfo, IFormControl ctrlPKFK = null, string nomePKFK = null, TipoOperacao operacao = TipoOperacao.LerRegistro, IList<IFormDetail> detalhes = null)Sobrecarga que também devolve auditoria (codusuario/time_stamp)
bool FormSalvar(Database db, IList<IFormControl> controles, string tabela, IFormControl ctrlPK, string nomePK, IFormControl ctrlPKFK = null, string nomePKFK = null, long codUsuario = 0, IList<IFormDetail> detalhes = null)INSERT ou UPDATE automático (decide por PK vazia/existência); gera PK; grava grades de detalhe na mesma transação
void FormExcluir(Database db, string tabela, string nomePK, long valorPK)DELETE do registro pela PK
void FormExcluir(Database db, string tabela, string nomePK, long valorPK, IList<IFormDetail> detalhes)Exclui cabeçalho + grades de detalhe (cada DetailTable pela FK) na mesma transação
DataTable FormLerDetalhe(Database db, string tabela, string campoFK, long valorFK, string campos, string joins = "")Lê itens de detalhe da tabela filha pela FK (alias i)
void FormSalvarDetalhe(Database db, string tabela, string campoFK, long valorFK, DataTable dados, string[] colunasOrigem, string[] colunasDestino, TipoCaracter[] tiposDestino, long codUsuario = 0)Regrava detalhe: DELETE da FK + INSERT de cada linha (transação própria). Lança ArgumentException se tamanhos divergirem
void FormHabilitar(IList<IFormControl> controles, FormEstado estado)Habilita se FEAlteracao/FEInclusao; senão desabilita
void FormLimpar(IList<IFormControl> controles)Zera o Text de todos os controles
void PreencherControle(IFormControl fc, object dbValue)Preenche o controle formatando pelo TypeControl
object ExtrairValorParaSQL(IFormControl fc)Retorna ConvValor(fc.Text, fc.TypeControl)
object ConvValor(object valor, TipoCaracter tipo)Conversão central valor → parâmetro SQL tipado (nunca concatena)

sealed class FormAuditInfo

Dados de auditoria lidos junto com o registro. CodUsuario (long get/set), TimeStamp (string get/set). Construtor inicializa CodUsuario=0, TimeStamp="".


static class WinFormsFormHelper (WinFormsFormHelper.cs, namespace NeXT.LowCode.WinForms)

Wrapper fino WinForms sobre o FormEngine: percorre a árvore de Controls e coleta os que implementam IFormControl/IFormDetail. É a API que o form host chama.

AssinaturaPropósito
IList<IFormControl> GetFormControls(Control container)Coleta recursivamente os IFormControl
IList<IFormDetail> GetFormDetails(Control container)Coleta recursivamente as grades IFormDetail
bool FormLerRegistro(Database db, Control container, string tabela, IFormControl ctrlPK, string nomePK, IFormControl ctrlPKFK = null, string nomePKFK = null, TipoOperacao operacao = TipoOperacao.LerRegistro)Delega ao FormEngine com controles/detalhes coletados
bool FormSalvar(Database db, Control container, string tabela, IFormControl ctrlPK, string nomePK, IFormControl ctrlPKFK = null, string nomePKFK = null, long codUsuario = 0)Delega ao FormEngine.FormSalvar
void FormExcluir(Database db, string tabela, string nomePK, long valorPK)Delega ao FormEngine.FormExcluir (só cabeçalho)
void FormExcluir(Database db, Control container, string tabela, string nomePK, long valorPK)Exclui cabeçalho + grades do form numa transação
void FormHabilitar(Control container, FormEstado estado)Delega ao FormEngine.FormHabilitar
void FormLimpar(Control container)Delega ao FormEngine.FormLimpar
void CarregarCombos(Database db, Control container)Chama Carregar(db) em cada LowCodeComboBox com Sql definido

interface ICampoValidavel (ICampoValidavel.cs)

Controle que dispara evento ao ser validado (sair do campo). Usado pela toolbar para load-on-code quando é a PK.

MembroAssinatura
CampoValidadoevent EventHandler CampoValidado

static class LowCodeTheme (LowCodeTheme.cs)

Tema visual (paleta menta/verde estilo forms VB6).

**Campos public static readonly Color:** Fundo (233,254,253), Painel (232,246,236), Verde (31,107,59), Rotulo (0,102,51), FocoCampo (255,250,205), CampoBg (White).

Método: void Apply(Control root) — aplica o tema recursivamente.


PARTE 2 — Controles (NeXT.LowCode.WinForms)

Todos marcados [ToolboxItem(true)]. Propriedades comuns de IFormControl: DataField (string), DataTable (string), TypeControl (TipoCaracter), Text (string), Value (object, read-only). Visible/Enabled vêm de Control.

LowCodeTextBox : UserControl, IFormControl, ICampoValidavel

Campo de texto low-code (Label + TextBox). Serve texto, numérico, valor e data conforme TypeControl. [DefaultProperty("Caption")].

PropriedadeTipoDescrição
Captionstring get/setRótulo exibido acima do campo
MaxLengthint get/setTamanho máximo (default 0)
DataFieldstring get/setColuna vinculada
DataTablestring get/setTabela (opcional)
TypeControlTipoCaracter get/setTipo (default Alfanumerico)
Textoverride string get/setTexto do TextBox interno (Browsable false)
Valueobject getRetorna o texto interno

Métodos: new void Focus(). Eventos: event EventHandler CampoValidado (load-on-code da PK).

LowCodeCodigo : UserControl, IFormControl, ICampoValidavel

Campo de código/PK (Label + TextBox numérico + botão "..." de busca). Só aceita dígitos. [DefaultProperty("Caption")].

PropriedadeTipoDescrição
Captionstring get/setRótulo
DataFieldstring get/setColuna (PK numérica)
DataTablestring get/setTabela (opcional)
TypeControlTipoCaracter get/setTipo (default Numerico)
Textoverride string get/setTexto interno (Browsable false)
Valueobject getTexto interno

Métodos: new void Focus(). Eventos: event EventHandler CampoValidado (load-on-code); event EventHandler Procurar (clique no botão de busca → o form abre um lookup).

LowCodeComboBox : UserControl, IFormControl

Combo dirigido por SQL (Label + ComboBox + botão "..." de detalhe). Carrega itens de uma consulta (1ª coluna = chave/Value, 2ª = descrição). Text/Value mapeiam para a CHAVE selecionada (FK). [DefaultProperty("Caption")].

PropriedadeTipoDescrição
Captionstring get/setRótulo
Sqlstring get/setSQL de carga (1ª col = chave, 2ª = descrição)
DescricaoLayoutDescricaoLayout get/setComo exibir o item (default DescricaoeCodigo)
DetalheVisiblebool get/setExibe o botão "..." de detalhe (default false)
DataFieldstring get/setColuna vinculada (FK)
DataTablestring get/setTabela (opcional)
TypeControlTipoCaracter get/setTipo (default Numerico p/ FK)
Textoverride string get/setChave selecionada ("" ou "0" limpa) (Browsable false)
Valueobject getSelectedValue do combo
Descricaostring getTexto de exibição do item selecionado (Browsable false)

Métodos: void Carregar(Database db) — executa o Sql, aplica o layout e preserva a seleção (lança InvalidOperationException se o SQL retornar < 2 colunas); new void Focus(). Eventos: event EventHandler DetalheClick (clique no "..." → o form abre o cadastro e recarrega o combo).

LowCodeCheckBox : CheckBox, IFormControl

Checkbox que grava 0/1 em DataField. O caption visível é o Text normal do CheckBox; o Text do IFormControl (0/1) é implementação explícita. [DefaultProperty("Text")].

PropriedadeTipoDescrição
DataFieldstring get/setColuna (grava 0/1)
DataTablestring get/setTabela (opcional)
TypeControlTipoCaracter get/setDefault NumericoNotNull (grava 0, não NULL)
IFormControl.Textstring (explícito)"1"/"0" conforme Checked
Valueobject get1 ou 0

LowCodeOption : RadioButton, IFormControl

Radio button que grava 0/1 em DataField. Opções no mesmo container são mutuamente exclusivas (agrupe em GroupBox/Panel). [DefaultProperty("Text")].

PropriedadeTipoDescrição
DataFieldstring get/setColuna (grava 0/1)
DataTablestring get/setTabela (opcional)
TypeControlTipoCaracter get/setDefault NumericoNotNull
IFormControl.Textstring (explícito)"1"/"0" conforme Checked
Valueobject get1 ou 0

LowCodeData : UserControl, IFormControl

Campo de data (Label + DateTimePicker com checkbox p/ vazio). Text = "dd/MM/yyyy" ou "". [DefaultProperty("Caption")].

PropriedadeTipoDescrição
Captionstring get/setRótulo
PermitirVaziobool get/setPermitir data vazia (default false)
DataFieldstring get/setColuna (data)
DataTablestring get/setTabela (opcional)
TypeControlTipoCaracter get/setDefault DataDMY
Textoverride string get/setData dd/MM/yyyy ("" ou "0" desmarca) (Browsable false)
Valueobject getDateTime quando marcado, senão null

Métodos: new void Focus().

LowCodeImagem : UserControl, IFormControl

Campo de imagem (PictureBox + botões Inserir/Remover). Persiste o caminho do arquivo na coluna (TEXT), sem BLOB. Text = caminho. [DefaultProperty("Caption")].

PropriedadeTipoDescrição
Captionstring get/setRótulo (default "Foto")
DataFieldstring get/setColuna (caminho do arquivo)
DataTablestring get/setTabela (opcional)
TypeControlTipoCaracter get/setDefault Alfanumerico (caminho)
Textoverride string get/setCaminho; ao setar, carrega a imagem (Browsable false)
Valueobject getCaminho armazenado

LowCodeLabel : UserControl, IFormControl

Rótulo bindável read-only (Label título + Label valor). O engine preenche o valor pela coluna DataField; o usuário não edita. [DefaultProperty("Caption")].

PropriedadeTipoDescrição
Captionstring get/setRótulo acima do valor
DataFieldstring get/setColuna a exibir
DataTablestring get/setTabela (opcional)
TypeControlTipoCaracter get/setDefault Alfanumerico
Textoverride string get/setTexto do label de valor (Browsable false)
Valueobject getTexto exibido

LowCodeGrid : DataGridView, IFormDetail

Grade de detalhe (master-detail). Encapsula própria persistência (DELETE+reinsert via engine) e carga (SELECT com join). O form só configura metadados; não escreve SQL.

PropriedadeTipoDescrição
DetailTablestring get/setTabela filha
DetailFKstring get/setColuna FK do cabeçalho
LoadSqlstring get/setSELECT de exibição (alias i; engine adiciona WHERE i.<FK> = @p0)
Linhasint getRows.Count (Browsable false)
Changedbool getAlterada desde a carga (IFormDetail)
ColunasDestinostring[] getCampos persistidos (IFormDetail)
TiposDestinoTipoCaracter[] getTipos persistidos (IFormDetail)

Métodos:

AssinaturaPropósito
void AddPersistColumn(string field, string header, TipoCaracter tipo, bool checkBox = false, int fillWeight = 0, Control editor = null)Coluna gravada no BD (opc. com editor vinculado)
void AddDisplayColumn(string field, string header, int fillWeight = 0, Control editor = null)Coluna só de exibição (ex.: descrição de join)
void LimparGrade()Limpa linhas; zera Changed
int NovaLinha()Adiciona linha vazia; retorna índice
void DefinirCelula(int linha, string campo, object valor)Define valor da célula (trata bool)
object ObterCelula(int linha, string campo)Retorna valor da célula
void RemoverSelecionada()Remove a linha atual (se não for a NewRow)
bool ContemValor(string campo, object valor)True se já existe linha com o valor
int AddRow()Adiciona linha lendo os editores vinculados; valida chave>0 e duplicidade; retorna índice ou -1
DataTable GetRows()Linhas em memória só com colunas persistidas (IFormDetail)
void Load(Database db, long valorFK)Recarrega pela PK do mestre (IFormDetail)

LowCodeAddRemove : ToolStrip

Barra Adicionar/Remover ligada a um LowCodeGrid. Com Grid setada, os botões chamam AddRow()/RemoverSelecionada()/LimparGrade() automaticamente.

PropriedadeTipoDescrição
GridLowCodeGrid get/setGrade alvo (Browsable false)
FocusControlControl get/setControle que recebe foco após a ação (Browsable false)

Eventos: event EventHandler<TypeAddRemove> AddRemoveClick (gancho opcional).

LowCodeToolbar : ToolStrip

Toolbar de CRUD low-code (Novo/Salvar/Excluir/Anterior/Próximo/Limpar/Sair). O form não escreve CRUD: informa Db + DataTable + DataField + PkControl e a toolbar opera via WinFormsFormHelper → FormEngine, incluindo grades de detalhe na mesma transação. Suporta load-on-code (validar a PK com código > 0 carrega o registro).

PropriedadeTipoDescrição
DbDatabase get/setBase de dados (Browsable false)
DataTablestring get/setTabela alvo do CRUD
DataFieldstring get/setColuna PK
PkControlIFormControl get/setControle da PK; ao definir, liga o load-on-code (Browsable false)
CodUsuariolong get/setUsuário para auditoria (Browsable false)
FocusControlControl get/setFoco após a ação (Browsable false)
ShowSaveMessagebool get/setMensagem de sucesso ao salvar (default false)
CanExecuteFunc<TypeCommand, bool> get/setVeto antes da ação; false cancela (Browsable false)

Eventos: event EventHandler<TypeCommand> CommandClick (reação após a ação — ex.: limpar grade, aplicar defaults).