Depois de um longo tempo afastado do blog, estamos retornando. Iremos iniciar uma serie de artigos dedicados as estruturas de dados do Free Pascal. Mas antes de iniciar e necessario uma breve introducao a variaveis procedurais. Variaveis procedurais ou tipos procedurais sao um recurso do Free Pascal que permite armazenar metodos, funcoes e procedimentos em variaveis. Tais variaveis podem ser normalmente tratadas, passando-as como parametros e chamando os metodos quando for necessario.Para exemplificar o uso deste recurso vejamos como declarar um tipo procedural:type TFuncaoSemParametro = function(): String; TFuncaoComParametro = function(x: String): String;O primeiro exemplo declara um tipo que armazena um funcao que nao recebe argumentos. O segundo exemplo declara um tipo que armazena uma funcao que recebe parametros.Tipos procedurais tambem podem ser declarados de mais duas maneiras, como pode ser visto abaixo. O primeiro declara um tipo para armazenar um procedimento e o segundo armazena um metodo de uma classe:type TProcedimento = procedure; TMetodo = procedure of Object;Prosseguindo entao com nosso exemplo, em seguida iremos declarar as funcoes: function AloMundo: String;begin Result := 'Alo Mundo';end;function AloNovamente(S: String): String;begin Result := 'Alo ' + S;end;Essas duas funcoes serao usadas como argumentos nas chamadas aos dois procedimentos seguintes, que recebem como parametros os tipos procedurais declarados.procedure Primeiro(f: TFuncaoSemParametro);begin WriteLn(f());end;procedure Segundo(f: TFuncaoComParametro);begin WriteLn(f('Novamente'));end; Observe que tanto o procedimento Primeiro, quanto o procedimento Segundo executam a funcao que recebem como parametro. As funcoes chamadas irao retornar Strings que serao escritas no console atraves de writeln.Para testar a funcionalidade apenas chame os procedimentos assim:Primeiro(@AloMundo);Segundo(@AloNovamente);O simbolo @ converte a variavel em um ponteiro. E desta forma que a funcao e passada como parametro.E importante observar que o compilador verifica se a funcao ou o procedimento que esta sendo passado como parametro corresponde exatamente ao esperado, ou seja, possui os mesmos parametros, o mesmo tipo de retorno, etc.O mecanismo usado pelos eventos de componentes da biblioteca do Lazarus e exatamente este. Veja como pode ser criado um componente dinamicamente e como atribuir um metodo a um evento de um TButton no post Lazarus - Criando componentes em run-time.A seguir o codigo completo da aplicacao console:program procvar;{$mode objfpc}{$H+}uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { you can add units after this };type TFuncaoSemParametro = function(): String; TFuncaoComParametro = function(x: String): String;function AloMundo: String;begin Result := 'Alo Mundo';end;function AloNovamente(S: String): String;begin Result := 'Alo ' + S;end;procedure Primeiro(f: TFuncaoSemParametro);begin WriteLn(f());end;procedure Segundo(f: TFuncaoComParametro);begin WriteLn(f('Novamente'));end;{$R *.res}begin Primeiro(@AloMundo); Segundo(@AloNovamente); ReadLn;end.Atualizado em 03/05/2011. Muita coisa mudou no Lazarus desde que comecamos a dedicar este blog a divulgacao deste poderoso IDE. Quando iniciamos usavamos a versao 0.9.28 e publicamos dois artigos voltados para o uso do conjunto de componentes SQLdb:Lazarus - Acessando banco de dados com SQLdb - Parte I Lazarus - Acessando banco de dados com SQLdb - Parte II Hoje estamos com a versao 0.9.31. Neste post iremos apresentar algumas mudancas para melhor na utilizacao desses componentes.Referencias aos campos de uma tabela - criacao de TFieldsPara criar os TFields ainda e necessario que a TSQLQuery esteja ativa. De um duplo clique na TSQLQuery e voce vera uma janela como esta:Esta janela oferece uma barra