Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 06 de Outubro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
114 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Multiplos resultados em funções
Publicado por ActiveDelphi : Sexta, Março 24, 2006 - 01:49 GMT-3 (6552 leituras)
Comentários 5 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Kelver Merlotti 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



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: NightOwl : Mar 24, 2006 - 04:30
(Informações sobre o membro | Enviar uma mensagem)
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!


Kelver,

Só para tornar mais fácil a vida de quem for dar manutenção (inclusive vc mesmo após n meses rsrs), a melhor forma de usar um vetor assim é:

const
Soma = 1;
Sub = 2;
Mult = 3;
Div = 4;
type TResposta = array[1..4] of integer;

E na hora de usar:

Result[Soma] := n1+n2;
Result[Sub] := n1-n2;
//..e assim vai!

Ou então:

type

TOperacoesSimples = (osSoma, osSub, osMul, osDiv);

TResposta = array [TOperacoesBasicas] of integer;

E o uso seria:

Result[osSoma] := n1+n2;
Result[osSub] := n1-n2;
//..e assim vai!

Abraços, NightOwl


por: Visitante : Mar 27, 2006 - 12:30
Só para constar:
Por convenção, em FUNCTIONS não se trabalha com valores de referencia, quando vc precisa retornar uma sequencia de informações, vc deve criar um tipo para o result.
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados