quinta-feira, 7 de abril de 2011

Tirando um maior proveito do Exit

Olá. Estou fazendo uma higienização por aqui, tirando os warnings dos projetos. E teve um que me deixou muito encucado:

[DCC Warning] Unit2.pas(39): W1035 Return value of function 'TForm2.EntradaValida' might be undefined

Vamos ao código:

function TForm2.EntradaValida(piEntrada: Integer): Boolean;
begin
  if (piEntrada > 0) then
  begin
    {...}
    Exit;
  end;

  {...}
  Result := True;
end;

Neste exemplo o compilador reclama que o resultado da função EntradaValida não foi definido.

O compilador foi ninja o suficiente para perceber que se entrar no if..then o método será interrompido pelo comando Exit.

Desde o D2009 podemos chamar o Exit de dentro de uma função passando como parâmetro o resultado desta função. Isso elimina o warning W1035. Veja no exemplo abaixo:

function TForm2.EntradaValida(piEntrada: Integer): Boolean;
begin
  if (piEntrada > 0) then
  begin
    {...}
    Exit(False); {<-- PULO DO GATO}
  end;

  {...}
  Result := True;
end;

É isso ai.

10 comentários:

Wanc disse...

Também passei por isso, mas a solução foi diferente, tirei o EXIT :).

Gabriel disse...

Cara. Dica interessante. Não sabia dessa.

Control Fácil Sistemas disse...

normalmente eu ja defino o result da funcao pra um valor padrao no inicio da mesma, mas essa dica tb vale

Paulo disse...
Este comentário foi removido pelo autor.
Paulo disse...

Olá, gostei desta dica.
Tenho uma pergunta.
Quando a função deve retornar um tipo string, o meu compilador não emite nenhum aviso. Alguma configuração que perdi ou é o comportamento padrão.
(Delphi 2010).

renato disse...

Isso tudo não poderia ser feito assim?

Result := not (piEntrada > 0);

José Mário Silva Guedes disse...

Opa amigons. Por algum motivo só li os comentários hoje.

Wanc, boa solução.

Gabriel, obrigado.

Control Fácil, a sua abordagem é corretíssima.

Paulo, eu não tinha percebido esta situação. Acredito que o problema se manisfeste apenas com tipos ordinais.

Renato, poderia sim. O exemplo é didático e talvez tivesse mais sentido para você se fosse um Integer.

Forte abraço a todos!

Karlo Uchôa Pinto disse...

Olá,

Estou batento cabeça na minha migração do Delphi 7 para o Delphi 2010.

Como posso implementar algo parecido neste código?

function TQRBarcode.GetCanvas: TCanvas;
var
Bitmap: TBitmap;
begin
if Picture.Graphic = nil then
begin
Bitmap := TBitmap.Create;
try
Bitmap.Width := Width;
Bitmap.Height := Height;
Picture.Graphic := Bitmap;
finally
Bitmap.Free;
end;
end;

if Picture.Graphic is TBitmap
then Result := TBitmap(Picture.Graphic).Canvas;
end;

Ao compilar recebo a mesma mensagem que voce estava recebendo.

Obrigado

José Mário Silva Guedes disse...

Olá Karlo,

O motivo de você estar recebendo o warning no seu código é o por conta do Delphi perceber que o Result não será sinalizado se cair no else.

Sugestão simples é na primeira linha colocar:

Result := nil;

Creio que resolva.

Jonathan Fabricio Seibel disse...

Boa Dica... agora uma boa pratica é sempre iniciar com o valor do resulta padrão... neste caso result := false;

Minha lista de blogs