acesso a variaveis local

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

davidbezerra
Usuário Nível 1
Usuário Nível 1
Mensagens: 30
Registrado em: 13 Mar 2008 13:56
Localização: JEQUIE

acesso a variaveis local

Mensagem por davidbezerra »

pessoal, bom dia,

queria saber se tem como acessar uma variavel local de uma outra procedure ou function, por exemplo:

Código: Selecionar todos

function primeira()
local nCodigo:=1, cNome:='teste 1'
...
MsgInfo("Codigo: "+str(ncodigo)+"- Nome: "+cNome ,"Teste") // mostra Codigo: 1 - Nome: teste 1
...
segunda()
MsgInfo("Codigo: "+str(ncodigo)+"- Nome: "+cNome ,"Teste") // mostra Codigo: 2 - Nome: teste 2
Return(nil)

function segunda()
nCodigo:=2
cNome:="teste 2"
return(nil)
no delphi usaria mais ou menos assim:

Código: Selecionar todos

function primeira()
local nCodigo:=1, cNome:='teste 1'
...
MsgInfo("Codigo: "+str(ncodigo)+"- Nome: "+cNome ,"Teste") // mostra Codigo: 1 - Nome: teste 1
...
segunda()
MsgInfo("Codigo: "+str(ncodigo)+"- Nome: "+cNome ,"Teste") // mostra Codigo: 2 - Nome: teste 2
Return(nil)

function segunda()
primeira.nCodigo:=2
primeira.cNome:="teste 2"
return(nil)
se fosse so com essas duas variaves poderias usar assim:

Código: Selecionar todos

function primeira()
local nCodigo:=1, cNome:='teste 1'
...
MsgInfo("Codigo: "+str(ncodigo)+"- Nome: "+cNome ,"Teste") // mostra Codigo: 1 - Nome: teste 1
...
segunda(@nCodigo,@cNome)
MsgInfo("Codigo: "+str(ncodigo)+"- Nome: "+cNome ,"Teste") // mostra Codigo: 2 - Nome: teste 2
Return(nil)

function segunda(nCodigo,cNome)
nCodigo:=2
cNome:="teste 2"
return(nil)
o problema e que vou ler um banco de dados e preencher os gets, alem que querer manipular as suas opcoes como enable, disable, refresh e outras mais.

talvez eu so esteja programando da forma errada, mais se alguem poder mim dar uma ajuda ficaria mais facil.

valeu
E se não sabeis trabalhar com amor, mas com desagrado, é melhor deixar o trabalho e sentar-vos à porta do templo a pedir esmola àquele que trabalha com alegria.
Khalil Gibran
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

No Clipper as variáveis locais residem no espaço da pilha alocado pela função. Logo, não podem ser acessadas fora do escopo dessa função. Desconheço se o XHarbour tem esse recurso. Duvido que tenha, já que isso é uma óbvia transgressão à regra do escopo. Local é local. O escopo tem que ser limitado. Por isso que se chama "local". Mesmo em C++, onde a regra de escopo é bem mais dinâmica (mas não flexível), isso não pode ser feito.

Mas, se o XHarbour realmente não permite isso, ainda pode-se passar a variável por referência à segunda função. Aí sim, pode-se manipular a variável sem problema. Aliás, uma dica: use matriz pra isso. É o que eu costumo fazer. Funciona muito melhor, já que é um símbolo só.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
davidbezerra
Usuário Nível 1
Usuário Nível 1
Mensagens: 30
Registrado em: 13 Mar 2008 13:56
Localização: JEQUIE

Re: acesso a variaveis local

Mensagem por davidbezerra »

eu posso fazer um refresh() em uma variavel passada por referencia, no caso seria um get,
o meu problema alem de alimentar a variavel com dados e tambem manipular os componentes.
E se não sabeis trabalhar com amor, mas com desagrado, é melhor deixar o trabalho e sentar-vos à porta do templo a pedir esmola àquele que trabalha com alegria.
Khalil Gibran
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Você fez uma pergunta? Se sim, respondo com outra pergunta: não seria melhor usar uma variável private, que tem o escopo expandido e pode ser acessada por funções subsequentes?
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
rodrmigu
Usuário Nível 3
Usuário Nível 3
Mensagens: 150
Registrado em: 27 Nov 2007 15:13
Localização: Indaiatuba SP

Re: acesso a variaveis local

Mensagem por rodrmigu »

Olá,

Se vc for usar com hwgui, minigui, xhgtk ou qualquer outra biblioteca gráfica, não use varáveis Private, elas perdem a referência e deixam de existir assim que a procedure retorna, mas o form fica ativo. Isso já não acontece com variáveis locais.

Se vc não for usar biblioteca gráfica, então vc pode usar variáveis private e usar as funções, __MVPRIVATE, __MVPUT e __MVGET, onde vc consegue criar variáveis private em tempo de execução, pegar valores e atribuir valores.

PS:
Em Delphi vc consege fazer, pois não é uma função e sim uma propriedade de uma classe, tipo Form1 é uma Classe, etc. O mesmo também pode ser feito em xharbour como em Delphi se vc usar classes no harbour.
[]'s
Rodrigo
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: acesso a variaveis local

Mensagem por sygecom »

davidbezerra escreveu:pessoal, bom dia,
queria saber se tem como acessar uma variavel local de uma outra procedure ou function, por exemplo:
Olá David,
Se estiver usando Hwgui, de uma olhada nas ultimas implementações da Hwgui, inclusive o Luiz Basso deixou exemplo de uso na sessão Hwgui.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
davidbezerra
Usuário Nível 1
Usuário Nível 1
Mensagens: 30
Registrado em: 13 Mar 2008 13:56
Localização: JEQUIE

Re: acesso a variaveis local

Mensagem por davidbezerra »

é isso mesmo que estava procurando, juntando a sugestao feita por Maligno de passar uma matriz como referencia, ficou beleza,

so tenho um problema agora,

como baixo a atualizacao da HWGui?

desculpa a falta de experiencia, mais estou comecando em xHarbour agora.

so mais uma coisa,

sera que nao teria como acessar a variavel da seguinte forma:

oDlg:oPage1:oEditbox3:vEditBox3 := "teste de prenchimento da variavel"

é claro que só é uma pergunta de um leigo no assunto.

valeu
E se não sabeis trabalhar com amor, mas com desagrado, é melhor deixar o trabalho e sentar-vos à porta do templo a pedir esmola àquele que trabalha com alegria.
Khalil Gibran
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: acesso a variaveis local

Mensagem por sygecom »

davidbezerra escreveu: como baixo a atualizacao da HWGui?
De uma olhada nesse link abaixo que mostro como baixar o xharbour do CVS, para baixar a Hwgui do CVS é a mesma coisa.
viewtopic.php?f=19&t=6007
so mais uma coisa,

sera que nao teria como acessar a variavel da seguinte forma:

oDlg:oPage1:oEditbox3:vEditBox3 := "teste de prenchimento da variavel"
Ficaria assim para pegar na outra function.
msginfo(oDlg:oPage1:oEditbox3:title)
ou
msginfo(oDlg:oPage1:oEditbox3:getText())
ou se não esta usando como MODAL pode ser simplesmente.
msginfo(oEditbox3:title)
ou
msginfo(oEditbox3:getText())
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder