Home › Fóruns › Dúvidas e Problemas relacionados ao UserControl ShowDelphi Edition › Erro ao validar login
Existe a possibilidade de fazer login no componente se usar o form de login dele que fazer o login pela minha aplicação usando somente as regras de validações do componente e usando as configurações ele para bloquear os componentes
Sim, é possível criar um formulário personalizado para login.
Por exemplo, crei um novo form, coloque campos para informar o usuário e senha. Coloque um botão validar e crie uma propriedade do Tipo User Control.
Ex: property UserControl: TUserControl.
No clique do botão validar você pode fazer assim:
if UserControl.VerificaLogin(EdtLogin.Text, EdtSenha.Text) = 0 then
begin
// login ok
end
else
begin
// erro login
end;
E por fim, para o componente saber que precisar usar o seu formulário, faça o seguinte: No evento OnCustomLoginForm do userControl informe a ele o seu form.
Veja este exemplo:
procedure TFrmPrincipal.UserControl1CustomLoginForm(Sender: TObject;
var CustomForm: TCustomForm);
begin
CustomForm := TfrmLogin.Create(Application);
TfrmLogin(CustomForm).UserControl := Self.UserControlMain;
end;
Como completo meu código aqui
private
{ Private declarations }
property UserControl: TUserControl;
public
{ Public declarations }
end;
ele diz que está faltando alguma coisa nessa property e eu nao estou conseguindo fazer, vc tem um exemplo ou pode completar pra mim ter uma ideai.
Você precisa colocar os Gets e Sets.
Exemplo:
TForm1 = class(TForm)
UserControl1: TUserControl;
private
FUserControl: TUserControl;
public
property UserControl: TUserControl read FUserControl write FUserControl;
end;
Além disso, é necessário estar declarado UCBase na seção uses.
Funcionou perfeitamente obrigado.
Bom dia, usei seu exemplo para tentar implementar a tela de login no meu sistema, porém o delphi não acha “UserControlMain”, estou usando delphi seattle, pode me ajudar?
Bom dia estou com o mesmo problema do Fabrício não está achando o UserControlMain.
Este “Self.UserControlMain” foi o componente colocado no form TFrmPrincipal,
no caso na propriedade Name do user control é ‘UserControlMain’.
É só joga o componente na tela principal e colocar este nome, para ficar o mesmo
código do exemplo.
No form de Login tem que ter um componente Usercontrol1 também?
Minha Unit de Login tá assim:
unit U_Login;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Mask, Vcl.StdCtrls, Vcl.ExtCtrls,
Vcl.Imaging.pngimage, System.ImageList, Vcl.ImgList, UniProvider,
SQLServerUniProvider, Data.DB, MemDS, DBAccess, Uni,UCBase, U_DM,
UCDataConnector, UCFireDACConn, UCSettings;
type
TFrm_Login = class(TForm)
Button1: TButton;
Button2: TButton;
LinkLabel1: TLinkLabel;
Image1: TImage;
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
ValorNome: TEdit;
ValorSenha: TEdit;
ImageList1: TImageList;
DataSource1: TDataSource;
SQLServerUniProvider1: TSQLServerUniProvider;
UniQuery1: TUniQuery;
UserControl1: TUserControl;
UCSettings1: TUCSettings;
UCControls1: TUCControls;
UCFireDACConn1: TUCFireDACConn;
procedure Button2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure ValorSenhaExit(Sender: TObject);
procedure UserControl1CustomLoginForm(Sender: TObject;
var CustomForm: TCustomForm);
private
FUserControl: TUserControl;
procedure SetUserControl(const Value: TUserControl);
public
fecha: Boolean;
property UserControl: TUserControl read FUserControl write SetUserControl;
Function GetStateK (Key: integer): boolean;
end;
var
Frm_Login: TFrm_Login;
implementation
{$R *.dfm}
procedure TFrm_Login.Button1Click(Sender: TObject);
begin
if FUserControl.VerificaLogin(ValorNome.Text, ValorSenha.Text) = 0 then
begin
ShowMessage(‘Logado’);
end
else
begin
// erro login
end;
end;
procedure TFrm_Login.Button2Click(Sender: TObject);
begin
Application.Terminate;
end;
procedure TFrm_Login.FormClose(Sender: TObject; var Action: TCloseAction);
begin
If Not fecha Then
Action := caNone
Else
Action := caFree;
end;
procedure TFrm_Login.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If GetStateK (VK_LMENU) And (Key = VK_F4) Then
fecha := False;
end;
procedure TFrm_Login.FormShow(Sender: TObject);
begin
ValorNome.SetFocus;
end;
function TFrm_Login.GetStateK(Key: integer): boolean;
begin
Result := Odd (GetKeyState (Key));
end;
procedure TFrm_Login.SetUserControl(const Value: TUserControl);
begin
FUserControl := Value;
end;
procedure TFrm_Login.UserControl1CustomLoginForm(Sender: TObject;
var CustomForm: TCustomForm);
begin
CustomForm := TFrm_Login.Create(Application);
TFrm_Login(CustomForm).UserControl := Self.UserControlMain;
end;
procedure TFrm_Login.ValorSenhaExit(Sender: TObject);
begin
Button1.setfocus;
end;
end.
E a de Principal:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf,
FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async,
FireDAC.Phys, FireDAC.VCLUI.Wait, Data.DB, FireDAC.Comp.Client,
FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt,
dxGDIPlusClasses, Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.Menus, FireDAC.Comp.DataSet,
FireDAC.Comp.UI, FireDAC.Phys.MySQL, FireDAC.Phys.MySQLDef, UCSettings, UCBase,
UCDataConnector, UCFireDACConn, U_DM, U_Login;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
Cadastros1: TMenuItem;
Pesquisas1: TMenuItem;
Relatrios1: TMenuItem;
Configuraes1: TMenuItem;
Ajuda1: TMenuItem;
Sair1: TMenuItem;
Usurios1: TMenuItem;
CriarConta1: TMenuItem;
AlterarSenha1: TMenuItem;
LogOff1: TMenuItem;
BancodeDados1: TMenuItem;
StatusBar1: TStatusBar;
Image1: TImage;
UserControlMain: TUserControl;
UCFireDACConn1: TUCFireDACConn;
private
FUserControl: TUserControl;
procedure SetUserControl(const Value: TUserControl);
property UserControl: TUserControl read FUserControl write SetUserControl;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.SetUserControl(const Value: TUserControl);
begin
FUserControl := Value;
end;
Boa noite
Como implemento os Gets e Sets?
Olá pessoal alguém pode me ajudar fazendo favor.
Como implemento os Gets e Sets?
Oi Alexandre, se estiver montando a tela de login personalizada, precisa colocar no seu uma propriedade assim:
property UserControl: TUserControl read FUserControl write SetUserControl;
E user o Ctrl + Shfit + C que o Delphi monta o Set automaticamente para você.
Como não tem nenhum evento específico, o get que no caso é a leitura da variável não precisa ser feito.
Parecido com o exemplo acima do @Mabreu.
Peço desculpa pela insistência e obviamente que este não será o lugar
mais indicado para esta questão, digo eu! Porém à falta de melhor..
Verifico que o pessoal está usando versões avançadas do Delphi …
só que ainda vou no XE7 e dá para fazer tudo o que necessito, pelo menos até hoje.
A questão que a últma versão do UC Swdelphi não compila e na que tenho 2.2o Firedac tem problemas não vê u UC e vice versa se não estiver no mesmo form?
Como faço alguém me ajuda a compila-lo para XE7? Obrigado