You are on page 1of 9

Conceitos bsicos sobre

procedures e functions no Delphi


Veja neste artigo como trabalhar como procedures e functions no
Delphi, conhecendo desde a sintaxe bsica, declarao e
parmetros.
Ol pessoal, neste artigo vou demonstrar como trabalhar com functions e procedures
no delphi, passando por definies, tipos de parmetros de entrada, chamadas e etc.
Esse artigo destinado para o leitor iniciante em Delphi, geralmente existe sempre a
dvida de como trabalhar com essas sub-rotinas. Para os leitores que tem
conhecimento em Java ou C#, pode ser estranho esse termo procedure e function
pois nessas linguagens existem somente chamada mtodos que podem ou no
retornar valores, para diferenciar basta usar a palavra reservada void na assinatura
do mtodo, que indica que tal mtodo no retorna valor. J no Object Pascal
linguagem base do Delphi existem vrias definies diferentes em literaturas e na
internet, mas em particular gosto de usar essa:
PROCEDURE: Sub-rotina que processa informaes e no retorna valor.
FUNCTION: Sub-rotina que processa informaes e retorna um valor.

Sintaxe:
Uma Function pode receber nenhum, um ou vrios parmetros de entrada e retornar
um determinado valor, vamos a sintaxe bsica:
Listagem 1: Sintaxe de um Function
Function NomeFuno(Parmetro1:Tipo;Parmetro2:Tipo): Tipo de Retorno;
Var
{declarao de variveis se necessrio}
Begin
{Instrues}
//Para retornar o valor desejado podemos usar a palavra reservada Result.
Result := Valor de Retorno;

//ou o nome da funo.


NomeFuno := Valor de Retorno;
End;

Um Procedure pode receber nenhum, um ou vrios parmetros de entrada mas no


retorna nenhum tipo de valor, salvo excees que explico mais adiante.
Listagem 2: Sintaxe de um Procedure
procedure NomeProcedure(Parmetro1:Tipo;Parmetro2:Tipo);
Var
{declarao de variveis se necessrio}
Begin
{Instrues}
End;

Exemplos:
Vamos ao exemplo de uma funo muito popular na internet para somar dois valores
inteiros e retornar um valor inteiro. Notem que essa funo vai receber 2 parmetros
do tipo integer e retornar a soma que do tipo integer.
Listagem 3: Funo para somar 2 valores e retornar o valor da soma
function Soma(a, b: integer): integer;
begin
//Retorna o valor da soma a + b.
Result := a + b;
end;

Agora um exemplo de procedure que vai receber um valor inteiro e verificar se esse
valor par ou mpar, ao final emite uma mensagem na tela.
Listagem 4: Procedure para verificar se o valor par ou mpar
procedure VerificaParImpar(a: integer);
begin
if a mod 2 = 0 then
ShowMessage('Nmero par!')
else
ShowMessage('Nmero mpar!');
end;

Notem que a procedure emite uma mensagem avisando se o valor par ou mpar,
essa mensagem no pode ser considerada com um valor de retorno mas sim parte
das instrues de processamento das informaes. J no caso da function ela
processa a soma de a + b e retorna o valor da soma, podemos atribuir esse valor a
um determinado componente ou varivel, na procedure no podemos executar esse
tipo de atribuio, pois ela no possui valor de retorno.

Parmetros:
Como j foi mencionado se necessrio podemos passar parmetros para functions e
procedures, esses parmetros podem ser por valor ou referncia.
Valor: Nos 2 exemplos acima foram passados parmetros por valor, ou seja,
internamente no compilador ser preenchido o parmetro que est entre parnteses
com uma cpia do valor de origem, para que esse valor seja usado dentro da function
ou procedure, mas o valor original no ser alterado, exemplo:
Listagem 5: Exemplo de parmetro por valor
procedure TForm1.btn1Click(Sender: TObject);
var
a, b: Integer;
begin
//Inicia "a" com valor 1
a := 1;
//Varivel "b" recebe o valor de retorno da funo SomaValor passando a vairvel
"a" como parmetro.
b := SomaValor(a);
//Emite mensagem com os valores
ShowMessage('Valor de (a) antes chamada da funo: ' + IntToStr(a) + #13 +
'Valor de (b) aps chamada da funo: ' + IntToStr(b)
'Valor de (a) aps chamada da funo: ' + IntToStr(a));
end;
function TForm1.SomaValor(x: integer): Integer;
begin
//Adiciona 1000 ao valor de a
x := x + 1000;
//Retorna o valor de a
Result := x;
end;

+ #13 +

Figura 1: Mensagem exibindo os valores das variveis a e b


Notem que no houve alterao no valor da varivel a mesmo aps a chamada da
funo, isso porque o valor de a foi copiado para o parmetro x da funo
SomaValor, sendo assim podemos alterar valores de x porque ela no tem vnculo
com a varivel a.
Referncia: Podemos modificar esse contexto se utilizarmos na assinatura da function
antes do nome do parmetro a palavra reservada var, isso indica que ser passado
o endereo da varivel a como parmetro e no mais a cpia do valor como
anteriormente. Desse modo toda e qualquer alterao no valor de x dentro da
function ser revertida para varivel a, exemplo:
Listagem 6: Exemplo de parmetro por referncia
function TForm1.SomaValor(var x: integer): Integer;
begin
//Adiciona 1000 ao valor de a
x := x + 1000;
//Retorna o valor de a
Result := x;
end;

