Fórum Mensagem/Aviso dentro de função - Má prática? #448512
12/07/2013
0
Não tenho muita experiência em programação Delphi, e hoje enquanto estava escrevendo um código bateu uma dúvida. É uma má prática chamar mensagens (MessageBox, ShowMessage) e interagir com o usuário dentro de units específicas para funções?
Exemplo.:
try
Desativar();
if strModelo = 'ecfSweda' then Modelo := ecfSweda;
if strModelo = 'ecfBematech' then Modelo := ecfBematech;
if strModelo = 'ecfDaruma' then Modelo := ecfDaruma;
Porta := strCOM;
Ativar();
except on E: Exception do
begin
if AnsiPos('Communication error 2', E.Message) > 0 then
begin
MsgErro('Não foi possível estabelecer conexão com o ECF. Verifique se o mesmo está devidamente ' +
'conectado e configurado no seu terminal, então tente novamente.');
Result := False;
end;
end;
end;
Ok. Nesta função eu verifico se ocorreu algum erro para se comunicar ao ECF. Do ponto de vista dos mais experientes, seria mais "correto" passar apenas o retorno e fazer o tratamento na origem da chamada da função?
Enfim, não é um erro por assim dizer, mas estou tentanto melhor minha codificação, e espero que possam ajudar.
Desde já agradeço.
Thebluemonkey
Curtir tópico
+ 0Post mais votado
13/07/2013
do que esta ocorrendo
ResourceString cMensagemerroporta = 'Não foi possível estabelecer conexão com o ECF. Verifique se o mesmo está devidamente ' + 'conectado e configurado no seu terminal, então tente novamente.'; Type ErroPorta = class Exception;
//na implementação
function TClasseTal.FazCoisa: Boolena;
begin
try
Desativar();
if strModelo = 'ecfSweda' then Modelo := ecfSweda;
if strModelo = 'ecfBematech' then Modelo := ecfBematech;
if strModelo = 'ecfDaruma' then Modelo := ecfDaruma;
Porta := strCOM;
Ativar();
except
on E: Exception do
begin
if AnsiPos('Communication error 2', E.Message) > 0 then
begin
Result := False;
Raise ErroPorta.Create(cMensagemerroporta);
end;
end;
end;
//No Chamador
try Chama a classe except on E:ErroPorta: do apresenta a mensagem com o E.Message ou Personaliza ou faz qq coisa
[]sds
Marco Salles
Gostei + 1
Mais Posts
14/07/2013
Thebluemonkey
Infelizmente apesar de ter procurado não encontrei nada aqui na DevMedia, imagino que tenha algum material tratando isso, se você souber e puder me indicar eu agradeço.
De qualquer forma obrigado pelas informações.
Gostei + 0
14/07/2013
Thebluemonkey
Eu implementei desta maneira:
with FormPrincipal.ECF do
begin
try
Desativar();
if strModelo = 'ecfSweda' then Modelo := ecfSweda;
if strModelo = 'ecfBematech' then Modelo := ecfBematech;
if strModelo = 'ecfDaruma' then Modelo := ecfDaruma;
Porta := strCOM;
Ativar();
except on E: Exception do
begin
if AnsiPos('Communication error 2', E.Message) > 0 then
begin
raise EPDVErroPorta.Create(WrapText(cEPDVErroPortaMsg));
Result := False;
end;
end;
end;
end;
Como o raise error para a execução do código, acho que vou transformar essa function em um procedure, já que não irei precisar do retorno para saber se devo continuar com a execução do código ou não.
Já que na chamada estou mandando apenas o seguinte:
begin
ConectarECF();
FrmPDV := TFrmPDV.Create(Self);
FrmPDV.ShowModal;
FreeAndNil(FrmPDV);
end;
E desta forma está funcionando da maneira que desejo. O que você acha? Pode ter alguma outra implicação?
Gostei + 0
15/07/2013
Marco Salles
Certo
Porém acho que vc deve proteger a chamada , para evitar Vazamento de Memória .
begin
ConectarECF();
FrmPDV := TFrmPDV.Create(Self);
FrmPDV.ShowModal;
FreeAndNil(FrmPDV);
end;try
ConectarECF();
FrmPDV := TFrmPDV.Create(Self);
try
FrmPDV.ShowModal;
finally
FreeAndNil(FrmPDV);
end;
except //Faça alguma coisa se quiser ou não faz nada como esta aqui...
end;Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)