Ir para conteúdo
Fórum Script Brasil
  • 0

Fim De Procedures


Ruyfreis

Pergunta

Nusss..to prescisando muito de ajuda... a situação é a seguinte:

Dendro de uma do envento click eu "chamo" uma FUNCTION ou uma PROCEDURE a parte com por exemplo que limpa todas as edits....detro desta PRCEDURE que eu chamo detro do evento click suponhamos te tem um if e caso este if seja acionado ele termine não so a PROCEDURE com também o evento click...como eu faria isto???...

,muito obrigado...valeu....fui........... :lol:

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0
detro desta PRCEDURE que eu chamo detro do evento click suponhamos te tem um if e caso este if seja acionado ele termine não so a PROCEDURE com também o evento click...como eu faria isto???...
O mais correto é que você transforme sua procedure em uma function onde você retorna false e utiliza esta informação para implementar o que você solicita. Vamos supor:

function TForm1.ProcessaAlgo :Boolean;
begin
  Result := False;  // inicializa como não processada
  ...
  if CondicaoNaoContinua then
    Exit;  // forçará a saída da procedure
  ...
  Result := True;  // Significa que processou toda a function
end;
...
procedure TForm1Button1Click(Sender :TObject);
begin
  ...
  if not ProcessaAlgo then  // Aqui você testa se a function foi ou não processada
    Exit;  // Sai sem executar o que estiver depois. 
  ...
end;

Considero esta uma forma mais limpa de pular processos.

Existe um procedure Abort (na SysUtils) que é uma exception silenciosa (ver help), mas acredito que não seja o caso de usá-la.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

OI..mas o caso é que meu evento já esta com muitos IFs e eu to querendo não complicar muito meu codigo fonte..auhau...

...mas como funciona esta função ABORT...ela termina com todos os eventos ???

FALOW

Link para o comentário
Compartilhar em outros sites

  • 0
...mas como funciona esta função ABORT...ela termina com todos os eventos ???
Como mensionei, o help define Abort como uma exception silenciosa. Isso implica no fato de que se você utilizar o Abort numa parte do código que esteja sendo tratada por uma try...except (dentro dele) o procedimento se comportará exatamente como qualquer outra exception.

Vamos supor algo assim:

procedure TForm1.GravaTabela;
begin
  ...
  try
    tabela1.post;
    if Teste = false then
      Abort;
  except
    ShowMessage('Não foi possível gravar');
  end;
  ...
end;

procedure TForm1ButtonClick(Sender :TObject);
begin
  ...
  GravaTabela;
  ShowMessage('Executou comando apos GravaTabela');
end;
Neste exemplo, o try...except pretende tratar o Post na tabela, mostrando um diálogo "normal", não o diálogo padrão para exceptions(com a mensagem em inglês) e sem abortar a sequência de execução do programa. Porém, se Teste for falso haverá execução do Abort. Como resultado o código existente entre exception...end será executado. O que seria outro problema, já que resultaria numa mensagem falsa. Neste exemplo ("didático"), a mensagem existente após a chamada do procedimento (no evento onclick do botão) será executada, fato que não ocorreria se o Abort não estivesse dentro do try...except. Uma alternativa seria modificar o código dentro do except...end para:
  ...
  except
    on E:Exception do
    begin
      E.Message := 'Não foi possível gravar';
      raise;
    end;
  end;
  ...

Com isto, a exception continua sendo executada - abortando - a execução do programa, apresentando a mensagem desejada, porém, curiosamente, se for executada em decorrência do Abort, não será apresentada a mensagem configurada (está associado ao tipo da exception - "silenciosa").

mas o caso é que meu evento já esta com muitos IFs e eu to querendo não complicar muito meu codigo fonte..auhau...
Agora é avaliar seu código e ver se terá que ajustar a este tipo de situação.

Consegui explicar ou compliquei mais? :unsure:

Link para o comentário
Compartilhar em outros sites

  • 0
mas e o raize num entendi direito como ele funciona...

tipo ele faz a mesma coisa do abrot mas não "chama" exception??...

falow

'raise' *aciona* uma exception... (Até onde já tinha visto)

Falows!

P.S: que tal uma 'function'/'procedure' (global), para que seja acessada de qualquer formulário, assim, o único argumento da função seria o formulário e você, dentro da tal função, iria contar (verificar controle por controle dentro do formulário passado como argumento) os controles (creio que seja somente Edit's) e limpar seu conteúdo.

A vantagem seria o reaproveito do código para maioria/todos os formulários do projeto.

Link para o comentário
Compartilhar em outros sites

  • 0
mas e o raize num entendi direito como ele funciona...
A principal função do Raise é permitir que você chame (construa) uma exception. Um exemplo encontrado no help do Delphi:

type
  EPasswordInvalid = class(Exception);
...
if Password <> CorrectPassword then 
  raise EPasswordInvalid.Create('Incorrect password entered');
ou poderia ser criada simplesmente com: raise Exception.Create('Incorrect password entered');
tipo ele faz a mesma coisa do abrot mas não "chama" exception??...
No caso específico de quando você trata uma exceção (utilizando try...except...end) o uso do Raise (como no exemplo) fará com que a o processo de tratamento da exceção continue. Vamos ver se consigo explicar melhor. Se não utilizarmos o tratamento de exceção, quando tivermos uma sequencia de instruções no código, ao falhar uma delas será apresentada uma mensagem informando a exceção e as instruções seguintes não serão executadas (o processamento parou). Isto é o que normalmente não desejamos que ocorrra, por isso frequentemente utilizamos o tratamento de exceção para poder manipular corretamente estas situações. Um exemplo simples:
...
  Data := StrToDate(Edit1.Text);
  if Data > Date then
    ShowMessage('Data não pode ser posterior a atual');
...
Na situação acima, se o conteúdo de Edit1.Text for inválido o programa apresentará a mensagem padrão (em inglês) para este tipo de erro e o teste (if) não será executado. Poderiamos melhorar isto, fazendo o tratamento da exceção:
...
  try
    Data := StrToDate(Edit1.Text);
  except
    Edit1.SetFocus;
    ShowMessage('Data inválida. Informe novamente');
  end;
  if Data > Date then
    ShowMessage('Data não pode ser posterior a atual');
...
Agora, quando a conversão resultar em erro, moveremos o foco devolta para o campo em questão e mostraremos uma mensagem em português. Só que após o usuário clicar no OK da mensagem, o programa seguirá e o teste (if) será realizado - o que não seria correto. Um meio de contornar-mos isto seria adicionar: - uma chamada ao procedimento Exit após o ShowMessage dentro da cláusula except. Só que neste caso, apenas o seguimento do código dentro do procedimento atual será "pulado" (o programa continua); - uma chamada ao procedimento Abort após o ShowMessage dentro da cláusula except. (o programa pára). Mas, gosto mais da próxima abordagem:
...
  try
    Data := StrToDate(Edit1.Text);
  except
    on E:Exception do
    begin
      Edit1.SetFocus;
      E.Message := 'Data inválida. Informe novamente';
      Raise;
    end;
  end;
  if Data > Date then
    ShowMessage('Data não pode ser posterior a atual');
...
Nesta situação, após mover o foco para o componente desejado, alteramos a mensagem padrão que seria apresentada (caso não estivessemos tratando o erro) e "forçamos" que o processo do tratamento de exceção continue (usando o Raise). Isto resulta numa janela de diálogo padrão para exceção, com uma mensagem em português e a execução do programa pára neste ponto. A instanciação das exceções (on E:<tipo de exceção> do) nos permite melhorar muito a interação com o usuário no sentido de apresentar mensagens claras. No exemplo acima, utilizei a classe TException que é a classe base, logo qualquer tipo de exceção será interceptada nesta seção do código. Mas poderíamos tratar da seguinte forma:
...
  try
    Data := StrToDate(Edit1.Text);
  except
    on E:EConvertError do
    begin
      Edit1.SetFocus;
      E.Message := 'Data inválida. Informe novamente';
      Raise;
    end;
    on E:Exception do
    begin
      E.Message := 'Erro desconhecido na conversão da data';
      Raise;
    end;
  end;
  if Data > Date then
    ShowMessage('Data não pode ser posterior a atual');
...

Espero ter exclarecido minhas colocações anteriores e desculpem-me por ter me alongado, mas achei que poderia ser útil. Qualquer comentário e correções são bem vindos.

Link para o comentário
Compartilhar em outros sites

  • 0

além da função Abort(); tem a função Exit();

que funciona igual o Abort();

usando o mesmo código do Micheus:

procedure TForm1.GravaTabela;
begin
  ...
  try
    tabela1.post;
    if Teste = false then
      Exit;
  except
    ShowMessage('Não foi possível gravar');
  end;
  ...
end;

procedure TForm1ButtonClick(Sender :TObject);
begin
  ...
  GravaTabela;
  ShowMessage('Executou comando apos GravaTabela');
end;

Link para o comentário
Compartilhar em outros sites

  • 0
além da função Abort(); tem a função Exit();

que funciona igual o Abort();

D4n1l0d, talvez você estivesse postando esta mensagem enquanto eu escrevia a minha.

Na verdade não são iguais. Veja o que diz o help:

procedure Exit; => Exit exits from the current procedure.

na descrição está:

- If the current procedure is the main program, Exit causes the program to terminate. (se o procedimento o programa principal, Exit terminará o programa);

- Exit will cause the calling procedure to continue with the statement after the point at which the procedure was called. (Exit fará com que o procedimento siga com as instruções após o ponto em que a procedure foi chamada - mais ou menos isto). Ex:

procedure Form1.Calcula;
begin
  if True then
    Exit;
end;

procedure TForm1.ButtonClick(Sender :TObject);
begin
  Calcula;
  ShowMessage('Executou após o exit');
end;
procedure Abort; => Abort ends the process without reporting an error. na descrição está: - Use Abort to escape from an execution path without reporting an error. (utilize Abort para "cancelar" a execução sem que um erro seja informado) - Abort raises a special "silent exception" which operates like any other exception (Abort "gera" uma exceção silenciosa especial que opera como qualquer outra exceção). Ex:
procedure Form1.Calcula;
begin
  if True then
    Abort;
end;

procedure TForm1.ButtonClick(Sender :TObject);
begin
  Calcula;
  ShowMessage('Não será executado');
end;
O único meio de haver continuação neste código seria tratar a exceção:
procedure Form1.Calcula;
begin
  if True then
    Exit;
end;

procedure TForm1.ButtonClick(Sender :TObject);
begin
  try
    Calcula;
    ShowMessage('Não será executado');
  except
    ShowMessage('Executou após o Abort');
  end;
end;

Vamos aproveitar a oportunidade para trocarmos idéias.

Link para o comentário
Compartilhar em outros sites

  • 0

Eae..ou..muito obrigado pelas explicações do raise;.....

..mas tipo existe alguma função ou procedure nativo do Delphi que simplesmente para a execução de todos os eventos atualmente em execução.....???tipo o abrot mas que chame não chame a exception....

...desculpe tantas perguntas...espero não estar incomodando...

..muito orbigado..falow

Link para o comentário
Compartilhar em outros sites

  • 0
..mas tipo existe alguma função ou procedure nativo do Delphi que simplesmente para a execução de todos os eventos atualmente em execução.....???tipo o abrot mas que chame não chame a exception....
Ruyfreis, o que podemos utilizar para interromper o processamento do programa num determinado ponto são as exceções - Abort é muito útil em alguns casos. Então, com o que já coloquei, devemos trabalhar a construção de nosso código. Tenha em mente que o Abort irá parar a execução do programa, contudo "respeitando" as questões ao tratamento de exceção - quando houver.

Voce deve avaliar se por acaso ele já não irá atender a suas necessidades. Se o que você colocou inicialmente:

detro desta PRCEDURE que eu chamo detro do evento click suponhamos te tem um if e caso este if seja acionado ele termine não so a PROCEDURE com também o evento click...como eu faria isto???...
corresponde a mais ou menos ao exemplo no post anterior (quando falei sobre Procedure Abort - o 2º ex.), então o uso da mesma lhe basta.

Se você quizer uma opnião sobre seu caso, post o código do procedimento que você chama e o do evento OnClick de onde você chama este procedimento.

[]s

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...