Newsgroup: it.comp.lang.vo-clipper
Titolo: File immagini in archivio Dbf

Ciao a tutti,
Sto sviluppando un programma per una ragazzina sordomuta, sono un 
insegnante, ho la necessità di gestire un archivio Dbf dove ci siano almeno 
due campi
1) Descrizione C 255    (testo libero)
2) Immagine     M 10     (una immagine DIB, JPG, ...)
Il programma consente al discente di imparare i lemmi delle immagini che 
vede.
Con varie fasi:
1-di studio: lettura del lemma e visualizzazione dell'immagine;
2-di associazione: dell'immagine visualizzata con la scelta di uno dei lemmi 
disponibili;
3-e in fine la scrittura del lemma corretto in base all'immagine 
visualizzata.
Ho sviluppato il programma con un semplice file di testo tipo questo
---------------------------------
TIMIDO
D:\Federica\Foto Federica\Fed_aggettivi\timido.jpg
PACIFICO
D:\Federica\Foto Federica\Fed_aggettivi\pacifico.jpg
PIEGATO
D:\Federica\Foto Federica\Fed_aggettivi\piegato.jpg
SECCO
D:\Federica\Foto Federica\Fed_aggettivi\secco.jpg
PROFUMATO
D:\Federica\Foto Federica\Fed_aggettivi\profumato.jpg
GOLOSO
D:\Federica\Foto Federica\Fed_aggettivi\goloso.jpg
----------------------------------
che carico in un array bi-dimensionale caricandomi di volta in volta 
l'immagine dal path relativo.
Ora il programma è molto piaciuto per le capacità di insegnare ma ha il 
problema della esportabilità, nel senso che se si vuole esportare il 
programma in un altro PC bisogna copiare tutte le foto nelle stesse 
identiche cartelle.
Sarebbe molto interessante invece poter mettere in un file Dbf le immagini 
con la relativa descrizione in modo tale da poter mettere il tutto in un CD 
e/o pendrive e far studiare il discente in qualunque PC.
So che il problema è banale ma ci sto sbattendo la testa da due giorni e 
sono sicuro che qualcuno, per la buona causa, mi aiuterà.
Per la visualizzazione sto già utilizzando la FabPaitLib
Grazie a tutti
Claudio (anche da parte di Federica)

 ha scritto nel 
messaggio news:y3Fgl.168961$Ca.3...@twister2.libero.it...


Concordo con Massimo,
non è una buona idea memorizzare le immagini nel dbf,
metti nel dbf solo il percorso.
Per quanto riguarda il funzionamento su pendrive non vedo quale
sia il problema, basta far lavorare il programma su Workdir()
e funziona tutto.
Ciao.
                    Francesco Leo 

 ha scritto nel messaggio 
news:498334b6$0$1117$4faf...@reader3.news.tin.it...


Ciao Claudio.
Uso normalmente immagini in campi blob con Mysql, NON LO FAREI MAI CON I 
DBF.
Detto ciň per la programma su una pennetta.
Se il programma legge e basta ok, se deve anche scrivere ricordati di 
disattivare la cache dei dati sulla penna altrimenti avrai continua 
corruzione delle tabelle.
E' un classico che la penna si sfila senza disattivarla. Chi non l'ha mai 
fatto scagli la prima pietra.
Danilo 

 nostro per far crescere meglio Federica.
Ciao,
dovessi relizzare una cosa del genere farei una mediazione di questo tipo:
Nella chiavetta usb e nella cartella dove è contenuto il dbf creerei una 
subdirectory (magari nascosta) dove il prg archivia le immagini o con la 
proprio estensione (ma con un nome che non faccia capire quale immagine 
  é) oppure anche con un estensione incomprensibile (tipo dbj per i jpg 
dbb per i bitmap ecc..)
Il programma provvederà a cercare/inserire l'immagine giusta al posto 
giusto...
Per l'operatore l'uso diventa trasparente al punto che non cambia molto 
   se le immagini sono contenute nel dbf o altrove.
i miei 2 cent
saluti
Andrea

Ciao
Avendo avuto problņemi con i campi memo, non li uso pił (magari adesso 
funzionano bene, non lo so)
Al loro posto ho creato una sottoclasse del dbserver, chiamata DbMemo
In pratica creo un db (con l'editor di VO) a parte, che deriva da DbMemo, in 
cui ci sono 3 campi: uno con la chiave di ricerca, uno di servizio 
(normalmente due caratteri per mantenere l'ordine) ed un terzo di lunghezza 
a piacere di caratteri in cui memorizzare i dati (se ad esempio devo 
memorizzare dati che possono essere normalmente fra 1000 e 100.000 byte, lo 
faccio di 1000 caratteri).
Ho scritto 4 metodi per gestire il tutto ed in pratica, uso la stessa chiave 
di ricerca del mio DBF principale per accedere al dbf dei memo (in cui puoi 
scrivere di tutto).
Se mi sono spiegato e pensi ti possa essere utile ti mando la classe
-- 
Ciao
Alessandro 

 ha scritto nel 
messaggio news:frIgl.169107$Ca.2...@twister2.libero.it...


 ha scritto nel 
messaggio news:Va0il.171562$Ca.3...@twister2.libero.it...


 Ciao, Marco
Ciao,
in effetti il file durante l'esecuzione del test è in sola lettura e non ha 
accessi simultanei,
mentre in fase di modifica del test, proprio per eccesso di zelo, riscrivo i 
file ex novo.
Quindi credo che non dovrei avere alcun problema.
Ciao, Claudio 

 Avendo avuto problňemi con i campi memo, non li uso piů (magari adesso 


Ciao
è una classettina poco sofisticata, che ho scritto di getto per 
risolvere i problemi che avevo con i memo, la posto qui direttamente.
Semplicemente crei un dbf con 3 campi: il primo che ha la chiave di 
ricerca univoca del tuo dbf principale, il secondo un campo testo di due 
caratteri, il terzo un campo di testo della lunghezza che vuoi (lo crei 
sulla base della lunghezza media e massima del contenuto che devi 
mettere e sul limite attuale (ampliabile) che ci possono essere massimo 
3844 record per ogni chiave di ricerca).
Crei un indice sulla primo campo.
Se il tuo DBF si chiama MioMemo
oMioMemo:=DbMemo{"MioMemo.dbf"}
Quindi
oMioMemo:ScriviMemo(Ricerca,Testo)
oMioMemo:LeggiMemo(Ricerca)
Dove Ricerca è il campo (o i campi) univoco del record del tuo dbf 
principale.
Per azzerare un campo basta che fai un ScriviMemo(Riceca,"")
Diciamo che non è un vero memo, ma per quelle che sono state le mie 
esigenze su campi variabili è servito.
Volendo si può fare meglio (anche molto meglio!), ma magari ti è 
sufficiente così come lo è per me.
Ciao
Alessandro
CLASS DbMemo INHERIT DbServer	//serve per leggere e scrivere memo su un 
normale DBF
INSTANCE LenMemoTxt AS DWORD	// lun. del campo testo
INSTANCE LenMemoInd AS DWORD	// lun. del campo indice
INSTANCE 
StringaIndice:="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" 
AS STRING
METHOD CancellaMemo(Ricerca,Start) CLASS DbMemo	//Cancella un memo fatto 
a db Testo
LOCAL Conta:=0
IF ValType(Start)="N"; Conta:=Start; ENDIF
DO WHILE SELF:Seek(Ricerca+SELF:DaiOrdine(Conta++))
	 VuotaRecor(SELF,.T.)
ENDDO
METHOD DaiOrdine(Posizione) CLASS DbMemo	//Scrive in un memo fatto a db 
Testo
LOCAL NuovaPos1:=MOD(Posizione+1,62),NuovaPos2:=Posizione/62 AS DWORD 
//62 è la lunghezza di StringaIndice
*Lg(Posizione,NuovaPos1,NuovaPos2,SubStr(StringaIndice,NuovaPos2,1)+SubStr(StringaIndice,NuovaPos1,1))
RETURN(SubStr(StringaIndice,NuovaPos2,1)+SubStr(StringaIndice,NuovaPos1,1))
METHOD LeggiMemo(Ricerca) CLASS DbMemo	//Scrive in un memo fatto a db Testo
LOCAL Conta:=0,LenTesto AS DWORD
LOCAL Testo:="" AS STRING
Default(@Ricerca,SELF:FIELDGET(1))
IF SELF:Seek(Ricerca)
	DO WHILE SELF:FIELDGET(1)==Ricerca
		Testo+=SELF:FIELDGET(3)
		SELF:Skip()
	ENDDO
	LenTesto:=Val(SubStr(Testo,1,5))
	IF LenTesto>0
		Testo:=SubStr(Testo,6,LenTesto)
	ELSE
		Testo:=RTrim(Testo)
	ENDIF
ENDIF
RETURN Testo
METHOD PostInit(ocFileSpec,lShareMode,lReadOnlyMode,cDriver,acRDDs) 
CLASS DbMemo
SUPER:PostInit(ocFileSpec,lShareMode,lReadOnlyMode,cDriver,acRDDs)
LenMemoTxt:=SELF:FieldInfo(DBS_LEN,3)	// lun. del campo testo
LenMemoInd:=SELF:OrderInfo(DBOI_KEYSIZE)		// lun. del campo indice
METHOD ScriviMemo(Ricerca,Testo) CLASS DbMemo	//Scrive in un memo fatto 
a db Testo
*Deve essere definito LenMemoTxt che definisce la lun. del campo testo
*Deve essere definito LenMemoInd che definisce la lun. del campo indice
LOCAL Conta:=0,LenTesto:=SLen(Testo) AS DWORD
IF LenTesto>0
	Testo:=Str(LenTesto,5)+Testo
	DO WHILE SLen(Testo)>0
		IF !SELF:Seek(Ricerca+SELF:DaiOrdine(Conta))
			InserNuovo(SELF)
			SELF:FIELDPUT(1,Ricerca)
			SELF:FIELDPUT(2,SELF:DaiOrdine(Conta))
		ELSE
			SELF:Blocca()
		ENDIF
		SELF:FIELDPUT(3,SubStr(Testo,1,LenMemoTxt))
		SELF:SBlocca()
		++Conta
		Testo:=SubStr(Testo,LenMemoTxt+1)
	ENDDO
ENDIF
SELF:CancellaMemo(Ricerca,Conta)	//Toglie eventuali residui di un testo 
lungo
SELF:Seek(Ricerca,TRUE)