Figura 2: Mensagem exibindo os valores das variveis a e b, usando var


Nesse exemplo utilizamos uma function, tambm poderamos usar sem problemas
uma procedure at porque no retornamos valor mas sim alteramos o valor da
varivel a, isso porque passamos o endereo dessa varivel como parmetro. Ainda
usando var podemos passar qualquer tipo objeto como referncia desde
componentes da VCL at objetos instanciados a partir de classes criadas por ns
mesmos.
Existe outra situao muito interessante nos parmetros das procedures que
podemos usar com muita eficincia, no incio do artigo mencionei que uma procedure
no retorna nenhum tipo de valor, salvo exceo. Essa exceo se aplica ao uso da
palavra reservada out. Quando declararmos a palavra out antes do parmetro,
estamos indicando que ele vai receber um valor de sada da procedure, mas alguns
leitores podem se questionar Procedure no retorna valores!, verdade mas nesse
caso estamos declarando que esse parmetro que nada mais que uma referncia a
uma varivel, vai receber um determinado valor aps o processamento interno da
procedure e consequentemente podemos acess-lo aps a chamada da procedure,
acompanhem o exemplo abaixo:
Listagem 7: Exemplo de parmetro out
procedure TForm1.btn3Click(Sender: TObject);
var
a, retorno: Integer; //varivel "retorno" para capturar o retorno da procedure
begin
//Atribui 1 para varivel "a"

a := 1;
//Chama a procedure SomaValor2 e passa como parmetro a varivel "a"
//e como parmetro de sada varivel "retorno"
SomaValor2(a,retorno);
//Emiti mensagem com o valor da varivel "retorno"
ShowMessage('Valor da varivel (retorno): ' + IntToStr(retorno));
end;
procedure TForm1.SomaValor2(x: integer; out saida: Integer);
begin
//Adiciona 1000 ao valor de "x"
x := x + 1000;
//Atribui o valor de "x" ao parmetro saida que foi declarado como "out"
saida := x;
end;

Figura 3: Mensagem exibindo o valor da varivel retorno usando out


Notem que antes de chamarmos a procedure com parmetro out de retorno temos
que declarar uma varivel do mesmo tipo do parmetro, essa varivel vai receber o
resultado da procedure, caso fosse atribudo algum valor para varivel retorno
antes da chamada da procedure esse valor seria desprezado.

Declarao:

No Delphi todas as procedures e functions so declaradas na seo interface, o


programador define o escopo da funo private, public so os mais utilizados, segue
exemplo da declarao das functions e procedures desse artigo.
Listagem 8: Declarao das functions e procedures
unit UPrincipal;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
btn3: TButton;
procedure btn1Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
private
function SomaValor(x: integer): Integer;
function SomaValorRef(var x: integer): Integer;
procedure SomaValor2(x: integer; out saida: Integer);
public
{ Public declarations }
end;

Podemos ainda declarar uma function ou procedure dentro de outra procedure,


lembrando que ela s ser visvel dentro da procedure de origem, semelhante a
escopo das variveis declaradas dentro das procedures s ficam visveis
internamente. Desse modo no necessrio declarar na seo interface.
Listagem 9: Declarao das functions e procedures dentro de outra procedure
procedure TForm1.btn4Click(Sender: TObject); //Procedure principal
//Declarao interna da function
function Somar(a, b: integer): Integer;
begin
Result := a + b;
end;
var
resultado: Integer;
begin

//Chamando function interna


resultado := Somar(10, 20);
ShowMessage('Valor da soma: ' + IntToStr(resultado));
end;

Figura 4: Mensagem utilizando function dentro da procedure

Chamadas:
Para chamar uma function ou procedure muito simples, no caso da function basta
digitar o mesmo nome da assinatura da mesma, sendo precedida ou no de
parnteses, depende da necessidade de passar parmetros, atribuir o valor de
retorno para uma varivel do mesmo tipo de retorno da function.
Listagem 10: Chamada de uma function
var
resultado: Integer;
begin
//Chamando function, passa os parmetros e atribui o valor de retorno
resultado := Somar(10, 20);
ShowMessage('Valor da soma: ' + IntToStr(resultado));
end;

No caso da procedure, como no existe um valor de retorno basta digitar o mesmo


nome da assinatura da mesma, sendo precedida ou no de parnteses, depende da
necessidade de passar parmetros.
Listagem 11: Chamada de uma procedure
begin
//Chamando procedure com parnteses.
EmitirMensagem();
ou
//Chamando procedure sem parnteses.
EmitirMensagem;
end;

Bom pessoal, demonstrei nesse artigo princpios bsicos de functions e procedures.


Como o nosso Delphi difere alguns conceitos em relao algumas linguagens como
Java e C#, sempre bom pegar essas dicas principalmente para quem est chegando
no Delphi.

Leia mais em: Conceitos bsicos sobre procedures e functions no


Delphi http://www.devmedia.com.br/conceitos-basicos-sobre-procedures-e-functions-nodelphi/25303#ixzz3F6wE2k11

http://www.devmedia.com.br/conceitos-basicos-sobre-procedures-e-functions-no-delphi/25303

You might also like