problema com variavel global..

Delphi

26/09/2012

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

Curtidas 0

Respostas

Joel Rodrigues

Joel Rodrigues

26/09/2012

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.
GOSTEI 0
Mauricio Nicoli

Mauricio Nicoli

26/09/2012

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
GOSTEI 0
Mauricio Nicoli

Mauricio Nicoli

26/09/2012

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]


GOSTEI 0
Joel Rodrigues

Joel Rodrigues

26/09/2012

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.
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

26/09/2012

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.
GOSTEI 0
Alisson Santos

Alisson Santos

26/09/2012

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.
GOSTEI 0
Mauricio Nicoli

Mauricio Nicoli

26/09/2012

[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?

GOSTEI 0
Alisson Santos

Alisson Santos

26/09/2012

[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.
GOSTEI 0
Mauricio Nicoli

Mauricio Nicoli

26/09/2012

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..
GOSTEI 0
Bruno Leandro

Bruno Leandro

26/09/2012

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
GOSTEI 0
Patricia Menezes

Patricia Menezes

26/09/2012



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;


GOSTEI 0
POSTAR