Como abortar no meio de um procedimento?

23/11/2005

6

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?


Responder

Posts

23/11/2005

Edilcimar

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


Responder

23/11/2005

Siam

Não seria o comando Exit ?


Responder

23/11/2005

Marlon Spiess

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;


Responder

23/11/2005

Massuda

@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.


Responder

24/11/2005

Raserafim

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


Responder

24/11/2005

Vitor Rubio

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.


Responder

24/11/2005

Massuda

[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.


Responder

24/11/2005

Siam

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


Responder

24/11/2005

Raserafim

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.


Responder

24/11/2005

Vitor Rubio

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.....


Responder

24/11/2005

Massuda

[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!


Responder

24/11/2005

Marlon Spiess

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


Responder

25/11/2005

Raserafim

blz, valeu pessoal. neste caso vou utilizar o Exit


Responder

25/11/2005

Siam

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 ?


Responder

25/11/2005

Massuda

...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.


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira