Controlando o acesso

Delphi

08/05/2013

Vi o artigo [url]https://www.devmedia.com.br/artigo-clube-delphi-edicao-19-controlando-o-acesso/13185[/url] que fala sobre controle de acesso.

No final do artigo, o autor menciona criar um campo na tabela ACESSO contendo a descrição do objeto, porque é possível que um objeto com o nome de "btnIncluir" possa estar presente em vários formulários. Aí vem a dúvida, preciso criar mais campos, por exemplo, para os demais botões: btnExcluir, btnAlterar, btnPesquisar?

Menciona também criar um formulário onde o usuário possa dar a manutenção nas permissões (tabela ACESSO), ou seja, permitir ou não que determinado perfil tenha acesso a um determinado campo, etc.
Como poderia ser esse formulário?

Frederico Brigatte***

Frederico Brigatte***

Curtidas 0

Respostas

Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Alguém para ajudar?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Tabela USUARIOS:

USR_ID
USR_LOGIN
USR_NOME
USR_SENHA
ACS_PERFIL


Tabela ACESSO:

ACS_ID
ACS_GRUPO
ACS_SUBGRUPO
ACS_PERFIL
ACS_ENABLED
ACS_VISIBLE

Na tabela ACESSO o autor menciona sobre os botões, como INCLUIR, ALTERAR, EXCLUIR, CONSULTA. Criar 4 campos referentes aos botões: btnIncluir, btnAlterar, btnExcluir, btnConsulta?

Para que serve os campos ACS_GRUPO e ACS_SUBGRUPO?


GOSTEI 0
Wilton Júnior

Wilton Júnior

08/05/2013

se tiver bolequeando a o menu como vc quer grupo é o menu e subgrupo o submenu
tipo arquivo (menu ou grupo) e depois novo (submenu ou subgrupo) :P
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Vc chegou a olhar o artigo?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Aqui tá explicando:

O campo ACS_GRUPO serve para armazenar o nome do formulário.
O campo ACS_SUBGRUPO serve para armazenar o nome do objeto que está associado ao formulário.
O campo ACS_ENABLED trabalha armazenando a possibilidade do usuário ter este objeto habilitado (valor "S") ou não (valor "N")

No campo ACS_GRUPO gravo o nome do formulário, exemplo: frmCadastro_Clientes. No campo ACS_SUBGRUPO, gravaria os botões que quero controlar, exemplo: btnIncluir, btnAlterar, btnExcluir e btnConsultar.

Uma dúvida, onde na procedure ArmazenaAcesso saberia em qual formulário estou? Onde é gravado o nome do form na tabela?
GOSTEI 0
Alisson Santos

Alisson Santos

08/05/2013

gostaria de saber se a solução apresentada lhe auxiliou.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Voltando para Tabela ACESSO:

ACS_ID
ACS_GRUPO
ACS_SUBGRUPO
ACS_PERFIL
ACS_ENABLED
ACS_VISIBLE

Poderia haver uma outra tabela apenas para o perfil. Exemplo:

Tabela PERFIL

PFL_ID
PFL_PERFIL

A Tabela ACESSO, ficaria assim:

ACS_ID
ACS_GRUPO
ACS_SUBGRUPO
PFL_ID
ACS_ENABLED
ACS_VISIBLE

Correto isso?
GOSTEI 0
Wilton Júnior

Wilton Júnior

08/05/2013

nao é nao
grupo é frmprincipal.pas?
subgrupo TForm
isso?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

entra la no face, conversamos la
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Alisson,

Estou tentando montar as tabelas. Não entendi direito a parte do Grupo, SubGrupo. O autor menciona adicionar um campo na tabela ACESSO contendo a descrição do objeto, porque é possível que um objeto com o nome de "btnIncluir" possa estar presente em vários formulários.

Mas esses dois campos GRUPO e SUBGRUPO já não fazem isso, como diz:

O campo ACS_GRUPO serve para armazenar o nome do formulário, assim como o campo ACS_SUBGRUPO serve para armazenar o nome do objeto que está associado ao formulário.



GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Frederico, se você observar o código do método onde os dados são salvos na tabela, verá que o campo ACS_GRUPO recebe o NOME DO FORM e o campo ACS_SUBGRUPO recebe o NOME DO COMPONENTE.
Ou seja, o grupo é utilizado para filtrar os controles de acesso de cada formulário, enquanto o subgrupo é para acessar cada componente do form para habilita-lo ou desabilita-lo.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Joel, então posso utilizar o subgrupo para gravar os botões dos forms, certo?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Sim, amigo, é exatamente para isso que serve este campo, para gravar o nome do componente. Se você observar o código do artigo citado, está bastante simples de entender o funcionamento.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Joel, montei um banco com as seguintes tabelas:

USUARIOS:

Usuario_Id Auto
Usuario_Nome Texto
Usuario_Login Texto
Usuario_Senha Texto
Perfil_Id Número


PERFIL:

Perfil_Id Auto
Perfil_Descricao Texto


ACESSO:

Acesso_ID Auto
Acesso_Grupo Texto
Acesso_SubGrupo Texto
Perfil_Id Integer
Acesso_Enabled Texto
Acesso_Visible Texto

Estou seguindo o artigo. Criei mais uma tabela Perfil e liguei os campos. Até aí está bom?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Sim.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Agora estou montando os forms. Qquer dúvida posto aqui.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Joel, poderia me ajudar agora? Vou montar o formulário de ACESSO. Onde que coloco no formulário de ACESSO a procedure para gravar na tabela ACESSO os objetos do formulário? Tenho que saber qual formulário vou usar primeiro?

Seria no evento OnCreate do frmACESSO? A chamada seria assim: ArmazenaAcesso(frmCadClientes). No caso se tiver mais formulários, iria adicionar no OnCreate:

ArmazenaAcesso(frmCadClientes);
ArmazenaAcesso(frmCad...)
ArmazenaAcesso(frmCad...)

E assim para todos os forms de Cadastro que teria no sistema?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Exato, precisa fazer uma chamada para cada form que deseja gravar. Porém, lembre-se de instanciar os forms antes de chamar o método, pois caso contrário ocorrerá erro de violação de acesso (access violation).
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Viu só, meu esforço está valendo a pena, estou conseguindo fazer. Só não lembro de como instancia, seria

Application.CreateForm(Tfrm<NomeForm>, frm<NomeForm>);
ArmazenaAcesso(frm<NomeForm>);

Fazer isso antes de cada chamada? Assim?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Isso, garoto! Tá indo no caminho certo.
Outra forma seria:
Frm<nome> := TFrm<nome>Creat(Application);

Mas dá no mesmo.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Teria alguma sugestão sobre esse controle que estou fazendo? Estou terminando o formulário de Perfil. Terminando vou fazer o Acesso. Então no OnCreate eu chamo essa procedure para gravar na tabela os objetos do form e o nome do form, certo? Vai gravar com padrão de acesso 'S', certo? Ai no grid eu mudo no evento Click do Grid ou no Duplo Clique.

DM.Acesso.Edit;
DM.Acesso.FieldByName('Acesso_Enabled').AsBoolean := not DM.Acesso.FieldByName('Acesso_Enabled').AsBoolean;
DM.Acesso.Post;
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Joel, montei o formulário de Acesso com um DBLookupComboBox ligado na tabela Perfil. Um DBGrid. Agora tenho que montar o formulário de Cadastro de Clientes, por exemplo, e no OnCreate do frmAcesso chamar a procedure ArmazenaAcesso


Application.CreateForm(TfrmCadastro_Clientes, frmCadastro_Clientes);
ArmazenaAcesso(frmCadastro_Clientes);
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Joel, na procedure ArmazenaAcesso, está usando um TTable para paradox. Estou usando ADOTable com Access e no exemplo está usando paradox. O Form1 do artigo seria o meu frmCad_Cliente, por exemplo, certo? Como ficaria para ADOTable?


Tbl := TTable.Create(nil);
Tbl.DatabaseName := ExtractFileDir(ParamStr(0));
Tbl.TableType := ttParadox;
Tbl.TableName := 'ACESSO';


GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Joel, fiz assim, pode ser?

procedure TfrmAcessos.ArmazenaAcesso(Frm: TForm);
type
  Vetor12 = array[0..11] of String;
var
  Tbl : TTable;
  Cmp,
  Ctr : Integer;
Const
  CTRL:  Vetor12 = ('TButton', 'TBitBtn', 'TEdit', 'TMaskEdit', 'TMemo',
                    'TSpeedButton', 'TComboBox', 'TCheckBox', 'TListBox',
                    'TRadioButton', 'TSpinEdit', 'TMenuItem');


begin
  Tbl := TTable.Create(nil);
  Tbl.DatabaseName := ExtractFileDir(ParamStr(0));
  Tbl.TableType := ttParadox;
  Tbl.TableName := 'ACESSO';

  try
    Tbl.Open;

    with Form1 do
      for Cmp := 0 to ComponentCount - 1 do
          for Ctr := 0 to High(CTRL) do
              if UpperCase(Components[Cmp].ClassName) = UpperCase(CTRL[Ctr]) then
              begin
                 Tbl.Append;
                 Tbl.FieldByName('ACS_GRUPO').AsString    := Name;
                 Tbl.FieldByName('ACS_SUBGRUPO').AsString := Components[Cmp].Name;
                 Tbl.FieldByName('ACS_PERFIL').AsString   := 'GERENTE';
                 Tbl.FieldByName('ACS_ENABLED').AsString  := 'S';
                 Tbl.FieldByName('ACS_VISIBLE').AsString  := 'S';
                 Tbl.Post;

                 Tbl.Append;
                 Tbl.FieldByName('ACS_GRUPO').AsString    := Name;
                 Tbl.FieldByName('ACS_SUBGRUPO').AsString := Components[Cmp].Name;
                 Tbl.FieldByName('ACS_PERFIL').AsString   := 'VENDEDOR';
                 Tbl.FieldByName('ACS_ENABLED').AsString  := 'S';
                 Tbl.FieldByName('ACS_VISIBLE').AsString  := 'S';
                 Tbl.Post;

                 Break;
              end;
  finally
    Tbl.Close;
    Tbl.Free;
  end;
end;
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Você continua usando TTable,para o TADOTable ou TADOQuery, você precisa definir uma TADOConnection.
Aconselho, para este caso, criar e configurar a ADOConnection em um DataModuloe e apenas apontar a ADOTable ou ADOQuery para essa ADOConnection.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

E como faria isso? Agora pegou, rs.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

E como faria isso? Agora pegou, rs. Lembrei, o Connection ja está num DataModule, que chamo de DM.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Tenho um DM e nele está o ADOConnection, que chamo de Conexao e um ADOTable que chamo de Acesso. É melhor colocar a procedure no DM?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Aí tanto faz, mas é uma possibilidade. Se preferir, coloque no DM e use os objetos que já estão criados, assim não precisa criá-los em tempo de execução.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Então, já estão no DM e a procedure, deixa no form Acesso mesmo?

procedure TfrmAcessos.ArmazenaAcesso(Frm: TForm);

Como ficaria essa parte já que estão no DM?

Tbl := TTable.Create(nil);
Tbl.DatabaseName := ExtractFileDir(ParamStr(0));
Tbl.TableType := ttParadox;
Tbl.TableName := 'ACESSO';
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Joel, no caso para ADO e no DataModule, que chamo de DM como ficaria:


Tbl := TTable.Create(nil);
Tbl.DatabaseName := ExtractFileDir(ParamStr(0));
Tbl.TableType := ttParadox;
Tbl.TableName := 'ACESSO';
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

1º) Obviamente o nome do form não vai ficar TFrmACesso. Você primeiro vai declarar o método no DAtaModule e depois implementá-lo. Ao fazer isso, o próprio Delphi implementa com o nome do DataModule.
2º) Se a tabela e a conexão já estão no DataModule, você não precisa usar esse trecho de código que, se você observar, verá que está criando a tabela e a configurando.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Joel, desculpa, não entendi o que disse. Primeiramente posso deixar a procedure ArmazenaAcesso aqui:

procedure TfrmAcessos.ArmazenaAcesso(Frm: TForm);

O que preciso fazer?

No caso do DM, não faço nada nesse código?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Joel, como ficaria isso que vc disse? Não entendi.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

SUPONDO que você sabe declarar um método, você primeiro define a assinatura dele lá "em cima", né? Na seção public, ou private, por exemplo.
Quando você pressiona CTRL+SHIFT+C com o cursor em cima da assinatura do método, o Delphi cria o corpo do método pra você. Nisso ele já põe o "TfrmAcessos." antes do nome do método (de acordo com o form, nesse caso, TFrmACesso).
Para você copiar para o DataModule, a primeira coisa é declarar o método. Depois implementá-lo usando o atalho que citei e então copiando apenas o corpo do método (entre o begin e o end).
Esta é a única forma de fazer? Não. Mas é a mais segura para você que não tem experiência ainda com isso, pois já faz da forma correta e vai aprendendo ao mesmo tempo.
Para mais informações, pesquise sobre como criar métodos no Delphi.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Joel,ja está declarada, só que antes de public ou private. Está junto com as procedures da unit. Pode deixar na unit do formulário mesmo, ou seja, o frmAcesso, ou tem que estar no DataModule?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Repare que eu já disse que TANTO FAZ, só depende de você. Pelo visto, está mais fácil manter no FrmAcesso, para não hver dificuldade em levar o método para o DM.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Então, está declarada assim:

procedure TfrmAcessos.ArmazenaAcesso(Frm: TForm);

Mas antes de public ou private, esta junto com as procedures da unit.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Joel, e aqui não faz nada?

Tbl := TTable.Create(nil);
Tbl.DatabaseName := ExtractFileDir(ParamStr(0));
Tbl.TableType := ttParadox;
Tbl.TableName := 'ACESSO';

Estou usando ADO e é Access e está no DM.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Novamente dou a dica: pesquise sobre declaração de métodos no Delphi.
Não se declara métodos com o nome do form (TfrmAcessos). Esse nome é colocado NA IMPLEMENTAÇÃO do método apenas.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Joel, acabei de ver como declara. Seria assim:

procedure ArmazenaAcesso(Frm: TForm);

Ai coloco ou na public ou private, certo?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Vi nesse link: [url]https://www.devmedia.com.br/conceitos-basicos-sobre-procedures-e-functions-no-delphi/25303[/url]
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Agora acertei?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

É assim:

type
  TfrmAcessos = class(TForm)
    StatusBar1: TStatusBar;
    btGravar: TBitBtn;
    btCancelar: TBitBtn;
    sbLibera: TSpeedButton;
    sbBloqueia: TSpeedButton;
    GridGeral: TDBGrid;
    Perfis: TDBLookupComboBox;
    qryPerfil: TADOQuery;
    dsQryPerfil: TDataSource;
    Label1: TLabel;
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormShow(Sender: TObject);
    procedure btCancelarClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ArmazenaAcesso(Frm: TForm);
  end;
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

É, cara. Agora implemente o método.
Tente, veja se dá certo. Pesquise.
Não é que eu não queira responder, mas acho que você perde muito tempo perguntando "é assim?", "posso fazer?", "tô certo?". Tente, se der errado, aí você busca a solução do erro.
Boa sorte.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Ok, agora eu tiro o que não preciso no método, né? Primeiramente tenho que montar o formulário de Cadastro? Só para saber se estou no caminho.

Aqui não faço nada? Estou usando ADO e Access:

Tbl := TTable.Create(nil);
Tbl.DatabaseName := ExtractFileDir(ParamStr(0));
Tbl.TableType := ttParadox;
Tbl.TableName := 'ACESSO';


GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Só uma dúvida que postei anteriormente. Eu tenho primeiro que montar o form de cadastro de clientes, por exemplo, e depois implementar o método, tirando os objetos que não me interessam, tipo:

CTRL: Vetor12 = ('TButton', 'TBitBtn', 'TEdit', 'TMaskEdit', 'TMemo',
'TSpeedButton', 'TComboBox', 'TCheckBox', 'TListBox',
'TRadioButton', 'TSpinEdit', 'TMenuItem');

Nessa linha acima, tiraria os que não fosse utilizar, somente isso pra mexer?


Aqui não faço nada? Estou usando ADO e Access:

Tbl := TTable.Create(nil);
Tbl.DatabaseName := ExtractFileDir(ParamStr(0));
Tbl.TableType := ttParadox;
Tbl.TableName := 'ACESSO';
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Alguém??
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Só uma dúvida que postei anteriormente. Eu tenho primeiro que montar o form de cadastro de clientes, por exemplo, e depois implementar o método, tirando os objetos que não me interessam, tipo:

CTRL: Vetor12 = ('TButton', 'TBitBtn', 'TEdit', 'TMaskEdit', 'TMemo',
'TSpeedButton', 'TComboBox', 'TCheckBox', 'TListBox',
'TRadioButton', 'TSpinEdit', 'TMenuItem');

Nessa linha acima, tiraria os que não fosse utilizar, somente isso pra mexer?


Aqui não faço nada? Estou usando ADO e Access:

Tbl := TTable.Create(nil);
Tbl.DatabaseName := ExtractFileDir(ParamStr(0));
Tbl.TableType := ttParadox;
Tbl.TableName := 'ACESSO';
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Primeiramente, você sabe para que serve o código abaixo?
Tbl := TTable.Create(nil);
Tbl.DatabaseName := ExtractFileDir(ParamStr(0));
Tbl.TableType := ttParadox;
Tbl.TableName := 'ACESSO';

É fundamental que você saiba o que cada trecho do código faz, para saber quando e por quê utiliza-lo.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Sim. Segue explicação.

