Fórum problema com variavel global.. #424753

26/09/2012

0

amigos..já to finalizando meu projeto de tcc..depois tem algumas melhorias que vou fazer nele antes de implantar na empresa..mas para entregar na escola preciso antes de um auxilio..

No meu form menu declarado tenho um statusbar onde eu gostaria que fosse mostrado o usuario logado..

Declarei uma variavel global para poder acumular o valor do login ao entrar sistema..

form login
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, Menus, ExtCtrls, StdCtrls; 

type 
  Tfrmprincipal = class(TForm) 
    editusuario: TEdit; 
    editsenha: TEdit; 
    Label1: TLabel; 
    Label2: TLabel; 
    btnconfirmar: TButton; 
    btnsair: TButton; 
    procedure btnconfirmarClick(Sender: TObject); 
    procedure btnsairClick(Sender: TObject); 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
  private 
   contador: smallint; 
   function logvalido(const usuario, senha: string): Boolean; 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 

var 
  frmprincipal: Tfrmprincipal; 
  usuariologado: string; >> variável global.. 

implementation 

uses Unit2, Unit4, Unit6; 

{$R *.dfm} 


tentei pegar o usuario logado dentro da função
function Tfrmprincipal.logvalido(const usuario, senha: string): Boolean; 
                  begin 
                    with DM.ADOconexaologin, DM.ClientDataSetlogin do 
                      begin 
                         if not connected then 
                            connected :=true; 
                         DM.ClientDataSetlogin.Close; 
                         DM.ClientDataSetlogin.commandtext := 'select count(1) from administrador ' + 'where upper(usuario) = '+ Quotedstr(AnsiupperCase(trim(usuario))) + 'and senha = '+ Quotedstr(trim(senha)); 
                         DM.ClientDataSetlogin.Open; 
                         result := (Fields[0].AsInteger > 0); 
                         frmprincipal.usuariologado:=usuario; 
                      end; 


mas dá erro nesta linha..>[b]frmprincipal.usuariologado:=usuario;[/b]
o erro diz que usuariologado não está identificado..
o frmmenu tá como autocreat e o frmlogin como available form
funciona a senha o login tudo sabe..mas nao carrega a variavel global..
grato a quem possa ajudar..
Mauricio Nicoli

Mauricio Nicoli

Responder

Posts

26/09/2012

Joel Rodrigues

Declarando nesse ponto, a variável pertence a Unit e não ao form. Declare-a na seção public do form, um pouco mais acima de onde você declarou. O que pertence ao form deve ficar dentro do código que o define, ou seja dentro da definição da classe.
Boa sorte.
Responder

Gostei + 0

26/09/2012

Mauricio Nicoli

ok

fiz isso..

só que ao rodar o sistema dentro do statubar retornou este erro no formmenu onde tem o statusbar ele tranca nesta linha

[b]statusbar1.panels[3].text:='usuário:' + usuariologado;[b]


neste caso ele não identifica a variavel usuariologado
Responder

Gostei + 0

26/09/2012

Mauricio Nicoli

fiz isso..
public 
        usuariologado: string; //>> variável global.. 
    { Public declarations } 
  end; 


só que dá erro aqui dentro do statusbar...ele ta em outro form...

statusbar1.Panels[3].Text := 'usuário:' + usuariologado; 


ele não identifica a variável [b]usuariologado [/b]


Responder

Gostei + 0

26/09/2012

Joel Rodrigues

Se a variável está em outro form, amigo, você não vai conseguir acessá-la assim. Você precisa ter uma instância do form que contém a variável e usá-la, por exemplo, assim: meuForm.usuariologado;
Sugeri que declarasse na seção public exatamente para poder acessar de outros forms, mas é preciso ter uma instância.
Responder

Gostei + 0

26/09/2012

Claudia Nogueira

fiz isso..
public 
        usuariologado: string; //>> variável global.. 
    { Public declarations } 
  end; 


só que dá erro aqui dentro do statusbar...ele ta em outro form...

statusbar1.Panels[3].Text := 'usuário:' + usuariologado; 


ele não identifica a variável [b]usuariologado [/b]




Vai no DataModule que uma arquivo que provavelmente vai estar referenciado em quase tudo e cria lá em cima depois dos Uses. Um exemplo:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

Var
usuariologado: string;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;


Olha lá em cima o "usuariologado: string;".
Esse "usuariologado" pode ser usado direto em qualquer form ou unit que o DataModule esteja referenciado.
Responder

Gostei + 0

27/09/2012

Alisson Santos

Se for só para trazer o uruário logado não precisaria, poderia utilizar uma outra rotina que na hora que confirmar o usuário e senha e entrar no sistema, você poderia já jogar essa informação para o statusbar direto.
Responder

Gostei + 0

27/09/2012

Mauricio Nicoli

[Quote]Olha lá em cima o "usuariologado: string;".
Esse "usuariologado" pode ser usado direto em qualquer form ou unit que o DataModule esteja referenciado.


fiz isso só não deu certo ainda..

fiz em teste..

coloquei no formmenu na uses o datamodulo...

ai debuguei meu código..vejam só..

aqui continua igual...

formlogin

public 
usuariologado: string; //>> variável global.. 
{ Public declarations } 
end; 


debuguei dentro da função no frmlogin..

function Tfrmprincipal.logvalido(const usuario, senha: string): Boolean; 
begin 
with DM.ADOconexaologin, DM.ClientDataSetlogin do 
begin 
if not connected then 
connected :=true; 
DM.ClientDataSetlogin.Close; 
DM.ClientDataSetlogin.commandtext := 'select count(1) from administrador ' + 'where upper(usuario) = '+ Quotedstr(AnsiupperCase(trim(usuario))) + 'and senha = '+ Quotedstr(trim(senha)); 
DM.ClientDataSetlogin.Open; 
result := (Fields[0].AsInteger > 0); 
frmprincipal.usuariologado:=usuario; >>>>debuguei aqui ok
end; 


ao passar o mouse em cima da variável [b]usuario[/b] aparece o nome que digitei ao entrar no sistema

ao passar o mouse em cima de [b]usuariologado[/b] na mesma linha diz " usuariologado='' "

ou seja..a variavel global não tá recebendo o valor que a variavel usuario tem..e tem mesmo..ta certo..

como posso corrigir isso se apenas ela não ta recebendo o valor informado que foi digitado?

Responder

Gostei + 0

27/09/2012

Alisson Santos

[Quote]Olha lá em cima o "usuariologado: string;".
Esse "usuariologado" pode ser usado direto em qualquer form ou unit que o DataModule esteja referenciado.


fiz isso só não deu certo ainda..

fiz em teste..

coloquei no formmenu na uses o datamodulo...

ai debuguei meu código..vejam só..

aqui continua igual...

formlogin

public 
usuariologado: string; //>> variável global.. 
{ Public declarations } 
end; 


debuguei dentro da função no frmlogin..

function Tfrmprincipal.logvalido(const usuario, senha: string): Boolean; 
begin 
with DM.ADOconexaologin, DM.ClientDataSetlogin do 
begin 
if not connected then 
connected :=true; 
DM.ClientDataSetlogin.Close; 
DM.ClientDataSetlogin.commandtext := 'select count(1) from administrador ' + 'where upper(usuario) = '+ Quotedstr(AnsiupperCase(trim(usuario))) + 'and senha = '+ Quotedstr(trim(senha)); 
DM.ClientDataSetlogin.Open; 
result := (Fields[0].AsInteger > 0); 
frmprincipal.usuariologado:=usuario; >>>>debuguei aqui ok
end; 




Amigo desculpe não entendi o porque está fazendo a chamada de dentro dessa função.
Essa função está em outra unit, se estiver pode fazer assim.

1 - Cria o objeto que é a nova unit sua

Unit1 := TUnit1.Create(Self);

Após a criação você pode ter acesso aos metodos e atributos que foi criado dentro dele, ai você poderia fazer desse jeito.
StatusBar1.Panels[0].Text := unit1.(Nome da variavel que recebe esse valor).
Pelo que pude analisar é outra unit.

Qualquer coisa só informar se é ou não outra unit que eu deixo o trecho para você aqui como faz.
Responder

Gostei + 0

27/09/2012

Mauricio Nicoli

amigo esta função
function Tfrmprincipal.logvalido(const usuario, senha: string): Boolean; 
begin 
with DM.ADOconexaologin, DM.ClientDataSetlogin do 
begin 
if not connected then 
connected :=true; 
DM.ClientDataSetlogin.Close; 
DM.ClientDataSetlogin.commandtext := 'select count(1) from administrador ' + 'where upper(usuario) = '+ Quotedstr(AnsiupperCase(trim(usuario))) + 'and senha = '+ Quotedstr(trim(senha)); 
DM.ClientDataSetlogin.Open; 
result := (Fields[0].AsInteger > 0); 
frmprincipal.usuariologado:=usuario; >>>>debuguei aqui ok
end; 


está dentro na unit do formlogin onde está também a variavel global..o form login vem antes do frmmenu..

o statusbar está dentro do formmenu ok

estou tentando fazer o login do usuario aparecer dentro dele..

ao debugar a linha
frmprincipal.usuariologado:=usuario


vi que a variavel usuariologado está recebendo '' sendo que a variavel usuario ta carregando o valor do edit corretamente..

não sei se não escolhi o melhor lugar para carregar a variavel glogal mas apenas o que ta ocorrendo
é que a variavel usuariologado não ta recebendo o valor certo..
Responder

Gostei + 0

27/09/2012

Bruno Leandro

sera que a sua variavel 'usuario' nao esta vazia, nao seria a mesma coisa(ou melhor) utilizar o 'editNomeUsuario.text' para atribuir a sua variavel do form principal
Responder

Gostei + 0

27/09/2012

Patricia Menezes



Meu nobre sem instanciar a Classe que quer pegar
a variável global nunca irá conseguir.

uses Unit1;

procedure TForm2.FormShow(Sender: TObject);
Var
   //Veriável Form1 que instaciará TForm1
   Form1 : TForm1;
begin
   //É necessário fazer a instância da Classe
   Form1 := TForm1.Create(nil);
   //Pegue onde quiser a variável global
   Form2.Caption := Form1.usuariologado;
end;


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar