Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

JonatasFn

Variáveis Globais

Recommended Posts

Bom dia, preciso usar uma variável do form Login no form Principal, já andei pesquisando e vi que devo declarar a variável dentro de Public e definir a Unit Login dentro de Uses, já fiz isto mas não tá dando certo. O que devo fazer? O que estou fazendo de errado?

 

Unit Login:

private
    { Private declarations }
  public
    { Public declarations }
         usuario : String;
  end;

var
  frmLogin: TfrmLogin;


procedure TfrmLogin.btEntrarClick(Sender: TObject);
begin
if edSenha.Text = dbeSenha.text then
   begin
   usuario := 'teste';
   frmPrincipal.Show;
   frmLogin.Hide;
   end
 else
    Application.messagebox ('A SENHA INFORMADA ESTÁ INCORRETA !', 'Atenção');



    end;

E a Unit Principal:

uses CadFuncionarios, CadCidades, Login, CadEstado, CadEscolaridade;

Label1.Caption := usuario;

Dá este erro:

Principal.pas(90): Undeclared identifier: 'usuario'

 

Quando declarei dentro de var, ele não deu erro, mas a variavel tbm não recebeu nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A sim, é assim amigo, esta variavel pertence a um objeto (o form) então para acessa-la, utilize assim:

frmLogin.Usuario

 

 

espero ter ajudado

 

 

 

 

A sim, so lembrando, essa variavel não é "Global", ela e uma variavel (da pra se dizer "propriedade") do objeto formLogin. As variaveis globais são declaradas na sessão "var" das units do seu projeto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Raficcha, valew pea ajuda, mas não funcionou.

Eu fiz assim:

 

Label1.Caption := frmLogin.usuario;

Não deu erro, mas tbm não apareceu nada no Label. Era pra aparecer "Teste", que eu inseri na variável no Form Login.

 

Começo a achar q eu é q estou fazendo algo de errado. Só não sei o que?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aonde você coloco u o "Label1.Caption := frmLogin.usuario"? certifiquese-se de que colocou ele depois do usuario := 'teste';

 

uma dica, coloque o "Label1.Caption := frmLogin.usuario" dentro de um TTimer e teste o programa

Compartilhar este post


Link para o post
Compartilhar em outros sites

Será que você não está destruindo da memória o form de login antes de pegar o conteúdo da variável?

 

Qual o erro?

 

AccessViolation?

 

Muito provável que seja isso;

 

Se for, você pode setar o valor do caption do label do form principal a partir do form de login...

 

Ai você é quem decide...

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aonde você coloco u o "Label1.Caption := frmLogin.usuario"? certifiquese-se de que colocou ele depois do usuario := 'teste';

 

uma dica, coloque o "Label1.Caption := frmLogin.usuario" dentro de um TTimer e teste o programa

 

Como assim depois? o "usuario := 'teste'" está em uma Unit e "Label1.Caption := frmLogin.usuario" está em outra.

 

Será que você não está destruindo da memória o form de login antes de pegar o conteúdo da variável?

 

Qual o erro?

 

AccessViolation?

 

Muito provável que seja isso;

 

Se for, você pode setar o valor do caption do label do form principal a partir do form de login...

 

Ai você é quem decide...

 

Abraço

 

Não tá dando erro nenhum, só que não está exibindo nada, é como se a variável estivesse recebendo ''(nada). Eu to dando um HIDE no form, mas é depois de atribuir valor pra variável.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim, antes de receber o valor que esta em frmLogin.usuario, você tem que atribuir um valor a ela.

 

por isso eu falei para colocar um TTimer.

 

Se você esta fazendo Label1.Caption := frmLogin.usuario no metodo "OnCreate" de algum form, verifique se este form não esta sendo criado antes do frmLogin ok

 

O metodo onCreate do Formulari principal é executado antes do metodo OnCreate do formulario frmLogin por exemplo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Putz, denovo bloqueo a minha postagem, ai que raiva.... hehe ... mas tudo bem, iscrivenhetenho denovo

 

Assim, você tem que, antes de receber o valor de "usuario" em "label1.caption", adicionar o valor "teste".

 

Se você esta fazendo "Label1.caption := frmlogin.usuario" no metodo onCreate do Formulario principal, de nada vai adiantar, pois o metodo onCreate do Formulario principal, é executado antes do metodo onCreate do frmLogin por exemplo.

 

Coloque este Label1.caption := frmlogin.usuario em um button para ver se da certo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Putz, denovo bloqueo a minha postagem, ai que raiva.... hehe ... mas tudo bem, iscrivenhetenho denovo

 

Assim, você tem que, antes de receber o valor de "usuario" em "label1.caption", adicionar o valor "teste".

 

Se você esta fazendo "Label1.caption := frmlogin.usuario" no metodo onCreate do Formulario principal, de nada vai adiantar, pois o metodo onCreate do Formulario principal, é executado antes do metodo onCreate do frmLogin por exemplo.

 

Coloque este Label1.caption := frmlogin.usuario em um button para ver se da certo

 

Entendi seu raciocínio, mas a atribuição da variavel usuario, está sendo feita no OnClick de um Button, no botão Entrar do form Login, e o meu form Login é o Main, entaum ele é criado primeiro não é?

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente declarar sua variável assim:

 

private    
   { Private declarations }  
public    
   { Public declarations }         
end;

var  frmLogin: TfrmLogin; usuario: String;


procedure TfrmLogin.btEntrarClick(Sender: TObject);
begin
   if edSenha.Text = dbeSenha.text then   
   begin   
      usuario := 'teste';   
      frmPrincipal.Show;   
      frmLogin.Hide;   
   end 
   else    
      Application.messagebox ('A SENHA INFORMADA ESTÁ INCORRETA !', 'Atenção');

 

repare que declarei ela junto com o form...

 

para utiliza-la, faça como estava fazendo no início, declarando esta unit na cláusula uses das demais ...

 

 

qq coisa post novamente ...

 

 

abraços !!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente declarar sua variável assim:

 

private    
   { Private declarations }  
public    
   { Public declarations }         
end;

var  frmLogin: TfrmLogin; usuario: String;


procedure TfrmLogin.btEntrarClick(Sender: TObject);
begin
   if edSenha.Text = dbeSenha.text then   
   begin   
      usuario := 'teste';   
      frmPrincipal.Show;   
      frmLogin.Hide;   
   end 
   else    
      Application.messagebox ('A SENHA INFORMADA ESTÁ INCORRETA !', 'Atenção');

 

repare que declarei ela junto com o form...

 

para utiliza-la, faça como estava fazendo no início, declarando esta unit na cláusula uses das demais ...

 

 

qq coisa post novamente ...

 

 

abraços !!!

 

Valew pela força Daniel, mas nao funfou...

Não é possível, eu devo estar fazendo algo de errado. Não deu erro da forma q você me passou, mas o Label não recebeu nada, ele nem apareceu. É como se a variável estive vazia.

 

Deixa eu fazer uma pergunta q eu já deveria ter feito antes. O motivo de eu querer saber como se usa variáveis globais(ou seja lá como se chamam), é pelo seguinte, eu programa em PHP, e no PHP quando eu quero enviar uma variavel de uma página pra outra eu uso o método POST, GET ou até mesmo SESSION. E é isso que preciso fazer, quando o usuário faz login, eu envie para uma variável e posso pegar o valor desta variável em outro form.

 

Eu tenho também um form com um DBGrid, que exibe todos os resultados da tabela funcionário, e preciso que quando eu clique sobre uma linha, ele abra uma outro form, já com as informações do respectivo funcionário, e acho q para isso vou precisar disto.

 

É assim mesmo que se faz, ou estou misturando tudo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, acho que você esta misturando um pouco msm, não da para pegar variaveis do Delphi direto pelo php, você vai ter que ter algum meio de enviar esses valores para o PHP (Um arquivo, uma tabela no banco de dados, conexão por Sockets, WebService). Eu nunca fiz isso então nom posso dar uma respota muito concreta..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, acho que você esta misturando um pouco msm, não da para pegar variaveis do Delphi direto pelo php, você vai ter que ter algum meio de enviar esses valores para o PHP (Um arquivo, uma tabela no banco de dados, conexão por Sockets, WebService). Eu nunca fiz isso então nom posso dar uma respota muito concreta..

 

Não, não Raficcha... você entendeu errado... a história do PHP é só pra explicar o q eu quero. Quero dizer q eu quero enviar variáveis de um form para o outro + ou - como se faz no PHP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Putz... já tô desanimando...

Olha o que eu fiz:

 

Unit Login (Main)

var
   frmLogin: TfrmLogin; 
   usuario : String;

Unit Principal

implementation

uses CadFuncionarios, Login;

...

procedure TfrmPrincipal.FormCreate(Sender: TObject);
begin
Edit1.Text := Login.usuario;

end;

Mas não aparece nada no TEdit do form principal, já testei a variável a exibindo-a no próprio form Login e exibe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, nunca vai aparecer nada, a primeira coisa que o teu programa faz ai em em cima (no formCreate) é pegar o valor de usuario (que ainda não esta inicializado).

 

olha so, colca ai um projeto novo no Delphi, e coloca dois formularios (Form1 e Form2)

No form1 coloque tres botões

 

Na primeira Unit1 (a do form1) coloque

 

     unit Unit1;
     
     interface
     
     uses
       Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
       Dialogs, StdCtrls;
     
     type
       TForm1 = class(TForm)
         Button1: TButton;
         Button2: TButton;
         Button3: TButton;
         procedure Button1Click(Sender: TObject);
         procedure Button2Click(Sender: TObject);
         procedure Button3Click(Sender: TObject);
       private
         { Private declarations }
       public
         { Public declarations }
       end;
     
     var
       Form1: TForm1;
       Variavel_usuario: string;
     
     implementation
     
     uses Unit2;
     
     {$R *.dfm}
     
     procedure TForm1.Button1Click(Sender: TObject);
     begin
         Showmessage(usuario);
     end;
     
     procedure TForm1.Button2Click(Sender: TObject);
     begin
     showmessage(form2.variavel_no_form);
     end;
     
     procedure TForm1.Button3Click(Sender: TObject);
     begin
         usuario := 'este é o valor da variavel global "Usuario" que esta em Unit2';
         Form2.variavel_no_form := 'Este é o valor da variavel Form2.variavel_no_form';
         {
         pode fazer Unit2.Usuario := 'Teste';
         }
     end;
     
     end.
     

e na unit2 (a do form2) coloque

 

     unit Unit2;
     
     interface
     
     uses
       Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
       Dialogs;
     
     type
       TForm2 = class(TForm)
       private
         { Private declarations }
       public
         { Public declarations }
         variavel_no_form : string;
       end;
     
     var
       Form2: TForm2;
       Usuario: string;
     
     implementation
     
     {$R *.dfm}
     
     end.
     

agora testa ai

 

 

 

quando você atribui um valor a um TEdit por exemplo, ele não vai ficar atualizando o seu valor toda a vez que a variavel é alterada, então, sempre que desejar atualizar um valor em um TEdit.Text, ou seja, copiar o valor de uma variavel para outra compatível, temos que acionar um trecho de código.

 

De nada adianta eu passar o valor de uma variavel X a outra Y e depois inicializar X ."primeiro tenho que inicializar , depois passo o valor. Primeiro altero, depois atualizo"

 

Você apenas esta utilizando as coisas na ordem errada Quando não da certo, coloque cada coisa em um botão, e execute na ordem.

 

Bom, se não for isso, você deve ter algum procedimento limpando a variavel.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, gostaria de dizer que o delphi não tem o conceito de variáveis globais a nível de projeto e sim apenas a nível de Unit (escopo de declaração).

 

para exemplo, faça assim:

 

1 - Crie um novo projeto

2 - Insira um form em branco

3 - insira um botao e um edit no primeiro form

 

seguindo estas etapas - e apenas estas etapas - você terá 2 forms, o primeiro, com 2 componentes (1 edit e um button) e o segundo pelado. não altere nome de nenhum objeto do projeto

bom, no form1, aperte F12 para ver o source e substitua todo o source da sua uni1 pelo código que segue abaixo

unit Unit1;
  
  interface
  
  uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;
  
  type
    TForm1 = class(TForm)
      Button1: TButton;
      Edit1: TEdit;
      procedure Button1Click(Sender: TObject);
    private
      { Private declarations }
    public
      { Public declarations }
    end;
  
  var
    Form1: TForm1;
    Frase: String; //Variável Global A NÍVEL DE UNIT, ou seja, eu acesso ela de qualquer lugar desta Unit
  
  implementation
  
  {$R *.dfm}
  
  uses
    unit2; //necessário para que eu utilize os métodos do outro form, como o ShowModal;
  
  procedure TForm1.Button1Click(Sender: TObject);
  //Evento OnClick
  begin
    Frase := Edit1.Text;
    form2.ShowModal;
  end;
  
  end.

 

e na unit2, aperte F12 para ver o source e coloque o código abaixo

 

unit Unit2;
  
  interface
  
  uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs;
  
  type
    TForm2 = class(TForm)
      procedure FormShow(Sender: TObject);
    private
      { Private declarations }
    public
      { Public declarations }
    end;
  
  var
    Form2: TForm2;
  
  implementation
  
  {$R *.dfm}
  
  uses
    unit1; //Preciso incluir a unit que tem a variável global (a nível de unit) para acessar a mesma
  
  procedure TForm2.FormShow(Sender: TObject);
  begin
    ShowMessage(Frase);
  end;
  
  end.

Leia os comentários do source. Observe que eu trabalhei com apenas 2 métodos, acesse o object inspector e verifique se os eventos dos componentes estão apontando para os métodos certos (Button1.onclick e Form2.OnShow)

 

-------

 

Se este exemplo funcionar mas o seu source não, lembre que voce deve analisar o fluxo do programa, execute seu programa utilizando a tecla F7 e acompanhe o valor da sua variável....

[/b]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, como não descobri o que estva fazendo de errado, fui por outro caminho. Que, aliás, não sei se é a forma correta.

Mas funcionou e supriu as minhas necessidades (pelo menos por enquanto).

 

A solução que encontrei foi usar objetos com um Edit e pegar a variável que está dentro do Edit, já que declaro a unit q contém o Edit no Uses, e depois uso a variável.

 

Ex.:

Uses

Login, ...

 

...

 

variavel := frmLogin.Edit1.text;

 

E funcionou, caso alguém saiba um motivo pra não usar esta forma, será muito útil para aprender.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo JonatasFn. Eu também tinha esse problema aliás tds precisam ,às vezes não, de variáveis globais. E eu resolvo o problema da seguinte forma : adiciono ao projeto uma nova unit e a chamo de untGlobais e nela declaro todas variáveis globais e quando eu quiser acessar alguma dessas variáveis é só adiciona na cláusula "uses" a unit com as váriaveis globais.

Pelo ao menos consegui driblar esse problema desse jeito.

unit untglobais;

interface

var
  frmPrincipalFechado : Boolean;
  usuarioLogado : String;
  codrevendedorAtivo : Integer;
  terminarAplicacao : Boolean;

implementation
begin
   frmPrincipalFechado := True;
   usuarioLogado := 'wAfRThYwDg4186g4GsseR6';
   codrevendedorAtivo := -1;
   terminarAplicacao := false;
end.

Quando você precisar de uma variável global adicione na uses a untGlobais (no meu caso)

  private
    { Private declarations }
    function checarLogin : Boolean;
    function validacampos(campo1,campo2 : String): Boolean;
  public
    { Public declarations }
  end;

var
  frmLogin: TfrmLogin;
  tentativasLogin : Integer;
implementation

uses untfrmNewUser, untdmRevendas, untfrmroot, untglobais {unit das variáveis globais};

Compartilhar este post


Link para o post
Compartilhar em outros sites

até o momento, nenhuma objeção...

 

 

...Agora, para que não fique esta dúvida do porque que o seu não funcionou, você poderia postar um pouco do seu source...

 

Cara, o meu source tá logo acima...

Ou você quer todo o código?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.