Erro ao sair do sistema

Delphi

18/06/2011

estou abrindo um novo tópico pois não consigo responder no original...

primeiro:
para melhorar a segurança, NÃO avalie usuário e senha separadamente.
avaliar em conjunto dificulta o quebra via força-bruta, pois não dá pra saber o que foi digitado errado.
então sugiro que você mude sua avaliação para:

procedure TFrmLogin.BtnOKClick(Sender: TObject);
var
  ValorSenha: TstringField;
begin
  if not DM.tableusers.findkey([ednome.text]) or
     (DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
  begin
    pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
    inc(Contador);
    if contador = 4 then // alcançou o limite de tentativas
      frmPrincipal.close;
    ednome.setfocus;
    Exit;
  end;
   ValorSenha:=DM.tableUsers.findfield('Senha') as tStringfield;

  frmPrincipal.label2.Caption := frmLogin.EdNome.Text;
  frmPrincipal.enabled:=true;
  frmlogin.release;
end;

segundo:
qual é o form principal da sua aplicação?
esta informação é essencial para poder te oferecer uma solução adequada.


Emerson Nascimento

Emerson Nascimento

Curtidas 0

Respostas

Frederico Brigatte***

Frederico Brigatte***

18/06/2011

estou abrindo um novo tópico pois não consigo responder no original...

primeiro:
para melhorar a segurança, NÃO avalie usuário e senha separadamente.
avaliar em conjunto dificulta o quebra via força-bruta, pois não dá pra saber o que foi digitado errado.
então sugiro que você mude sua avaliação para:

procedure TFrmLogin.BtnOKClick(Sender: TObject);
var
  ValorSenha: TstringField;
begin
  if not DM.tableusers.findkey([ednome.text]) or
     (DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
  begin
    pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
    inc(Contador);
    if contador = 4 then // alcançou o limite de tentativas
      frmPrincipal.close;
    ednome.setfocus;
    Exit;
  end;
   ValorSenha:=DM.tableUsers.findfield('Senha') as tStringfield;

  frmPrincipal.label2.Caption := frmLogin.EdNome.Text;
  frmPrincipal.enabled:=true;
  frmlogin.release;
end;

segundo:
qual é o form principal da sua aplicação?
esta informação é essencial para poder te oferecer uma solução adequada.




Ok, desculpe pela demora, estava arrumando minha máquina. O Form Principal é o frmPrincipal.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/06/2011

ok. pelo que eu entendi no seu código, você quer que quando a tela de login apareça, a tela principal desapareça. é isso mesmo? porque se for assim, você poderia apenas escondê-la, e não eliminá-la.

então eu faria assim:



no DPR (adicione Controls na uses):

begin
  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
  Application.CreateForm(TFrmLogin, FrmLogin);
  if FrmLogin.ShowModal = mrOk then
    Application.Run
  else
    Application.Terminate;
end.



no FrmLogin:

procedure TFrmLogin.BtnOKClick(Sender: TObject);
begin
  try
    if not DM.tableusers.findkey([ednome.text]) or
       (DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
    begin
      pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
      inc(Contador);

      if contador = 4 then // alcançou o limite de tentativas
      begin
        Application.MessageBox('Número de tentativas esgotado. O sistema será fechado.',
          'Login negado', MB_TASKMODAL + MB_OK + MB_ICONERROR);
        ModalResult := mrCancel;
      end
      else
        ednome.setfocus;
    end
    else
    begin
      frmPrincipal.label2.Caption := edNome.Text;
      ModalResult := mrOk;
    end;
  except
    // caso haja qualquer erro na avalição, sai do sistema
    // para evitar acesso indevido
    ModalResult := mrCancel;
  end;
end;



no FrmPrincipal:

procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
   Self.Visible := False;
   Application.CreateForm(TFrmLogin, FrmLogin);
   if FrmLogin.ShowModal = mrOk then
     Self.Visible := True
   else
     Self.Close;
end;



GOSTEI 0
Wilson Junior

Wilson Junior

18/06/2011

GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/06/2011

é sim. esse aí é o tópico original. porém é impossível responder nele.
por isso criei este outro.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

é sim. esse aí é o tópico original. porém é impossível responder nele.
por isso criei este outro.


Vc conseguiu detectar o erro? O problema é quando logo com o segundo usuário, ao clicar em sair da o erro.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/06/2011

ok. pelo que eu entendi no seu código, você quer que quando a tela de login apareça, a tela principal desapareça. é isso mesmo? porque se for assim, você poderia apenas escondê-la, e não eliminá-la.

então eu faria assim:



no DPR (adicione Controls na uses):

begin
  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
  Application.CreateForm(TFrmLogin, FrmLogin);
  if FrmLogin.ShowModal = mrOk then
    Application.Run
  else
    Application.Terminate;
end.



no FrmLogin:

procedure TFrmLogin.BtnOKClick(Sender: TObject);
begin
  try
    if not DM.tableusers.findkey([ednome.text]) or
       (DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
    begin
      pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
      inc(Contador);

      if contador = 4 then // alcançou o limite de tentativas
      begin
        Application.MessageBox('Número de tentativas esgotado. O sistema será fechado.',
          'Login negado', MB_TASKMODAL + MB_OK + MB_ICONERROR);
        ModalResult := mrCancel;
      end
      else
        ednome.setfocus;
    end
    else
    begin
      frmPrincipal.label2.Caption := edNome.Text;
      ModalResult := mrOk;
    end;
  except
    // caso haja qualquer erro na avalição, sai do sistema
    // para evitar acesso indevido
    ModalResult := mrCancel;
  end;
end;



no FrmPrincipal:

procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
   Self.Visible := False;
   Application.CreateForm(TFrmLogin, FrmLogin);
   if FrmLogin.ShowModal = mrOk then
     Self.Visible := True
   else
     Self.Close;
end;



você testou com as alterações acima ?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

ok. pelo que eu entendi no seu código, você quer que quando a tela de login apareça, a tela principal desapareça. é isso mesmo? porque se for assim, você poderia apenas escondê-la, e não eliminá-la.

então eu faria assim:



no DPR (adicione Controls na uses):

begin
  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
  Application.CreateForm(TFrmLogin, FrmLogin);
  if FrmLogin.ShowModal = mrOk then
    Application.Run
  else
    Application.Terminate;
end.



no FrmLogin:

procedure TFrmLogin.BtnOKClick(Sender: TObject);
begin
  try
    if not DM.tableusers.findkey([ednome.text]) or
       (DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
    begin
      pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
      inc(Contador);

      if contador = 4 then // alcançou o limite de tentativas
      begin
        Application.MessageBox('Número de tentativas esgotado. O sistema será fechado.',
          'Login negado', MB_TASKMODAL + MB_OK + MB_ICONERROR);
        ModalResult := mrCancel;
      end
      else
        ednome.setfocus;
    end
    else
    begin
      frmPrincipal.label2.Caption := edNome.Text;
      ModalResult := mrOk;
    end;
  except
    // caso haja qualquer erro na avalição, sai do sistema
    // para evitar acesso indevido
    ModalResult := mrCancel;
  end;
end;



no FrmPrincipal:

procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
   Self.Visible := False;
   Application.CreateForm(TFrmLogin, FrmLogin);
   if FrmLogin.ShowModal = mrOk then
     Self.Visible := True
   else
     Self.Close;
end;



você testou com as alterações acima ?


Vou fazer agora, um momento, ok?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

ok. pelo que eu entendi no seu código, você quer que quando a tela de login apareça, a tela principal desapareça. é isso mesmo? porque se for assim, você poderia apenas escondê-la, e não eliminá-la.

então eu faria assim:



no DPR (adicione Controls na uses):

begin
  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
  Application.CreateForm(TFrmLogin, FrmLogin);
  if FrmLogin.ShowModal = mrOk then
    Application.Run
  else
    Application.Terminate;
end.



no FrmLogin:

procedure TFrmLogin.BtnOKClick(Sender: TObject);
begin
  try
    if not DM.tableusers.findkey([ednome.text]) or
       (DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
    begin
      pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
      inc(Contador);

      if contador = 4 then // alcançou o limite de tentativas
      begin
        Application.MessageBox('Número de tentativas esgotado. O sistema será fechado.',
          'Login negado', MB_TASKMODAL + MB_OK + MB_ICONERROR);
        ModalResult := mrCancel;
      end
      else
        ednome.setfocus;
    end
    else
    begin
      frmPrincipal.label2.Caption := edNome.Text;
      ModalResult := mrOk;
    end;
  except
    // caso haja qualquer erro na avalição, sai do sistema
    // para evitar acesso indevido
    ModalResult := mrCancel;
  end;
end;



no FrmPrincipal:

procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
   Self.Visible := False;
   Application.CreateForm(TFrmLogin, FrmLogin);
   if FrmLogin.ShowModal = mrOk then
     Self.Visible := True
   else
     Self.Close;
end;



você testou com as alterações acima ?


Vou fazer agora, um momento, ok?


Tá dando erro nessa linha:

if FrmLogin.ShowModal = mrOk then
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

ok. pelo que eu entendi no seu código, você quer que quando a tela de login apareça, a tela principal desapareça. é isso mesmo? porque se for assim, você poderia apenas escondê-la, e não eliminá-la.

então eu faria assim:



no DPR (adicione Controls na uses):

begin
  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
  Application.CreateForm(TFrmLogin, FrmLogin);
  if FrmLogin.ShowModal = mrOk then
    Application.Run
  else
    Application.Terminate;
end.



no FrmLogin:

procedure TFrmLogin.BtnOKClick(Sender: TObject);
begin
  try
    if not DM.tableusers.findkey([ednome.text]) or
       (DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
    begin
      pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
      inc(Contador);

      if contador = 4 then // alcançou o limite de tentativas
      begin
        Application.MessageBox('Número de tentativas esgotado. O sistema será fechado.',
          'Login negado', MB_TASKMODAL + MB_OK + MB_ICONERROR);
        ModalResult := mrCancel;
      end
      else
        ednome.setfocus;
    end
    else
    begin
      frmPrincipal.label2.Caption := edNome.Text;
      ModalResult := mrOk;
    end;
  except
    // caso haja qualquer erro na avalição, sai do sistema
    // para evitar acesso indevido
    ModalResult := mrCancel;
  end;
end;



no FrmPrincipal:

procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
   Self.Visible := False;
   Application.CreateForm(TFrmLogin, FrmLogin);
   if FrmLogin.ShowModal = mrOk then
     Self.Visible := True
   else
     Self.Close;
end;



você testou com as alterações acima ?


Vou fazer agora, um momento, ok?


Tá dando erro nessa linha:

if FrmLogin.ShowModal = mrOk then




Deu erro agora nessa linha: 

Application.CreateForm(TFrmPrincipal, FrmPrincipal);

A uses ta assim:

program Parte2;

uses
  Forms,
  Controls,
  UnitPrincipal in 'UnitPrincipal.pas' ,
  UnitLogin in 'UnitLogin.pas' ,
  UnitDM in 'UnitDM.pas' {DM: TDataModule},
  UnitSenhas in 'UnitSenhas.pas' ;

{$R *.RES}

begin
//  Application.Initialize;
//  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
//  Application.CreateForm(TDM, DM);
//  Application.Run;

  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
  Application.CreateForm(TFrmLogin, FrmLogin);
  if FrmLogin.ShowModal = mrOk then
    Application.Run
  else
    Application.Terminate;

end.

Não sei mais o que fazer.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

ok. pelo que eu entendi no seu código, você quer que quando a tela de login apareça, a tela principal desapareça. é isso mesmo? porque se for assim, você poderia apenas escondê-la, e não eliminá-la.

então eu faria assim:



no DPR (adicione Controls na uses):

begin
  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
  Application.CreateForm(TFrmLogin, FrmLogin);
  if FrmLogin.ShowModal = mrOk then
    Application.Run
  else
    Application.Terminate;
end.



no FrmLogin:

procedure TFrmLogin.BtnOKClick(Sender: TObject);
begin
  try
    if not DM.tableusers.findkey([ednome.text]) or
       (DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
    begin
      pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
      inc(Contador);

      if contador = 4 then // alcançou o limite de tentativas
      begin
        Application.MessageBox('Número de tentativas esgotado. O sistema será fechado.',
          'Login negado', MB_TASKMODAL + MB_OK + MB_ICONERROR);
        ModalResult := mrCancel;
      end
      else
        ednome.setfocus;
    end
    else
    begin
      frmPrincipal.label2.Caption := edNome.Text;
      ModalResult := mrOk;
    end;
  except
    // caso haja qualquer erro na avalição, sai do sistema
    // para evitar acesso indevido
    ModalResult := mrCancel;
  end;
end;



no FrmPrincipal:

procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
   Self.Visible := False;
   Application.CreateForm(TFrmLogin, FrmLogin);
   if FrmLogin.ShowModal = mrOk then
     Self.Visible := True
   else
     Self.Close;
end;



você testou com as alterações acima ?


Vou fazer agora, um momento, ok?


Tá dando erro nessa linha:

if FrmLogin.ShowModal = mrOk then




Deu erro agora nessa linha: 

Application.CreateForm(TFrmPrincipal, FrmPrincipal);

A uses ta assim:

program Parte2;

uses
  Forms,
  Controls,
  UnitPrincipal in 'UnitPrincipal.pas' ,
  UnitLogin in 'UnitLogin.pas' ,
  UnitDM in 'UnitDM.pas' {DM: TDataModule},
  UnitSenhas in 'UnitSenhas.pas' ;

{$R *.RES}

begin
//  Application.Initialize;
//  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
//  Application.CreateForm(TDM, DM);
//  Application.Run;

  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
  Application.CreateForm(TFrmLogin, FrmLogin);
  if FrmLogin.ShowModal = mrOk then
    Application.Run
  else
    Application.Terminate;

end.

Não sei mais o que fazer.


Fiz essas modificações e continua dando erro.

Fiz uma mudança e o erro acima sumiu:

De: Application.CreateForm(TDM, DM);
      Application.CreateForm(TFrmPrincipal, FrmPrincipal);

Para:   Application.CreateForm(TFrmPrincipal, FrmPrincipal);
           Application.CreateForm(TDM, DM);

Ahh, e o procedimento no botão OK no FrmLogin não entra no form Principal, entro com o login e senha e fica só na tela de login.

GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/06/2011

isso deve acontecer porque seu frmprincipal não está marcado como formulário principal da aplicação.


se você puder me passar seu projeto, com essas três units (principal, login, dm), posso tentar resolver o problema.

emerson.en@gmail.com


GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

isso deve acontecer porque seu frmprincipal não está marcado como formulário principal da aplicação.


se você puder me passar seu projeto, com essas três units (principal, login, dm), posso tentar resolver o problema.

emerson.en@gmail.com




Consegue me mandar ainda hoje? Estou parado nisso.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

isso deve acontecer porque seu frmprincipal não está marcado como formulário principal da aplicação.


se você puder me passar seu projeto, com essas três units (principal, login, dm), posso tentar resolver o problema.

emerson.en@gmail.com




Consegue me mandar ainda hoje? Estou parado nisso.


Acabei de enviar.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/06/2011

fiz exatamente como no exemplo que eu te passei.

só uma coisa não havia sido explicada por você:
do DM havia o seguinte código:

procedure TDM.DMCreate(Sender: TObject);
begin
   frmprincipal.show;
   frmLogin:=TfrmLogin.create(self);
   frmlogin.show;
end;

totalmente DESnecessário. retirei do fonte.

estava meio bagunçado: os formulários eram criados e destruídos em vários locais do seu programa.

te enviei o fonte corrigido.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

fiz exatamente como no exemplo que eu te passei.

só uma coisa não havia sido explicada por você:
do DM havia o seguinte código:

procedure TDM.DMCreate(Sender: TObject);
begin
   frmprincipal.show;
   frmLogin:=TfrmLogin.create(self);
   frmlogin.show;
end;

totalmente DESnecessário. retirei do fonte.

estava meio bagunçado: os formulários eram criados e destruídos em vários locais do seu programa.

te enviei o fonte corrigido.


Não recebi, Emerson. Pode enviar novamente?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

fiz exatamente como no exemplo que eu te passei.

só uma coisa não havia sido explicada por você:
do DM havia o seguinte código:

procedure TDM.DMCreate(Sender: TObject);
begin
   frmprincipal.show;
   frmLogin:=TfrmLogin.create(self);
   frmlogin.show;
end;

totalmente DESnecessário. retirei do fonte.

estava meio bagunçado: os formulários eram criados e destruídos em vários locais do seu programa.

te enviei o fonte corrigido.


Não recebi, Emerson. Pode enviar novamente?


Emerson, funcionou perfeitamente. Como faço para o form principal aparecer no fundo, caso queira fazer assim?
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/06/2011

será necessário alterar um pouco o esquema, pois o responsável pela chamada do login seria somente o frmprincipal.

GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

será necessário alterar um pouco o esquema, pois o responsável pela chamada do login seria somente o frmprincipal.



Tem como fazer para mim?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

será necessário alterar um pouco o esquema, pois o responsável pela chamada do login seria somente o frmprincipal.



Tem como fazer para mim?


Ou explicar aqui como fazer que faço.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/06/2011

o primeiro login eu creio que deva aparecer antes da tela principal, porém para o logoff acho que a tela principal deveria ficar aparecendo ao fundo.

para isso, altere apenas o procedimento do logoff, de modo a ficar assim:

procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
   if TFrmLogin.ChamaLogin <> mrOk then
   begin
     lFecha := True;
     Self.Close;
   end;
end;

GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

o primeiro login eu creio que deva aparecer antes da tela principal, porém para o logoff acho que a tela principal deveria ficar aparecendo ao fundo.

para isso, altere apenas o procedimento do logoff, de modo a ficar assim:

procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
   if TFrmLogin.ChamaLogin <> mrOk then
   begin
     lFecha := True;
     Self.Close;
   end;
end;



Ok, caso queira que o form principal apareça de fundo no primeiro login também, dá para fazer? Essa é para encerrar.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/06/2011

altere o DPR, de modo a ficar assim:

begin
  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
  FrmPrincipal.Show; // acrescente esta linha
  if TFrmLogin.ChamaLogin = mrOk then
    Application.Run
  else
    Application.Terminate;
end.


GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

altere o DPR, de modo a ficar assim:

begin
  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
  FrmPrincipal.Show; // acrescente esta linha
  if TFrmLogin.ChamaLogin = mrOk then
    Application.Run
  else
    Application.Terminate;
end.




Ok, vou testar. Obrigado por enquanto.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

altere o DPR, de modo a ficar assim:

begin
  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
  FrmPrincipal.Show; // acrescente esta linha
  if TFrmLogin.ChamaLogin = mrOk then
    Application.Run
  else
    Application.Terminate;
end.




Ok, vou testar. Obrigado por enquanto.


Funcionou perfeito. Agora posso dar contiuidade. Obrigado Emerson.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

18/06/2011

altere o DPR, de modo a ficar assim:

begin
  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TFrmPrincipal, FrmPrincipal);
  FrmPrincipal.Show; // acrescente esta linha
  if TFrmLogin.ChamaLogin = mrOk then
    Application.Run
  else
    Application.Terminate;
end.




Ok, vou testar. Obrigado por enquanto.


Funcionou perfeito. Agora posso dar contiuidade. Obrigado Emerson.


Está estranho. Estou querendo fazer um perfil de usuários aqui, mas está deixando fazer com qualquer um que loga. Vc teria um exemplo ou melhorar esse?
GOSTEI 0
José

José

18/06/2011

Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0
POSTAR