Pascal é a possibilidade de criar controles mesmo quando não sabemos de qual classe iremos instanciar. Através desse recurso, podemos entender a forma pela qual o Delphi trabalha em seu ambiente integrado de desenvolvimento quando clicamos em um SpeedButton da paleta de componentes e em seguida no formulário onde desejamos adicionar o mesmo.

A partir dos exemplos mostrados neste artigo, desenvolveremos um componente que fará a conexão a um banco de dados que contém os registros dos controles a serem criados no novo formulário, bem como uma aplicação exemplo desse novo componente.

Preparação do banco de dados

Antes de começarmos a criar o componente, precisamos fazer as configurações necessárias no banco de dados, como criar as tabelas do “Dicionário de Formulários” e as tabelas que farão parte do sistema propriamente dito, que utilizaremos como teste para criar os controles desejados.

O banco de dados escolhido foi o Firebird, por ser gratuito e de fácil conexão através da tecnologia dbExpress. Chamaremos o conjunto de tabelas responsáveis pelos registros dos formulários dinâmicos como Dicionário de Formulários, representado por duas tabelas: “Formulario” e “Controle”.

Na tabela Formulario incluiremos os campos principais para a criação do formulário e na Controle, como o nome sugere, incluiremos os campos para a criação dos controles do formulário. Na Listagem 1 temos o código para criação das tabelas.

Listagem 1. Código de criação das tabelas

            CREATE TABLE FORMULARIO (

                IDFORMULARIO INTEGER NOT NULL PRIMARY KEY,
              
                NOME VARCHAR(30) NOT NULL,
              
                FORMWIDTH INTEGER,
              
                FORMHEIGHT INTEGER,
              
                CAPTION VARCHAR(60)
              
              );
              
               
              
              CREATE TABLE CONTROLE (
              
                IDCONTROLE INTEGER NOT NULL,
              
                IDFORMULARIO INTEGER NOT NULL
              
                  REFERENCES FORMULARIO(IDFORMULARIO),
              
                ORDEM INTEGER,
              
                DISPLAYLABEL VARCHAR(50),
              
                FIELD VARCHAR(50),
              
                CONTROL VARCHAR(50),
              
                FIELDMASK VARCHAR(40),
              
                VISIBLE CHAR(1),
              
                FIELDTYPE VARCHAR(20),
              
                FIELDKIND VARCHAR(20),
              
                LOOKUPTABLE VARCHAR(50),
              
                KEYFIELDS VARCHAR(40),
              
                LOOKUPKEYFIELDS VARCHAR(40),
              
                LOOKUPRESULTFIELD VARCHAR(40),
              
                CONTROLWIDTH INTEGER,
              
                CONTROLHEIGHT INTEGER
              
              )
        

Nesse ponto, precisamos entender a necessidade dos campos da tabela Controle:

  • Ordem: será a ordem na qual o controle será criado;
  • DisplayLabel: para as classes TField será criado um Label adicional para mostrar o título do campo, para os demais controles visuais será utilizado para configurar o Caption;
  • Field: representa o campo da tabela;
  • Control: representa o controle a ser criado para aquele campo;
  • FieldMask: a máscara atribuída ao campo;
  • FieldType: pode ser ftInteger para campos do tipo inteiro ou ftString para campos do tipo string;
  • FieldKind: o tipo do campo, no nosso exemplo utilizaremos fkData e fkLookup;
  • LookupTable: para o FieldKind do tipo fkLookup, se faz necessário configurar qual tabela será utilizada para a pesquisa, bem como KeyFields, LookupKeyFields e LookupResultField;
  • ControlWidth e ControlHeight: servem para especificar a largura e a altura respectivamente.

O próximo passo é incluir os registros nas tabelas criadas anteriormente, conforme a Listagem 2.

Listagem 2. Código para inserção dos dados

INSERT INTO FORMULARIO VALUES (1,'CLIENTE', 450, 450,
  'Cadastro de Clientes');

INSERT INTO CONTROLE VALUES (1, 1, 1, NULL, NULL,
  'TDBNavigator', NULL, 'S', NULL, NULL, NULL, NULL,
  NULL, NULL, NULL, NULL);

INSERT INTO CONTROLE VALUES (2, 1, 2, 'Código',
  'IDCliente', 'TDBEdit', NULL, 'S', 'fkData', NULL,
  'ftInteger', NULL, NULL, NULL, 50, NULL);

INSERT INTO CONTROLE VALUES (3, 1, 3, 'Nome', 'Nome',
  'TDBEdit', NULL, 'S', 'fkData', NULL, 'ftString',
  NULL, NULL, NULL, 200, NULL);

INSERT INTO CONTROLE VALUES (4, 1, 4, 'Idade',
  'Idade', 'TDBEdit', NULL, 'S', 'fkData', NULL,
  'ftInteger', NULL, NULL, NULL, 50, NULL);

INSERT INTO CONTROLE VALUES (5, 1, 5, 'Tefefone',
  'Telefone', 'TDBEdit', '!\(99\)0000-0000;1;_', 'S',
  'fkData', NULL, 'ftString', NULL, NULL, NULL, 80,
  NULL);

INSERT INTO CONTROLE VALUES (6, 1, 6, 'Sexo', 'Sexo',
  'TDBLookupComboBox', NULL, 'S', 'fkLookup', 'Sexo',
  'ftString', 'Sexo', 'IDSexo', 'Descr', 100, NULL);

INSERT INTO CONTROLE VALUES (7, 1, 7, 'Cidade',
  'IDCidade', 'TDBLookupComboBox', NULL, 'S',
  'fkLookup', 'Cidade', 'ftInteger', 'IDCidade',
  'IDCidade', 'Nome', 200, NULL);

INSERT INTO CONTROLE VALUES (8, 1, 8, NULL, NULL,
  'TDBGrid', NULL, 'S', NULL, NULL, NULL, NULL, NULL,
  NULL, 420, 150);
         ... 

Quer ler esse conteúdo completo? Tenha acesso completo