Como abortar no meio de um procedimento?

Delphi

23/11/2005

Qual comando posso utilizar para ir direto para o fim de um procedimento?
sei o o Break pode ser utilizado para abordar um laço (for, while). mas para abortar através de uma condição?


Raserafim

Raserafim

Curtidas 0

Respostas

Edilcimar

Edilcimar

23/11/2005

infelizmente até hoje eu procurei um substituto para o return do clipper, no delphi e ainda não achei!


GOSTEI 0
Siam

Siam

23/11/2005

Não seria o comando Exit ?


GOSTEI 0
Marlon Spiess

Marlon Spiess

23/11/2005

Pessoal, um exemplo pra teste.
Criar uma aplicação simples com um label e um button


procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
for i := 1 to 2000 do
begin
label1.Caption := IntToStr(i);
label1.Refresh;
if i = 300 then
begin
label1.Caption := ´Sai´;
label1.Refresh;
Abort;
end;
end;
end;


GOSTEI 0
Massuda

Massuda

23/11/2005

@siam

Exit é a forma tradicional do Pascal/Delphi para sair no ´meio´ de um procedure ou function. Equivale ao return do C e do Clipper (como o Edilcimar citou).

@Marlon

Abort gera uma exceção ´silenciosa´. Use isso em (tratadores de) evento (como no seu exemplo), pois a VCL interrompe o processamento de um evento quando detecta essa exceção.

Por exemplo, (se eu não estiver enganado) se executar Abort no meio do tratamento do evento OnBeforePost de um TTable, o registro não é inserido.


GOSTEI 0
Raserafim

Raserafim

23/11/2005

valeu siam e Marlon pelas respostas e Massuda pela explicação


GOSTEI 0
Vitor Rubio

Vitor Rubio

23/11/2005

massuda, o que acontece se eu usar o exit nessas ocasiões que você recomendou usar abort?

pergunto isso porque eu nunca usei abort, soh uso exit.


GOSTEI 0
Massuda

Massuda

23/11/2005

[quote:de25f6a48e=´vitor^_^´]o que acontece se eu usar o exit nessas ocasiões que você recomendou usar abort? [/quote:de25f6a48e]Não era minha intenção recomendar usar Abort dentro de (tratadores de) eventos.

Na verdade, usar Abort ou Exit depende do que você pretende fazer no tratamento do evento.

Se sua intenção é interromper totalmente o tratamento do evento, use Abort.

Se você usar Exit, simplemente o seu tratamento do evento irá terminar e a VCL continuará tratando o evento. No exemplo com o OnBeforePost, o registro seria gravado.


GOSTEI 0
Siam

Siam

23/11/2005

Quer dizer que num bloco try/finally o Abort não passa pelo finally ?


GOSTEI 0
Raserafim

Raserafim

23/11/2005

Massuda então me diz uma coisa
procedure
begin
  if ... then
  begin
    ...
    ...
  end
  else
    Exit ou Abort;

  ...
  ...

end;


claro q o q eu quero nao é tão simples assim, mas só ilustrando...
nesta situação qual devo usar? quero evitar (caso necessário) as ultimas linhas.


GOSTEI 0
Vitor Rubio

Vitor Rubio

23/11/2005

pelo que eu entendi é o seguinte: qualquer um dos dois vc vai evitar de executar as duas ultimas linhas, mas se vc usar o exit, a vcl continua trantando do manipulador de eventos interno do componente, e apenas sai da rotina que vc criou, que para o componente é o FonAlgumaCoisaAcontece.

Já o abort impede que o FonAlgumaCoisaAcontece termine tambem.

Se vc olhar os fontes dos componentes verá que todo evento na verdade é uma propriedade do tipo TnotufyEvent, e o componente tem uma procedure assim:

FacaAlgo;
begin
....
...
if assigned(FonAlgumaCoisaAcontece) then
FonAlgumaCoisaAcontece();
...
...
end;

sendo que FonAlgumaCoisaAcontece é a rotina que você escreve para o evento, tipo oonclick do botão.

ou seja, o exit sairia de FonAlgumaCoisaAcontece, faria com que não acontecesse mais nada que você programou para o onclick do botão, já o abort pararia tudo, sua rotina e o proprio onclick do botão, fazendo com que a vcl não terminasse de clicar o botão. Sempre que vc clica no botão, alguma coisa ele faz, mesmo não tendo nada programado no onclick. é isso que ele deixaria de fazer.


não sei se eh isso mesmo mas foi isso que eu entendi.....


GOSTEI 0
Massuda

Massuda

23/11/2005

[quote:6ba56bb80d=´vitor^_^´]...o exit sairia de FonAlgumaCoisaAcontece, faria com que não acontecesse mais nada que você programou para o onclick do botão, já o abort pararia tudo, sua rotina e o proprio onclick do botão, fazendo com que a vcl não terminasse de clicar o botão....[/quote:6ba56bb80d]É isso mesmo!


GOSTEI 0
Marlon Spiess

Marlon Spiess

23/11/2005

Basicamente é isso. Ou seja o EXIT sai da procedure/function atual e o ABORT interompe toda e qualquer atividade, voltando ao ponto do chamador. Eu uso muito o no onvalidate dos meus fields, isso faz com q só saia do dbedit, column do dbgrid, etc... se for valido.

espero ter ajudado


GOSTEI 0
Raserafim

Raserafim

23/11/2005

blz, valeu pessoal. neste caso vou utilizar o Exit


GOSTEI 0
Siam

Siam

23/11/2005

vitor^_^ escreveu: ...o exit sairia de FonAlgumaCoisaAcontece, faria com que não acontecesse mais nada que você programou para o onclick do botão, já o abort pararia tudo, sua rotina e o proprio onclick do botão, fazendo com que a vcl não terminasse de clicar o botão.... É isso mesmo!
Então não entendí.Colocando-se [b:bc7c04ed90]Exit[/b:bc7c04ed90] dentro de um bloco try/finally, o finally é executado.
Colocando-se [b:bc7c04ed90]Abort[/b:bc7c04ed90], o finally também é executado.
Qual seria a diferença neste caso ?


GOSTEI 0
Massuda

Massuda

23/11/2005

...Colocando-se [b:f7dc3c8618]Exit[/b:f7dc3c8618] dentro de um bloco try/finally, o finally é executado. Colocando-se [b:f7dc3c8618]Abort[/b:f7dc3c8618], o finally também é executado. Qual seria a diferença neste caso ?
Nenhuma. As regras sobre o funcionamento do finally dizem que o bloco finally..end é sempre executado, incluindo no caso de ocorrer uma exceção (afinal, é para isso que ele foi feito, garantir que um bloco seja sempre executado).

Abort não faz nada de especial: é uma procedure que gera um exceção do tipo EAbort (se não estou enganado). EAbort funciona como qualquer exceção, a diferença é que o código da VCL reconhece essa exceção e trata ela.


GOSTEI 0
Siam

Siam

23/11/2005

Ah bom, pq da maneira como foi exposto anteriormente, deu a entender que a vcl parasse toda a execução do procedimento.


GOSTEI 0
POSTAR