Parâmetro opcional para um método. É possível?

16/07/2004

0

Olá

Já passei por problemas com isso, então resolvi perguntar:

Tem como fazer um método que receba um parâmetro opcional, ou seja, ele pode receber 2 OU 3 parâmetros, por exemplo?

Deste modo:
procedure FazAlgo(I: Integer; S: String; [F: Float]);

de modo que fosse possível chamá-lo, por exemplo, apenas como:
FazAlgo( minhaString, meuInteger); //omissao do parametro F


Não queria construir vários construtores do método, pois, por exemplo, poderia colocar N parâmetros, dependendo da necessidade.
FazAlgo( meuInteger, minhaString1, minhaString2, minhaString3);


Eu já vi algo parecido (ou eh igual?) na manipulação de arquivos (TextFile), como:
procedure Reset(var F [: File; RecSize: Word ] );
procedure Writeln([ var F: Text; ] P1 [, P2, ...,Pn ] );

Claro, eu fiz um teste com uma procedure e não funcionou com essa declaração

Obrigado


Paulo_amorim

Paulo_amorim

Responder

Post mais votado

04/06/2020

Olá

Já passei por problemas com isso, então resolvi perguntar:

Tem como fazer um método que receba um parâmetro opcional, ou seja, ele pode receber 2 OU 3 parâmetros, por exemplo?

Deste modo:
[code:1:5c1562eb96]procedure FazAlgo(I: Integer; S: String; [F: Float&93;);[/code:1:5c1562eb96]
de modo que fosse possível chamá-lo, por exemplo, apenas como:
[code:1:5c1562eb96]FazAlgo( minhaString, meuInteger); //omissao do parametro F[/code:1:5c1562eb96]

Não queria construir vários construtores do método, pois, por exemplo, poderia colocar N parâmetros, dependendo da necessidade.
[code:1:5c1562eb96]FazAlgo( meuInteger, minhaString1, minhaString2, minhaString3);[/code:1:5c1562eb96]

Eu já vi algo parecido (ou eh igual?) na manipulação de arquivos (TextFile), como:
[code:1:5c1562eb96]procedure Reset(var F &91;: File; RecSize: Word &93; );
procedure Writeln(&91; var F: Text; &93; P1 &91;, P2, ...,Pn &93; );[/code:1:5c1562eb96]
Claro, eu fiz um teste com uma procedure e não funcionou com essa declaração

Obrigado




Olá, sei que o tópico é bem antigo e provavelmente muitas pessoas tem a mesma dúvida e podem acabar vindo até aqui, más existe uma forma de fazer exatamente o que quer porém com uma funcionalidade da POO que se chama sobrecarga de métodos, isso permite criar várias chamadas de um método com o mesmo nome porém se comportando de maneiras diferentes e com parâmetros diferentes.
Para isto basta apenas incluir o comando overload; após a declaração do seu método.
Obs: funciona tanto em procedures quanto em funções, desde que o tipo de retorno no caso de funções sejam exatamente do mesmo tipo, já parametros podem ser em quantidades e tipos diferentes e neste caso especifico o tipo do parametro passado que vai determinar qual dos métodos chamar.

Abaixo exemplo de como implementar na declaração dos metodos:
[/code]
private
function soma(n1, n2 : integer) : integer; overload;
function soma(n1, n2 : string) : integer; overload;
function soma(n1, n2, n3 : integer) : integer; overload;

espero que tenha ajudado.

Marcus Pereira

Marcus Pereira
Responder

Mais Posts

16/07/2004

Vinicius2k

Olá Amorim !

Bem, não sei é exatamente isso que vc precisa, se não for desculpe-me, mas vc pode omitir parametros na chamada a uma procedure/function desde que este parametro possua um valor default na declaração...
Por exemplo:
procedure MinhaProc ( S: String; N: Byte = 1);
begin
  ...
end;

Na chamada à MinhaProc eu posso omitir o parametro N pois o valor default dele é 1...
MinhaProc(´Teste´);


Espero ter ajudado...
T+


Responder

16/07/2004

Cabelo

Paulo..

Vc pode sim...

Eu fiz isso e funcionou..

Passe um vetor do tipo record.. como parâmetro..

Neste vetor vc declara as variáveis que deseja, de vários tipos, que passariam então a ser seus parâmetros, independente da quantidade de parâmetros..

Vc utilizaria o método setlength para implementar ele..

espero ter ajudado..

Cabelo


Responder

16/07/2004

Persist

É muito comum utilizar o que o vinicius2K expos e se não me engano, acho que só foi implementado a partir do Delphi 5.


Responder

16/07/2004

Paulo_amorim

Olá

Muito obrigado a vocês! Mataram minha dúvida :D

Até+


Responder

16/07/2004

Tatuweb

Eu já vi algo parecido (ou eh igual?) na manipulação de arquivos (TextFile), como:
procedure Reset(var F [: File; RecSize: Word ] );
procedure Writeln([ var F: Text; ] P1 [, P2, ...,Pn ] );
Claro, eu fiz um teste com uma procedure e não funcionou com essa declaração


Só complementando o que já foi dito vc pode criar parâmetros opcionais declarando um array e jogar os valor entre colchetes. Para ficar mais claro dê uma olhada no exemplo abaixo:

function Soma (Ns: array of DWord): DWord;
var
  k, LenNs: Word;
begin
  Result := 0;
  LenNs := Length (Ns) - 1;

  for k := 0 to LenNs do
  begin
    Result := Result + Ns[k];
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := IntToStr (Soma ([2,4,4,12,5]));
end;


A rotina acima vai somar todos os numeros tanto forem os argumentos passados.


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar