Página 1 de 1
Salvar variáveis
Enviado: 16 Mai 2012 11:18
por marcoantonio.sommus
Bom dia pessoal,
Estou tentando salvar as variáveis do meu sistema, com os respectivos valores, num arquivo externo num determinado momento da minha aplicação, para que seja possível restaura-las posteriormente. Para isso estou utilizando o comando SAVE TO, contudo este comando só salva os 10 primeiros dígitos do nome da variável. Esse problema já foi citado no post a seguir: viewtopic.php?f=4&t=10403 , contudo não foi dada uma solução. Algúem sabe alguma forma de salvar as variáveis do sistema em algum arquivo (.INI ou .MEM por exemplo) com o nome completo?
Desde já, muito obrigado!
Marco Antônio do Couto Fernandes
SOMMUS Automação
Salvar variáveis
Enviado: 16 Mai 2012 13:15
por Jairo Maia
Olá Marco Antônio,
Use Hb_MvSave() e Hb_MvRestore. Veja o exemplo abaixo:
Nota: Assim como no Clipper, essas funções não salvam variáveis declaradas como LOCAL
Código: Selecionar todos
Function Main()
Private cVariavel_Caracter := "Teste"
Private nVariavel_Numerica := 10
Private dVariavel_Data := Date()
Private lVariavel_Logica := .t.
Hb_MvSave( "Teste1.Mem", "*.*")
Release cVariavel_Caracter
Release nVariavel_Numerica
Release dVariavel_Data
Release lVariavel_Logica
VerVariaveis()
Return Nil
Function VerVariaveis()
Clear Screen
Hb_MvRestore( "Teste1.Mem", .t. )
?
? cVariavel_Caracter
? nVariavel_Numerica
? dVariavel_Data
? lVariavel_Logica
?
Return Nil
Salvar variáveis
Enviado: 16 Mai 2012 13:43
por marcoantonio.sommus
Olá Jairo,
Cara eu tentei usar estas funções no meu sistema mas ocorreu erro, dizendo que as funções não existiam. Você sabe se eu preciso adicionar alguma dll ou coisa do tipo?
Desde já, obrigado!
Marco Antônio do Couto Fernandes
Salvar variáveis
Enviado: 16 Mai 2012 13:50
por alxsts
Olá!
Eu utilizaria aquelas funções que salvam e restauram arrays am disco (não me lembro dos nomes). Nelas dá para salvar variáveis do tipo LOCAL, STATIC, codeblocks e até mesmo arrays. Ou partiria para os arquivos .INI.
Salvar variáveis
Enviado: 16 Mai 2012 13:58
por sygecom
Eu compartilho com a idéia do Alexandre, eu usaria uns .INI , como uso Hwgui já tem até umas funçõs que usa isso hoje:
Exemplo Lendo o INI:
nTIPO_IMP := VAL(Hwg_GetIni( 'Geral' , 'DANFE' , , "C:\CAMINHO_PASTA\ACBrNFeMonitor.ini")) // 0=retrato 1=paisagem
Exemplo gravando no INI
Hwg_WriteIni( 'Geral' , 'DANFE' , alltrim(str(nTIPO_IMP)) , "C:\CAMINHO_PASTA\ACBrNFeMonitor.ini" )
Salvar variáveis
Enviado: 16 Mai 2012 14:31
por marcoantonio.sommus
Mas galera, existe alguma função que me retorne todas as variáveis do sistema com os respectivos valores para que assim eu as salve no .INI ?
att
Salvar variáveis
Enviado: 16 Mai 2012 14:32
por Jairo Maia
Olá Marco Antônio,
marcoantonio.sommus escreveu:Você sabe se eu preciso adicionar alguma dll ou coisa do tipo?
Antes de publicar o post , compilei usando
HARBOUR com o comando:
HBMK2 TESTE.PRG. Não inclui nenhuma lib.
Você está usando Harbour ou xHarbour? Me parece que estas funções são do Harbour.
Nota:
A função que o colega Alexandre citou (e que também não lembro o nome), foi implementada na versão 5.2 do Clipper.
Salvar variáveis
Enviado: 16 Mai 2012 14:44
por sygecom
marcoantonio.sommus escreveu:Mas galera, existe alguma função que me retorne todas as variáveis do sistema com os respectivos valores para que assim eu as salve no .INI ?
a:=__MVSYMBOLINFO() // retorna um vetor com todas as variáveis e seus conteudos
? valtoprg(a)
Salvar variáveis
Enviado: 16 Mai 2012 14:51
por marcoantonio.sommus
Leonardo, funcionou!
Muito obrigado a todos.
att
Marco Antônio do Couto Fernandes
Salvar variáveis
Enviado: 16 Mai 2012 15:01
por viniciuspc
Para salvar Arrays, eu utilizo uma função do Rick Spence, Em Clipper
creditos para RICK SPENCE (me avisem se não puder ser publicado)
Código: Selecionar todos
/***
* SAVEARRAY e RESTARRAY POR R I C K S P E N C E
**/
#include "save_arr.ch"
/***
* SaveArray(aArray, cFileName)
*
* aArray[] - -Array to save
* cFileName - -File in which to save array
*/
FUNCTION SaveArray(aArray, cFileName)
LOCAL fHandle := FCreate(cFileName , 0 ) // 0 = normal read/write; se ja existe sera esvaziado!
SaveArr(fHandle, aArray)
FClose(fHandle)
RETURN NIL
STATIC FUNCTION SaveArr(fHandle, aArray)
LOCAL LenArray, ElemType, i
// Write the array header
WRITE_AHD(fHandle, aArray) && save_arr.ch
LenArray := Len(aArray)
// Write each element in the array ~EL
FOR i := 1 TO LenArray
ElemType := ValType(aArray[i])
DO CASE
CASE ElemType == "A"
// A subarray, recurse ~EL
SaveArr(fHandle, aArray[i])
CASE ElemType == "B"
// Fatal error here- -we cannot write blocks
? "ERROR: CANNOT SAVE A CODE BLOCK"
InKey(0)
CASE ElemType == "C"
// Save a character element
SAVE_CHAR(fHandle, aArray[i])
CASE ElemType == "D"
// Save a date element
SAVE_DATE(fHandle, aArray[i])
CASE ElemType == "L"
// Save a logical element
SAVE_LOG(fHandle, aArray[i])
CASE ElemType == "N"
// Save a numeric element
SAVE_NUM(fHandle, aArray[i])
ENDCASE
NEXT
RETURN NIL
/***
* RestArray(cFileName)
*
* cFileName - -File from which to restore array
*/
FUNCTION RestArray(cFileName)
LOCAL aRestArr, fHandle := FOpen(cFileName , 0) // 0 = reading only !
GET_TYPE(fHandle)
aRestArr := RestArr(fHandle)
FClose(fHandle)
RETURN aRestArr
FUNCTION RestArr(fHandle)
LOCAL LenArray, i, ElemType, aArray
// Determine array's size and allocate it
LenArray := GET_AR_SIZE(fHandle)
aArray := Array(LenArray)
// Restore each element
FOR i := 1 TO LenArray
// Determine its type
ElemType := GET_TYPE(fHandle)
DO CASE
CASE ElemType == "A"
// A sub array so recurse ~EL
aArray[i] := RestArr(fHandle)
CASE ElemType == "B"
// Fatal error here ... we did not save one
CASE ElemType == "C"
aArray[i] := GET_CHAR(fHandle)
CASE ElemType == "D"
aArray[i] := GET_DATE(fHandle)
CASE ElemType == "L"
aArray[i] := GET_LOG(fHandle)
CASE ElemType == "N"
aArray[i] := GET_NUM(fHandle)
ENDCASE
NEXT
RETURN aArray
arquivo save_arr.ch
Código: Selecionar todos
// Listing 3.5: Macros to read and write array elements
/***
* SAVE_ARR.CH
*
* Clipper header file for array save and restore
*
*/
// In the following macros fh is a file handle
// Write character element: C<5 digit length><character value>
#define SAVE_CHAR(fh, cv) FWrite(fh, "C" + Str(Len(cv), 5) + cv)
// Write date element: D<datestring>
#define SAVE_DATE(fh, dv) FWrite(fh, "D" + Dtoc(dv))
// Write logical element: L<T or F character>
#define SAVE_LOG(fh, lv) FWrite(fh, "L" + Iif(lv, "T", "F"))
// Write numeric element:
// N<2 digit length>
// <numeric formatted as a string>
#define SAVE_NUM(fh, nv) FWrite(fh, "N" + Str(Len(Str(nv)),2) + ;
Str(nv))
// Write array header: A<4 digit array length>
#define WRITE_AHD(fh, av) FWrite(fh, "A" + Str(Len(av), 4))
// Read a type
#define GET_TYPE(fh) FReadStr(fh, 1)
// Read an array size
#define GET_AR_SIZE(fh) Val(FReadStr(fh, 4))
// Read a character element
#define GET_CHAR(fh) FReadStr(fh, Val(FReadStr(fh, 5)))
// Read a date element
#define GET_DATE(fh) Ctod(FReadStr(fh, 8))
// Read a logical element
#define GET_LOG(fh) FReadStr(fh, 1) == "T"
// Read a numeric element
#define GET_NUM(fh) Val(FReadStr(fh, Val(FReadStr(fh, 2))))
modo de se utilizar :
Código: Selecionar todos
...
local aVetor
local aVetRead
aVetor := { "primeiro" , "segundo" ,{{100,.T.}} };
SAVEARRAY(aVetor,"VETOR.ARR")
...
...
aVetRead := RESTARRAY("VETOR.ARR")
* assim aVetRead fica igual a aVetor
....
[]´s