Página 1 de 1

acesso a variaveis local

Enviado: 05 Jul 2008 10:10
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

Enviado: 05 Jul 2008 11:00
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ó.

Re: acesso a variaveis local

Enviado: 05 Jul 2008 13:07
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.

Enviado: 05 Jul 2008 13:44
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?

Re: acesso a variaveis local

Enviado: 06 Jul 2008 22:48
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

Re: acesso a variaveis local

Enviado: 06 Jul 2008 23:30
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.

Re: acesso a variaveis local

Enviado: 08 Jul 2008 11:33
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

Re: acesso a variaveis local

Enviado: 08 Jul 2008 12:10
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())