Quando criamos uma função, sabemos que ela retorna somente 1 único valor, porém, existem outras saídas. Imagine uma função que calcule a soma e a subtração de dois números:
function SomarSubtrair(n1, n2: integer): integer;
//desta função podemos obter somente um
resultado
E como retornar os dois?
1ª Opção - Trabalhar com parâmetros por referência:
function SomarSubtrair(n1,
n2: integer; var sub: integer): integer;
A palavra var na declaração acima, indica que
a variável que for passada neste parâmetro será 'atualizada' caso seja
manipulada dentro do procedimento/função, ou seja, o parâmetro sub nada
mais será que
uma referência
a uma
outra variável (a que for passada no parâmetro), exemplo:
consideremos que a função seja:
function SomarSubtrair(n1,
n2: integer; var sub: integer): integer;
begin
result := n1+n2; //grava a soma no resultado da função
sub := n1-n2; //atualiza
a variável passada
no parâmetro sub com a subtração
end;
No onClick de um botão qualquer, faríamos:
var
soma, subtracao: integer;
begin
soma := SomarSubtrair(10,3,subtracao);
//soma recebe o resultado da função
//subtracao recebe o que for atribuído no parâmetro sub, na função
end;
Esta é uma maneira, porém, veremos agora uma segunda opção,
que, em minha opinião,
nos dá mais flexibilidade
além de ser mais organizada.
2ª Opção - Trabalhar com Variáveis Tipadas e/ou Registros:
function OperacoesBasicas(n1,
n2: integer): TResposta;
TResposta? O que é isso? Aí é que está o x da
questão:
type
TResposta = record
Soma: integer;
Subt: integer;
Mult: integer;
Divi: real;
end;
Criamos um tipo de dado do tipo Record (registro), ou seja,
um tipo de dado capaz de guardar 4 informações: 3 números
inteiros e 1 real, conforme esta nossa estrutura.
Essa estrutura deve ser criada na seção Interface de
nossa unit, antes do type TForm1 = class(TForm),
por exemplo.
De agora em diante, quando tivermos uma variável do tipo TResposta, automaticamente
esta variável poderá assumir estes 4 valores. E o que é melhor, o retorno da
nossa função, como mostrado acima, também pode ser do tipo TResposta! Exemplificando:
Imagine o corpo da função da seguinte maneira:
function OperacoesBasicas(n1,
n2: integer): TResposta;
begin
Result.Soma := n1+n2;
Result.Subt := n1-n2;
Result.Mult := n1*n2;
Result.Divi := n1/n2;
//note que a variante Result se transforma automaticamente
//em nosso TResposta, podendo assumir os 4 valores
end;
Dessa forma, poderíamos programar no onClick de um botão:
var
Resposta: TResposta;
begin
Resposta := OperacoesBasicas(10,3);
//armazenamos as respostas na variável
Resposta
//e damos alguns showmessages para mostrar as respostas
ShowMessage(IntToStr(Resposta.Soma));
ShowMessage(IntToStr(Resposta.Subt));
ShowMessage(IntToStr(Resposta.Mult));
ShowMessage(FloatToStr(Resposta.Divi));
end;
Obs.: Caso todas as respostas sejam do mesmo tipo, ao invés de criarmos
um registro para armazenar as respostas, poderíamos criar um vetor, ex:
type TResposta = array[1..4] of integer;
e trabalhar com ele na função, da seguinte maneira:
Result[1] := n1+n2;
Result[2] := n1-n2;
//..e assim vai!
E assim encerro o artigo, onde mostrei que é possível sim obtermos mais de
uma resposta de uma função.
E como dizem: "Não é gambiarra não! É recurso
técnico alternativo!" :-)
Forte Abraço!
Até a próxima.
--
Kelver Merlotti - ActiveDelphi Dream Team
Coordenador Editorial do portal www.activedelphi.com.br
Contato: kelver@activedelphi.com.br
|