Fazer validação ao abrir form e fechá-lo ao negar acesso

Delphi

31/03/2006

Olá amigos, criei uma rotina de liberação dos níveis do sistema, sendo que se o usuário não estiver apto a acessar determinado cadastro ou rotina, deve-se cancelar sua execução.

Exemplo:
- Usuário não tem acesso ao cadastro de produtos
- Onde faço a validação e como cancelo a execução do form, já tentei no Create, Active e no Show e o ´Close´ não funciona, consigo fazer a validação sem problemas.

Até

Mario


Aldus

Aldus

Curtidas 0

Respostas

Aldus

Aldus

31/03/2006

Alguma idéia delphianos.


GOSTEI 0
Onjahyr

Onjahyr

31/03/2006

:lol: SIM.

Você cria um campo no BD com acompanhamento de cada usuário. Quem pode o que, entende?
Na revista ClubeDelphi Edições 38 (Interbase) e 19 (paradox).

A Edição 19 tem um aplicativo de controle completo e bem elaborado de como controlar quem pode ter acesso ou não...
Já na edição 38, você tem que fazer via código ou diretamente no BD do Interbase, mas não tem um aplicativo de controle. Mas pode ser criado, claro!

Eu prefiro a edição 19 (opção minha)

Falowww

SITEVIRTUAL


GOSTEI 0
Aldus

Aldus

31/03/2006

Obrigado pela atenção, mas o modo de controlar eu já desenvolvi, apenas gostaria de saber como fechar o form ao negar a validação.

Mario


GOSTEI 0
Paullsoftware

Paullsoftware

31/03/2006

a melhor maneira de impedir o acesso a determinadas partes do sistema é desabilitando-a conforme os critérios da tabela permissões..

ao validar o login do usuário vc deve fazer uma verificação tb em uma tabela que guarde todas as permissoes para esse usuários por exemplo:

Table permissoes: MClientes = VarChar; MUsuários = VarChar; MFuncionarios = VarChar; MProdutos = VarChar; MEstoque = VarChar; MPedidos = VarChar;

...
na hora de usar...
if QyMClientes.AsString = ´S´ then
  MClientes.Enabled := True else MClientes.Enabled := False;
if QyMUsuarios.AsString = ´S´ then
  MUsuarios.Enabled := True else MUsuarios.Enabled := False;
if QyMFuncionarios.AsString = ´S´ then
  MFuncionarios.Enabled := True else MFuncionarios.Enabled := False;
if QyMProdutos.AsString = ´S´ then
  MProdutos.Enabled := True else MProdutos.Enabled := False;
if QyMEstoque.AsString = ´S´ then
  MEstoque.Enabled := True else MEstoque.Enabled := False;
if QyMPedidos.AsString = ´S´ then
  MPedidos.Enabled := True else MPedidos.Enabled := False;
é mais ou menos assim :wink:


GOSTEI 0
Aldus

Aldus

31/03/2006

Obrigado Paull pela atenção, mas a forma do cadastro das permissões já está pronto, apenas quero fechar o form ao ser negada sua permissão. Inabilitar a opção do menu não é suficiente, pois se meu cliente estiver da entrada de produtos e pressionar F4 será aberto o cadastro de produtos, por isso a importância de validar ao tentar abrir o form.

Mario


GOSTEI 0
Andremuller

Andremuller

31/03/2006

Sobrescreva o método ShowModal;

public
    function ShowModal: integer; override;


então só execute a herança se o usuário tiver permissão

function TForm1.ShowModal: integer;
begin
  if PossuiPermissao then
    Result := inherited ShowModal;
end;



GOSTEI 0
Andremuller

Andremuller

31/03/2006

O exemplo que mandei acima é para se você estiver utilizando ShowModal. Se estiver usando Show então é assim:

public
    procedure Show; reintroduce;


procedure TForm1.Show;
begin
  if PossuiPermissao then
    inherited Show;  
end;


nos dois casos o form só será exibido caso o usuário tenha permissão.

isso resolve?


GOSTEI 0
Aldus

Aldus

31/03/2006

Olá André, não existe um simples comando que feche o form na inicialização?
Mario


GOSTEI 0
Andremuller

Andremuller

31/03/2006

tu tá usando show ou showmodal?


GOSTEI 0
Aldus

Aldus

31/03/2006

Estou usando somente showmodal


GOSTEI 0
Aldus

Aldus

31/03/2006

Alguma idéia


GOSTEI 0
Andremuller

Andremuller

31/03/2006

Realmente desconheço qualquer comando que possa retirar um Show que ainda não foi executado, dar close sem o form ter realmente aparecido na tela.

A técnica que passei é bem organizada visto tu realmente estar especializando um comportamento da classe TForm na tua nova classe, quer dizer que se tu usar a dica que passei, além de funcionar, ainda vai estar utilizando conceitos de OO. Não vejo porque procurar mais.

Na realidade essa consistência deveria ser feita antes da criação da instância da classe, não há necessidade de alocar todos recursos necessários para trabalho na interface se o usuário não tem permissão. De qualquer forma se dessa forma foi implementado a solução que passei resolve teu problema de uma forma bem organizada

sds


GOSTEI 0
Paullsoftware

Paullsoftware

31/03/2006

acho que o que você quer não é complicado, porém, deve ser criado variaveis globais onde, cada uma delas é respossável por permitir ou não o acesso a determinada parte do sistema tipo:
[b:06183976f7]wCadPro:Boolean;[/b:06183976f7]

e na hora da chamada ao form você faria algo semelhante a isso:
if Not wCadPro then
 begin
 MessageDlg(´Você não possui prvilérgios para acessar essa área do sistema. Acesso negado!´,MtInformation,[MbOk],0);
 Exit;
 end
else
 begin
 //Comandos para abrir o seu form...
 end;



GOSTEI 0
Renato.pavan

Renato.pavan

31/03/2006

Alguma idéia


Coloque o codigo abaixo no evento OnPaint do Form
  bPermissao := False;
  if not bPermissao then
    Close;



GOSTEI 0
Andremuller

Andremuller

31/03/2006

caso optes pela última dica, cuidado para não colocar o método de busca da permissão no evento OnPaint, somente utilize a flag como indicou o colega. Isso porque o evento é executado a cada refresh do form.


GOSTEI 0
Aldus

Aldus

31/03/2006

Obrigado amigos pelas dicas, mas preferia a que crio a verificação antes de acessar o form, ficando as chamadas centralizadas em única unit.

Até
Mario


GOSTEI 0
POSTAR