Amiguinho,
A muito tempo não uso arquivos .MEM e seus comandos de manipulação.
Tive a necessidade de gravar informações em arquivos que não .DBF e recorri a funções encontradas em meus livros embolorados.
A tempos faço uso delas e não tenho problema com tamanho dos conteúdos.
Funções:
Código: Selecionar todos
/*
*
* *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
* Descricao: Funcoes para tratamento de arrays
* *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
*
*/
Function EK_SAVEARR(Arg1, Arg2, Arg3) //Arg1=Array, Arg2=archivo, Arg3=doserror
local Local1:= Fcreate(Arg2), Local2
Arg3:= Ferror()
If (Arg3 == 0)
Local2:= _eksavesub(Arg1, Local1, @Arg3)
Fclose(Local1)
If (Local2 .AND. Ferror() != 0)
Arg3:= Ferror()
Local2:= .F.
EndIf
Else
Local2:= .F.
EndIf
Return Local2
Static Function _EKSAVESUB(Arg1, Arg2, Arg3)
local Local1, Local2, Local3
private lret
lret:= .T.
Local1:= ValType(Arg1)
Fwrite(Arg2, Local1, 1)
If (Ferror() == 0)
Do Case
Case Local1 = "A"
Local2:= Len(Arg1)
Fwrite(Arg2, L2Bin(Local2), 4)
If (Ferror() == 0)
AeVal(Arg1, {|_1| lret:= _eksavesub(_1, Arg2)})
Else
lret:= .F.
EndIf
Case Local1 = "B"
lret:= .F.
Case Local1 = "C"
Local2:= Len(Arg1)
Fwrite(Arg2, L2Bin(Local2), 4)
Fwrite(Arg2, Arg1)
Case Local1 = "D"
Local2:= 8
Fwrite(Arg2, L2Bin(Local2), 4)
Fwrite(Arg2, DToC(Arg1))
Case Local1 = "L"
Local2:= 1
Fwrite(Arg2, L2Bin(Local2), 4)
Fwrite(Arg2, iif(Arg1, "T", "F"))
Case Local1 = "N"
Local3:= Str(Arg1)
Local2:= Len(Local3)
Fwrite(Arg2, L2Bin(Local2), 4)
Fwrite(Arg2, Local3)
Endcase
Else
lret:= .F.
Endif
Arg3:= ferror()
Return lret
Function EK_RESTARR(Arg1, Arg2) // Arg1=Archivo, Arg2=doserror
Local Local1:= Fopen(Arg1), Local2
Arg2:= Ferror()
If (Arg2 == 0)
Local2:= _ekrestsub(Local1, @Arg2)
FClose(Local1)
Else
Local2:= {}
Endif
Return Local2
Static Function _EKRESTSUB(Arg1, Arg2)
local Local1:= " ", Local2, Local3, Local4, Local5, Local6
Fread(Arg1, @Local1, 1)
Local3:= Space(4)
Fread(Arg1, @Local3, 4)
Local2:= Bin2L(Local3)
Arg2:= Ferror()
If (Arg2 == 0)
Do Case
Case Local1 = "A"
Local4:= {}
For Local6 := 1 To Local2
AAdd(Local4, _ekrestsub(Arg1))
Next Local6
Case Local1 = "C"
Local4:= Space(Local2)
Fread(Arg1, @Local4, Local2)
Case Local1 = "D"
Local5:= Space(8)
Fread(Arg1, @Local5, 8)
Local4:= CToD(Local5)
Case Local1 = "L"
Local5:= " "
Fread(Arg1, @Local5, 1)
Local4:= Local5 = "T"
Case Local1 = "N"
Local5:= Space(Local2)
Fread(Arg1, @Local5, Local2)
Local4:= Val(Local5)
Endcase
Arg2:= ferror()
Endif
Return Local4
Mesmo que o trecho abaixo pareça não tenha nada a ver com o tópico servirá de ajudar para saber como usar:
Código: Selecionar todos
Function ListaOpcoes( _array_, _controle_, _sarray_ )
local oTBLDlg, oTBLLbx, cTBLDlg := _array_[1], lSave := .f.
DEFINE DIALOG oTBLDlg RESOURCE "dlgTBLAux"
REDEFINE LISTBOX oTBLLbx VAR cTBLDlg ITEMS _array_ ID 101 OF oTBLDlg
oTBLLbx:bLdblClick := {|nRow,nCol|( lSave:=.t., oTBLDlg:end() )}
REDEFINE BUTTON ID 5 OF oTBLDlg ACTION ( lSave:=.t., oTBLDlg:end() )
REDEFINE BUTTON ID 4 OF oTBLDlg ACTION ( lSave:=.f., oTBLDlg:end() )
REDEFINE BUTTON ID 3 OF oTBLDlg ACTION ( AddOpcoes( _array_, _sarray_ ), ;
oTBLLbx:Reset() , ;
oTBLLbx:SetItems(_array_) , ;
oTBLLbx:Refresh() )
// MODIFICAR REDEFINE BUTTON ID 2 OF oTBLDlg ACTION fun()
REDEFINE BUTTON ID 6 OF oTBLDlg ACTION ( nExcluir:=oTBLLbx:GetPos(), ;
iif( DelOpcoes( _array_, _sarray_, nExcluir ), ;
( oTBLLbx:Reset() , ; // ( oTBLLbx:Del(nExcluir) , ;
oTBLLbx:SetItems(_array_) , ;
oTBLLbx:Refresh() ), .t. ) )
ACTIVATE DIALOG oTBLDlg CENTERED VALID ( oTBLDlg := nil, .t. )
if lSave
_controle_:cText(cTBLDlg+SPACE(80))
_controle_:Refresh()
endif
return nil
Function AddOpcoes( _array_, _sarray_ )
local lSave := .f., cArrData := SPACE(25)
SET _3DLOOK ON
DEFINE FONT fntHelv2 NAME "Helv" SIZE 6, 6
DEFINE DIALOG oDlg RESOURCE "dlgEstCTab" TITLE "Preferencia" FONT fntHelv2
REDEFINE SAY oCtrl100 PROMPT "Preferencia" ID 100 OF oDlg
REDEFINE GET oCtrl101 VAR cArrData PICTURE "@!" ID 101 OF oDlg
REDEFINE BUTTON ID 1 OF oDlg ACTION ( lSave:=.t., oDlg:end() )
REDEFINE BUTTON ID 2 OF oDlg ACTION ( lSave:=.f., oDlg:end() )
ACTIVATE DIALOG oDlg CENTERED
if lSave
aLenArray:=len(_array_)
ASize(_array_, aLenArray+1 )
AIns(_array_, aLenArray+1 )
_array_[aLenArray+1] := cArrData
EK_SAVEARR( ASort(_array_), _sarray_ )
endif
return nil
Function DelOpcoes( _array_, _sarray_, _posicao_ )
if MsgYesNo( 'Excluir '+_array_[_posicao_] )
aLenArray:=len(_array_)
ADel( _array_, _posicao_ )
ASize(_array_, aLenArray-1 )
EK_SAVEARR( _array_, _sarray_ )
return .t.
else
return .f.
endif
Como eu uso em meus sistemas?
Primeiro eu verifico se meu arquivo Array existe na pasta do sistema:
Em um de meus GETs, simulo combos e passo as variáveis:
Código: Selecionar todos
...
VALID ListaOpcoes( aHistos, oGet109, "histos.arr" )
...
Use o segundo parâmetro, se for o caso para passar a variável do GET e refrescar seu conteúdo.
Minha função ListaOpções se encarrega de mostrar em um browse, as informações salvas e alguns botões/funções me permitem incluir, excluir, etc.
Analise com cuidado o código e implemente em sua aplicação.