Como abortar no meio de um procedimento?
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?
sei o o Break pode ser utilizado para abordar um laço (for, while). mas para abortar através de uma condição?
Raserafim
Curtidas 0
Respostas
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
23/11/2005
Não seria o comando Exit ?
GOSTEI 0
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;
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
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.
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
23/11/2005
valeu siam e Marlon pelas respostas e Massuda pela explicação
GOSTEI 0
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.
pergunto isso porque eu nunca usei abort, soh uso exit.
GOSTEI 0
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.
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
23/11/2005
Quer dizer que num bloco try/finally o Abort não passa pelo finally ?
GOSTEI 0
Raserafim
23/11/2005
Massuda então me diz uma coisa
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.
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
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.....
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
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
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
espero ter ajudado
GOSTEI 0
Raserafim
23/11/2005
blz, valeu pessoal. neste caso vou utilizar o Exit
GOSTEI 0
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
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
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