Tbl := TTable.Create(nil); -> Cria o objeto table
Tbl.DatabaseName := ExtractFileDir(ParamStr(0)); -> Pega o caminho do banco pelo no do executável
Tbl.TableType := ttParadox; -> Tipo da tabela, Paradox.
Tbl.TableName := 'ACESSO'; -> Nome da tabela utilizada, ACESSO.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Perfeito. Agora você lembra que me disse que essa tabela e a conexão já estão no DataModule? Então não precisa mais cria-las nem definir nomes de tabelas, etc., concorda? Por isso você não vai mais precisar desse trecho de código.
SE fosse fazer com ADO, sera algo do tipo:
tabela := TADOTable.Create(Self);
tabela.Connection := conexao;
tabela.TableName := 'ACESSO';
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Perfeito. Agora você lembra que me disse que essa tabela e a conexão já estão no DataModule? Então não precisa mais cria-las nem definir nomes de tabelas, etc., concorda? Por isso você não vai mais precisar desse trecho de código.
SE fosse fazer com ADO, SERIA algo do tipo:
tabela := TADOTable.Create(Self);
tabela.Connection := conexao;
tabela.TableName := 'ACESSO';

Mas lembre-se: se os objetos já existem no DataModule, se você criou em design, não precisa criar em runtime.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Então eu troco isso:

Tbl := TTable.Create(nil);
Tbl.DatabaseName := ExtractFileDir(ParamStr(0));
Tbl.TableType := ttParadox;
Tbl.TableName := 'ACESSO';


Para isso:

tabela := TADOTable.Create(Self);
tabela.Connection := conexao;
tabela.TableName := 'ACESSO';

Uma Observação. Onde colocaria o procedimento ArmazenaAcesso? Seria assim que postou se o procedimento estivesse no DM. Em qual evento do DM colocaria?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Então eu troco isso:

Tbl := TTable.Create(nil);
Tbl.DatabaseName := ExtractFileDir(ParamStr(0));
Tbl.TableType := ttParadox;
Tbl.TableName := 'ACESSO';


Para isso:

tabela := TADOTable.Create(Self);
tabela.Connection := conexao;
tabela.TableName := 'ACESSO';

SE VOCÊ JÁ TEM O ADOTable e o ADOConnection no DataModule, conforme você falou, você NÃO PRECISA cria-los em tempo de execução.
SE VOCÊ vai criar em tempo de execução, aí sim, o código é esse que falei.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Uma Observação. Onde colocaria o procedimento ArmazenaAcesso? Seria assim que postou se o procedimento estivesse no DM. Em qual evento do DM colocaria?

Eu já falei várias vezes que esse procedimento pode ficar em qualquer canto. Tanto no DataModule quanto no form de cadastro de acessos.
Com relação a onde você vai chama-lo, provavelmente deve ter um botão em algum lugar, do tipo "Cadastrar acessos" ou "Armazenar acessos".
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Não precisa estar em nenhum evento On<alguma coisa>? Se estiver no DM, faço isso então:

Declaro: ou na private ou na public da unit do DM.

private
{ Private declarations }
public
{ Public declarations }
procedure ArmazenaAcesso(Frm: TForm);


var
  DM: TDM;

implementation

{$R *.dfm}
procedure TDM.ArmazenaAcesso(Frm: TForm);//ou//procedure ArmazenaAcesso(Frm: TForm);//creio que seja essa,com certeza
begin
   
end;




Uma coisa ta martelando:
Eu já tenho o ADOTable e o ADOConnection no DataModule. Então não precisa usar esse código?

tabela := TADOTable.Create(Self);
tabela.Connection := conexao;
tabela.TableName := 'ACESSO';

Não quero criar em execução. Vou deixar o procedimento no DataModule. O que quero saber é se tenho que trocar onde está com asterisco.

Isso:
Tbl := TTable.Create(nil);
Tbl.DatabaseName := ExtractFileDir(ParamStr(0));
****Tbl.TableType := ttParadox; // aqui indica que é PARADOX
Tbl.TableName := 'ACESSO';

Para:
tabela := TADOTable.Create(Self); // essa linha caso não queira criar em execução, tiraria do código
****tabela.Connection := conexao; // aqui estou usando ACCESS
tabela.TableName := 'ACESSO';

Acho que não estava sendo claro na dúvida.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

****Tbl.TableType := ttParadox; // aqui indica que é PARADOX

Aqui você descarta, pois na ADOTable não é necessário definir o tipo de tabela.


****tabela.Connection := conexao; // aqui estou usando ACCESS

Não importa qual banco está usando. Se a ADOConnection já está configurada, basta associa-la à ADOTable, desta forma como está.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Entendi. Vou implementar. Eu preciso ter o form de Cadastro primeiramente, para saber o que quero controlar?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/05/2013

Como você mesmo disse, "para saber o que vai controlar", precisa ter o form pronto, né?
Você pode apenas criar o form e colocar alguns controles nele, apenas para teste.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

08/05/2013

Ok, vou fazer, qquer coisa eu posto aqui.
GOSTEI 0
POSTAR