sábado, 20 de outubro de 2007

Como retornar múltiplos resultados numa função?

Você já teve a necessidade de retornar múltiplos valores numa função? normalmente a primeira idéia é criar uma procedure com parâmetros passados por referência como abaixo:

procedure GetCalculo(const Valor1, Valor2:Double; var Soma, Media:Double);
begin
Soma := Valor1 + Valor2;
Media := Soma / 2;
end;

//Testando
procedure TForm1.Button1Click(Sender: TObject);
var
Soma, Media:Double;
begin
GetCalculo(100,50,Soma,Media);
ShowMessage('Soma: '+FloatToStr(Soma)+#13+'Media: '+FloatToStr(Media));
end;

Isso funciona perfeitamente, mas veja que precisei declarar as funções que vou receber. Agora imagina se fosse 10 valores no retorno! além da procedure ficar imensa você ainda teria que declarar as variáveis que seriam passadas como referência. Uma técnica mais elegante de fazer isso é criar um record e usar esse tipo na nossa função. Veja o exemplo acima alterado.

//definindo o tipo
type
TCalculo = record
Soma,
Media:Double;
end;

Form1 = Class(TForm)
...


implemetation

function
TForm1.GetCalculo(const Valor1, Valor2:Double):TCalculo;
begin
//Repare que o result agora pode receber vários resutados
Result.Soma := Valor1 + Valor2;
Result.Media :=
Result.Soma / 2;
end;

//Testando
procedure TForm1.Button1Click(Sender: TObject);
var
Calculo: TCalculo;
begin
Calculo := GetCalculo(100,50);
ShowMessage('Soma: '+FloatToStr(Calculo.Soma)+#13+'Media: '+FloatToStr(Calculo.Media));
end;

Com eu falei, não existe muita diferença nessa técnica com a passagem por parâmetros se considerarmos o número de parâmetros, mas com certeza numa função que retorna vários resultados, a segunda opção tornará o seu código muito mais legível e elegante. Até a próxima.


6 comentários:

Guilherme Miranda Carvalho disse...

Ow show de bola esse esquema heinn..
parabénss..

Unknown disse...

Valeu mesmo, estava quebrando a cabeça de como retornar mais de um valor de uma função e sua dica deu certinho.fiz algumas alterações e estou retornando seis valores da mesma função.

Anônimo disse...

Muito bom essa função, mais 200 anos de vida p/ o delphi!!!

Ricardo disse...

Boa noite,
Gostaria de saber como fazer para zera esses parametros media e soma inicializando eles como 0?

Ricardo disse...

Boa noite, gostaria de saber como faço para fazer com que os parametros que foi criado soma e média, posso zera-los dentro de uma function?

Cristiano Martins Alves disse...

Boa noite Ricardo,
basta colocar result.media := 0;