olá Julio,
desculpe, eu deveria ter sido mais claro...
eu gravo imagens em arquivo tipo Memo, que seriam os "equivalentes" aos BLOBs e faço desta forma, onde a imagem é criada no disco somente temporariamente, sendo deletada depois (não vi o método LoadFromString, mas tenho quase certeza que ele cria um arquivo temporário no disco para depois deletá-lo)
veja este exemplo:
- Code: Select all Expand view RUN
#include "fivewin.ch"
Function Teste()
local cFileDbf := 'c:\temp\Dados.DBF'
local aEstr := {{"cNome","C",30,00},;
{"cExte","C",05,00},;
{"mImag","M",10,00} }
if .not.file(cFileDbf)
DBCREATE(cFileDbf,aEstr,'DBFNTX',.T.,'temp')
else
DBUSEAREA(.T.,'DBFNTX',cFileDbf,'temp',.F.)
endif
if neterr()
? 'Erro ao abrir arquivo '+cFileDbf
return
endif
SELECT temp
while .t.
nOpc=ALERT('Selecione a opção:',{'Gravar Imagens','Ler Imagens gravadas'},'Opções:')
if nOpc<1
close all
return
endif
if nOpc=1
oTela=nil
oNome=nil
lSalva=.F.
memvar->cNome=SPACE(30)
cPath=cGetFile("*.jpg",'Selecione a imagem desejada')
if .not.file(cPath)
close all
return
endif
define dialog oTela from 01,01 to 20,60 title 'Gravando imagem em Memo'
@ 01,01 say 'Imagem:' OF oTela COLOR CLR_BLACK
@ 01,06 say cPath OF oTela COLOR CLR_HBLUE
@ 03,01 say 'Digite o nome para imagem:' of oTela COLOR CLR_BLACK
@ 4.5,01 get oNome VAR memvar->cNome of oTela
@ 05,01 button 'Gravar' of oTela size 50,12 action (lSalva:=.t.,oTela:End()) CANCEL
activate dialog oTela centered
if .not.lSalva
loop
endif
cTemp = 'c:\temp\temp001.tmp'
FMimeEnc(cPath,cTemp)
if file(cTemp)
cMemo=memoread(cTemp)
cMemo=STRTRAN(cMemo,CRLF,'')
temp->(DBAPPEND())
REPLACE temp->cNome with memvar->cNome
REPLACE temp->cExte with cFileExt(cPath)
REPLACE temp->mImag with cMemo
ferase(cTemp)
msginfo('Imagem salva com sucesso !')
else
? 'Imagem não pode ser salva !'
endif
else
oTela=nil
oNome=nil
oImage=nil
lSalva=.F.
memvar->cNome=SPACE(30)
define dialog oTela from 01,01 to 20,60 title 'Lendo imagem em Memo'
@ 01,01 say 'Digite o nome para imagem:' of oTela COLOR CLR_BLACK
@ 2.5,01 get oNome VAR memvar->cNome of oTela
@ 05,01 button 'Ler' of oTela size 50,12 action (lSalva:=.t.,oTela:End()) CANCEL
activate dialog oTela centered
if .not.lSalva
loop
endif
cMemo=''
memvar->cExte=''
temp->(dbgotop())
while .not.temp->(eof())
if ALLTRIM(UPPER(temp->cNome)) == ALLTRIM(UPPER(memvar->cNome))
cMemo=temp->mImag
memvar->cExte=ALLTRIM(temp->cExte)
endif
temp->(dbskip())
enddo
if empty(cMemo)
? 'Arquivo não contém imagem com este nome !'
loop
endif
cTemp = 'c:\temp\temp002.tmp'
MEMOWRIT(cTemp,cMemo)
if file(cTemp)
cTemp2 = 'c:\temp\temp003.'+memvar->cExte
FMimeDec(cTemp,cTemp2)
if file(cTemp2)
ferase(cTemp)
ShellExecute(GetActiveWindow(),"open",cTemp2)
msginfo('Tecle algo para ler outra imagem','OK')
ferase(cTemp2)
else
? 'Imagem não pode ser lida !'
endif
else
? 'Imagem não pode ser lida !'
endif
endif
enddo
return
desta forma a imagem (qualquer extensão) está contida no campo MEMO do arquivo, certo ? quando eu precisar utilizá-la eu a salvo em um arquivo temp e realizo os procedimentos desejados...
no exemplo, estou somente visualizando, mas se eu precisar exibi-la em uma dialog por exemplo, seria somente fazer:
- Code: Select all Expand view RUN
01,01 IMAGE oImage FILANEM cTemp2 SIZE 100,50 OF oTela , etc, etc,
e depois de encerrar o dialogo deletar o arq temp
espero q te ajude
um abraço