MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA … · Come al solito il titolo dell'articolo...

8
Come al solito il titolo dell'articolo di Francesco Petroni MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA VISUAL BASIC serve per attirare l'attenzione di quei lettori che invece di leggere la rivista con la dovuta attenzione la sfogliano ... svogliatamente. Questi lettori, supposti utilizzatori a vario livello di Visual Basic, che distrattamente sfogliano le pagine di MC e leggono la frase «Mille modi ...», probabilmente pensano «Accidenti, ma i modi sono proprio 1.000? Quanti ne conosco, e quelli che non conosco potrebbero essere utili per le mie necessità?». A chi si è fatto attrarre dal titolo e, bontà sua, ha cominciato a leggere l'articolo dobbiamo subito delle spiegazioni. Prima parte Visual Basic dispone di numerosissi- me funzionalità (istruzioni, metodi, proprietà, ecc., che hanno a che fare con operazioni su file esterni). È possi- bile, per queste funzionalità, tentare vari tipi di classificazione, la prima delle qua- li sicuramente è quella che fa riferimen- to al tipo di file da caricare. Ad esempio, famiglia dei file Testuali: file testuali lunghi, non formattati non strutturati (es. formato TXT) file testuali lunghi, formattati, non strutturati (es. formato RTF) file testuali lunghi, formattati, letti co- me oggetti OLE (es. formato DOC) formati testuali organizzati a «righe» formati testuali semplici omogenei (es. elenco di voci per una lista) formati testuali semplici disomoge- nei (es. elenco di costanti per un file di configurazione) formati testuali strutturati, di tipo «comma delimited», contenenti Dati 332 formati testuali strutturati, di tipo «fixed lenght», contenenti Dati formati ad accesso Casuale (da citare per dovere di cronaca, ma ormai abban- donati) ecc. - famiglia dei file Grafici: formati Bitmap, dei quali conservare le dimensioni e le proporzioni (es. ripro- duzione di quadri) formati Bitmap, dei quali non conser- vare le dimensioni e/o le proporzioni formati Vettoriali, dei quali conserva- re le proporzioni altri formati, accessibili con altri Con- trol non standard, ecc. - famiglia dei file Dati Database (com- posti da Tabelle, Relazioni, Indici, ecc.): formati Dati, accesso via DataControl e normali Controlli (TextBox) formati Dati, accesso via DataControl e Controlli DB (DBGrid, DBcombo, DBList) formati Dati, accesso via tecniche DAO e programmazione tradizionale. Quest'ultima famiglia può essere a sua volta suddivisa in sottofamiglie, distinte per tipologia di Database: formato MS Access, quello standard di VB, raggiunto tramite il motore inter- no JetEngine formato d Base, molto diffuso, rag- giunto tramite il Driver ISAM a disposi- zione formato SQL (o altri). raggiunto trami- te il Driver ODBC. Altra classificazione altrettanto im- portante è quella relativa alla tipologia di Utilizzo (parliamo sempre di programmi con accesso ai file esterni): programmi Gestionali, in cui si preve- dono molte operazioni di aggiornamento, programmi di Interrogazione «sce- mi», in cui le interrogazioni sono sem- pre le stesse, programmi di Interrogazione «intelli- genti», in cui si impostano in modo MCmicrocomputer n. 165 - settembre 1996

Transcript of MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA … · Come al solito il titolo dell'articolo...

Page 1: MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA … · Come al solito il titolo dell'articolo di Francesco Petroni MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA VISUAL BASIC

Come al solito il titolo dell'articolo

di Francesco Petroni

MILLE MODI PER LEGGEREFILE ESTERNI DA UN PROGRAMMAVISUAL BASICserve per attirare l'attenzione di quei lettori che invece di leggere

la rivista con la dovuta attenzione la sfogliano ... svogliatamente.

Questi lettori, supposti utilizzatori a vario livello di Visual Basic,

che distrattamente sfogliano le pagine di MC e leggono la frase

«Mille modi ...», probabilmente pensano «Accidenti, ma i modi sono

proprio 1.000? Quanti ne conosco, e quelli che non conosco

potrebbero essere utili per le mie necessità?».

A chi si è fatto attrarre dal titolo e, bontà sua, ha cominciato a

leggere l'articolo dobbiamo subito delle spiegazioni.

Prima parte

Visual Basic dispone di numerosissi-me funzionalità (istruzioni, metodi,proprietà, ecc., che hanno a che farecon operazioni su file esterni). È possi-bile, per queste funzionalità, tentare varitipi di classificazione, la prima delle qua-li sicuramente è quella che fa riferimen-to al tipo di file da caricare. Ad esempio,famiglia dei file Testuali:

file testuali lunghi, non formattati nonstrutturati (es. formato TXT)

file testuali lunghi, formattati, nonstrutturati (es. formato RTF)

file testuali lunghi, formattati, letti co-me oggetti OLE (es. formato DOC)

formati testuali organizzati a «righe»formati testuali semplici omogenei

(es. elenco di voci per una lista)formati testuali semplici disomoge-

nei (es. elenco di costanti per un file diconfigurazione)

formati testuali strutturati, di tipo«comma delimited», contenenti Dati

332

formati testuali strutturati, di tipo«fixed lenght», contenenti Dati

formati ad accesso Casuale (da citareper dovere di cronaca, ma ormai abban-donati) ecc.- famiglia dei file Grafici:

formati Bitmap, dei quali conservarele dimensioni e le proporzioni (es. ripro-duzione di quadri)

formati Bitmap, dei quali non conser-vare le dimensioni e/o le proporzioni

formati Vettoriali, dei quali conserva-re le proporzioni

altri formati, accessibili con altri Con-trol non standard, ecc.- famiglia dei file Dati Database (com-posti da Tabelle, Relazioni, Indici, ecc.):

formati Dati, accesso via DataControle normali Controlli (TextBox)

formati Dati, accesso via DataControle Controlli DB (DBGrid, DBcombo,DBList)

formati Dati, accesso via tecniche

DAO e programmazione tradizionale.Quest'ultima famiglia può essere a suavolta suddivisa in sottofamiglie, distinteper tipologia di Database:

formato MS Access, quello standarddi VB, raggiunto tramite il motore inter-no JetEngine

formato d Base, molto diffuso, rag-giunto tramite il Driver ISAM a disposi-zione

formato SQL (o altri). raggiunto trami-te il Driver ODBC.

Altra classificazione altrettanto im-portante è quella relativa alla tipologia diUtilizzo (parliamo sempre di programmicon accesso ai file esterni):

programmi Gestionali, in cui si preve-dono molte operazioni di aggiornamento,

programmi di Interrogazione «sce-mi», in cui le interrogazioni sono sem-pre le stesse,

programmi di Interrogazione «intelli-genti», in cui si impostano in modo

MCmicrocomputer n. 165 - settembre 1996

Page 2: MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA … · Come al solito il titolo dell'articolo di Francesco Petroni MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA VISUAL BASIC

estemporaneo le regole di interrogazione.Un'altra classificazione, questa volta

non «Iato dati» ma «Iato Visual Basic»,è quella che si basa, non sul tipo del fileesterno che si deve leggere, ma sul ti-po di Controllo che riceve i campi del fi-le dati.

Per i file testuali:TextBoxLabelListBoxGridcontrolli aggiuntivi non presenti

nella dotazione di baseecc.Per i file grafici:

FormPictureBoxImageBoxGridcontrolli aggiuntivi non presenti

nella dotazione di base.Per i file dati Database:

DataControlTextBoxComboBox, ListBox, Grid, da cari-

care «a mano»DBGrid, DBCombo, DBList, da ca-

ricare automaticamente.Insomma, calcolando tutte le combi-

nazioni possibili tra tipo di file dati, tipodi oggetto che riceve i dati, tipo di appli-cazione, il numero risultante potrebbearrivare (e se non ci arriva non ci arrivaper poco) al migliaio.

Cosaintendiamo fare

Nei numerosi articoli che hanno ri-guardato, più o meno direttamente, ilVisual Basic, abbiamo già trattato qual-cuno di questi argomenti, ma mai inmaniera così sistematica e definitiva.

Data la vastità dell'argomento, dovu-ta al fatto che Visual Basic permettesvariati metodi di lettura di file e dispo-ne di numerosissime istruzioni dedicatea questo compito, lo dividiamo un dueparti. La prima, questa, riguarda la lettu-ra dei file non strutturati, file testuali diqualsiasi tipo (organizzati a campi, orga-nizzati a righe, testi lunghi, ecc.) e di filegrafici.

La seconda parte invece sarà dedica-ta ai file strutturati (ad esempio file informato DBF, in formato Access, ecc.)e riguarderà l'utilizzo C .. anche spregiu-dicato) del DataControl e lo sfruttamen-to della tecnologia DAO.

Realizzeremo una serie di program-mi, dei veri e propri esercizi, che avran-

MCmicrocomputer n. 165 - settembre 1996

no le seguenti caratteristiche:potranno essere sviluppati con Visual

Basic, qualsiasi versione (salvo uno)usano file dati facilmente realizzabili

con il Blocco Note o facilmente reperibi-li in giro

necessitano di un codice molto corto(nel caso peggiore riempie un videata)

sono completamente documentatinelle figure a corredo dell'articolo

ogni figura è un collage che mostracodice, file dati e l'applicazione in fasedi esecuzione.

Insomma chiunque di voi (a menoche non sia colpevolmente pigro) potràricostruire l'applicazione in pochi minuti.Personalmente ritengo questo sistemadidatticamente molto valido, specie conil Visual Basic, nel quale ci sono stru-menti di Debug, sistemi di prova passopasso, ecc. che possono servire per ca-pire ogni singolo elemento che costitui-sce il programma.

Molto utile è il sistema di realizzarel'applicazione un pezzetto per volta, perprovare il funzionamento del singolopezzetto prima di passare al secondopezzetto.

Due chiacchieresul codice VB

È il caso di spendere due parolesull'interesse che sta assumendo il Vi-sual Basic.

Come noto, in attuazione della strate-gia della Microsoft, il Visual Basic sta di-ventando il linguaggio comune di pro-grammazione dei vari applicativi. Que-sto è già vero per Excel, Access eProject.

In termini pratici questo significa va-rie cose, la più evidente delle quali è latrasportabilità del çodice da un'applica-zione ad un'altra. E chiaro però che seusiamo, ad esempio, il codice dell'eser-cizio numero 2 nel Visual Basic di Exceldovremo cambiare tutte le istruzioniche riguardano la visualizzazione dei da-ti, che non sarà più delegata alle Text-Box di una Form VB, ma alle celle di Ex-ce!. Altro discorso, più tecnico, riguardale tecniche OLE di cui parleremo prossi-mamente.

Vai con gli eserciziPassiamo alla parte pratica del-

l'articolo cominciando con una serie diesercizi dedicati alla lettura dei file te-stuali.

Lettura di dati sparsiSupponiamo di aver realizzato un'ap-

plicazione da distribuire a molti utilizza-tori per ciascuno dei quali occorra predi-sporre una specifica configurazione,che riguardi sia aspetti esteriori dell'ap-plicazione, come le famose «preferen-ces», sia aspetti più interni, come le im-postazioni di configurazione.

Ci sono migliaia di modi per risolverequesto problema, uno di questi è quellodi creare un filetto testuale con i vari pa-rametri, da leggere, uno per uno, allapartenza dell'applicazione.

Si può trattare di parametri di tipo te-stuale, oppure di tipo numerico.Nell'esercizio, documentato con listatoe Form in figura 1, ve ne proponiamoun esempio. Vediamo, in basso nella fi-gura, il file testuale, a sinistra il pro-gramma di lettura, a destra il risultatoottenuto.

Le istruzioni fondamentali sono:Open <nomefile> For Input

As #l per aprire il fileInput #1, A per leggere il valore

che viene assunto dalla variabile AClose # 1 per chiudere il file aperto.L'istruzione Input provoca l'automati-

co posiziona mento sul dato successivo,cosicché non occorre scrivere una istru-zione di spostamento. Quindi

Inpu t # 1, A, B che legge due va-lori ed è identica alla

Input #1,AInput #1, B

Lettura di un File«com ma delimited»

Quando si parla di lettura di file in ge-nere ci si riferisce alla lettura di un filedati.

Il problema diventa quello di scriverele istruzioni in modo che siano adatte aifile in lettura.

Uno dei tipi più utilizzati di formato fi-le è quello cosiddetto «comma delimi-ted», nel quale i vari campi sono sepa-rati da virgole e nel quale le stringhe so-no racchiuse tra virgolette (in basso adestra nella figura 2). In questi casi oc-corre preparare una istruzione Input conuna sequenza di variabili adatte alla se-quenza dei campi.

Altro problema è quello di leggere viavia tutte le righe e di fermarsi quando lerighe sono finite.

Quando le righe sono finite può es-sere rilevato dalla funzione logicaEof(l), che restituisce il valore True

333

Page 3: MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA … · Come al solito il titolo dell'articolo di Francesco Petroni MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA VISUAL BASIC

.Ig'xl

•••31!1T>1fI212J07J8.101l01m06110183001104/85

R••••14l,no

NoooIT •••••P••••

J ~l..ttinl 1iI1l( ..1 fl noh' fIIr;}EJllIodIico '""'" 1

IRossi" "Ro•••" "31/115/82" _56tD: Uerdi'" "Hilan~" "12'"7/84" 561.', Bianchi". "Napoli". '·.1'11/71" .67'"Heri", "Torino" ."116/11/83" ,3_5tDROSi". "PilerlllO·· ••••••1•••'.5 ..,6"0'

Write #1, A

si complica per il semplice fatto che leistruzioni per gestire l'indirizzamentodelle celle della lista sono molte di piùdi quelle che servono per aprire il file eleggere i dati.

L'istruzione Addltem, che vedetenel listato, serve per aggiungere una ri-ga alla griglia senza .. dar fastidio anessun'altra riga.

Altro ottimo esempio di utilizzazionedelle istruzioni di lettura delle righe diun file sequenziale è quando occorraalimentare una ListBox, con il metodoAddltem.

Nell'esercizio, che vi proponiamo infigura 3, vediamo anche come gestirel'inserimento e la cancellazione diItem. Alla fine dobbiamo anche scrive-re, nello stesso file che abbiamo letto

Leggere un elencodi voci da un file

all'inzio, il nuovo elenco.Le cose da vedere sono, oltre alla

solita routine di lettura, la simmetricaroutine di scrittura:

Open <nomefile> Far OutputAs #1

Close #1E le varie proprietà che consentono

di scorrere e di leggere tutte le righedella Lista:

LI. ListCount che fornisce il nu-mero degli elementi della lista.

LI, ListIndex che legge o impo-sta il progressivo della lista.

MCmicrocomputer n. 165 - settembre 1996

x "'4""9'*;; •• "_IAcliv •••

"

$"".E•••••

Private Sub Form_.lctiva1:e OG.ro •.•• O

G.col •• O: G •• "Prçr."G.col •• 1: G •• ~ome"G.col •• Z: G •• "Sede"G.col •• 3: G •• "Data"G.col •• 4: G •• "Imporeo"G.Col1l1gnmene (4) •• 1Open "c:\vvvv\daeiOZ.exe" 'or Inpue .lR • 1Do Vhlle Not [O, (l)

lnput #1, cl, C2, C3, C4G•.••dcUeem Chr(9)G.rov" RIt R •• 2 Then G. '1xedP.ovs .• 1G.eol - O: G •• RG.col •• l: G" clG.col •• 2: G •• C2G.col •• 3: G •• C3

G.col •• ~: G" 'ormae(C4, "','110"R-R+l

Loop

Close '1[nd Sub

• IlAI*rrs-oIalU9 I

II

"

~..!J.J.

,!g'xl

Figura l -VB4 - Un faci-le sistema per creareun File di Inizializzazio-ne.Supponete di doverrealizzare un 'applicazio-ne da distribuire a deci-ne di utilizza tori e cheogni copia di questa ap-plicazione debba esse-re personalizzata. Sipuò prevedere la me-morizzazione dei varielementi che contraddi-stinguono la singolapersonalizzazione in unfile testuale, facile daconfezionare, anchecon un normale editor,facile da leggere allapartenza del-l'applicazione. Si posso-no memorizzare ele-menti testuali, caratteri-stiche fisiche ed esteti-

che della personalizzazione, ed altro ancora.

Figura 2 - VB4 - Lettura di un file testuale di tipo"Comma Delimited".Quello che vedete inbasso a sinistra è unfile "comma delimi-ted". Contiene record(la riga) e campi. Icampi sono separatida virgole, i campi al-fanumerici inoltre so-no delimitati da virgo-lette, i campi numericiinvece no. La routinedi lettura, basatasull'istruzione Open, èin grado di leggere ivari campi separandoligli uni dagli altri.

Per Inizi••• Digitale la Pu_rdpoi Preme,. il PuI.ante

"I

Input J.s 111 ~

Private Sub Cl ClietOL1. AddIenl T'i

End SubPrivaee Sub C2 Clietl)

L1.Removett.~ L1.L1aelndexL1.Liat.lndex •• O

[00 SubPrivat.e 3ub C3 Cl1ckOOpen "e:\ ••• v\dat.103.txe" Tar Ouepue J.a '1R •• C: S •• L1.L1aeCoune - lDo WhUe R <- S

L1.Liaelndex •• RVriee '1, LI: R •• R + 1

Loop: Cloee 111[nel SubPrivate: SU):) 'orm LoadOOpen "e:\vvllv\ctati03.ext." Tor Inpue "'8 *1Do Vhlle Noe lO' (1)

Input 111, .••: L1..lddIt.em 1Loop: Clo.e '1[00 SubPrivaee Sub Ll_CHekO

TI •• Ll: T2 •• Ll.L1selndexT3 •• L1.L1seCount

End Sub

-IAdiv •••

Eof(l)B, C,

Private Sub Form .1ctivate()Open "c:\vvvv\datiDl.txt" For

Input 111, cl, eDInput 111, c2, eDInput 111, c3, eDInput #1, R, eDInput 111, G, eDInput #1, B, eDInput #1, c7, eD

Close 111rt.Cap1:ion - clLI •• c2: Pl.Caption •• c3Fl. BaekColor •• ROa (R, C, BITI. Setroeu~[nd Sub

Figura 3 - VB4 - Caricamento e gestione di unaLista per una ListBox.Supponiamo che in un'applicazione occorra sce-gliere un elemento dauna lista non moltolunga (max. qualchedecina di componen-ti). In questo caso puòessere convenientememorizzare gli ele-menti della Lista in unfile Testuale, sempli-ce da costruire, sem-plice da memorizzaree semplice da caricareall'occorrenza. Anchenel caso in cui occorraprevedere di aggiun-gere e/o togliere ele-menti lo si può farefacilmente, realizzan-do una semplice routi-ne di scrittura, sim-metrica rispetto aquella di lettura.

_··eMn,i'liM'i;'.!.!i.fio 1lI- taca 1

: ::::~t~~~:i=~~S:~:~~~;:T~~O~:S:~:~~C:~~O~~:lter. il Pulsante", "CapUon deH ~ I'''Inizia Cestione Personale", "CapUon del Pulsante" I"255" •"Colore Rosso"

, "255" •"Colore Uerde""r'. "Colore Blu""XVZ". "Password"

quando i dati sono finiti. La struttura delprogramma diventa quindi.

Open <nomefile> Far InputAs #l

Do While NotInput #1, A,LoopClose #1Questo programma legge, in modo

sequenziale, tutti i dati, dal primo all'ul-timo. L'errore più frequente si verificaquando si cerca di leggere i dati quan-do questi sono finiti. L'errore è Inputoltre la fine del File (nella versione ita-liana di Visual Basic).

Il problema immediatamente suc-cessivo è quello di decidere cosa faredei dati letti.

Se si decide, come nel nostro caso,di scaricarli in una griglia il programma

334

Page 4: MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA … · Come al solito il titolo dell'articolo di Francesco Petroni MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA VISUAL BASIC

5, è il FixedLenght. Per leggerlo si usa-no i sistemi visti fino ad ora, con la sem-plificazione che si legge una sola varia-bile e con la complicazione che questariga va scomposta nei vari campi (l'orga-nizzazione della riga va conosciuta). Perfarlo basta usare la funzione Mid.

Nell'esercizio, di cui vi mostriamo lasoluzione, leggiamo una sola riga, e lalettura della riga successiva la eseguia-mo al Click sul pulsante con la freccia.

Vale la pena di ricordare che nei filesequenziali ... non si torna indietro.

La caratteristica principale del file se-quenziale è che si legge dal primo re-cord fino all'ultimo senza possibilità ditornare indietro.

AI massimo si può cadenza re, comein questo caso, la lettura, oppure, rag-giunto il record desiderato, si può inter-rompere la lettura.

x Figura 4 - VB4 - Lettu-3 ra delle righe intere.• In altre situazione oc-

corre leggere le righeintere. In queste righele virgole non debbo-no essere interpretatecome separa tori macome componenti deltesto a pieno titolo,così come gli altri ca-ratteri ... strani. Nel ca-so di una composizio-ne in versi la riga as-sume una sua indivi-dualità al punto chepuò essere caricata,con le altre, in una Li-stBox che dispone diuna sua proprietà percontare le righe e persapere quale è la rigaselezionata. Non ap-profitta me, per sape-re quale sia il versodel Primo Canto

dell'Inferno su cui ci si è posizionati, sarebbe undelitto.

Sub 11 Cl1ck() "Ui;;!6'lI.iji4iWt .lp'xl1. Lbtlndex + 1

Nelmeuodelc«rtnindnoltJawa ] l"'; ISub Pl Cl1ck() miIiJO\Iaipell.na~aow.n\ vvuv\ iÌÌte:rno. tx!;." ~ ~~ :d.et~'":':: cosa cba'or Input Alli #1 Ver$i 136r chenelpen:Aer mova la paual V"no 5e Not lOr (l) T ari'è atnaI'i1che poco è piJ tl'lOfte;.Input #1, o ma peIbatta' del ben chi vi bovai, Cafau.eri 520JA.ddItem '"

cirò de r~ll~ cose ch'i"v'ho 1'COft&lo non *0 ben ,idi cctni vrtlai,

tant'era pien di sorno a ~ j)l.I'lto1 chela Veface 'o'iaabl:J.vldonal, Ll:!1tCount Ma poi ch'i"hA al pe <fili coIe gUto.leLen (f) lAdove lenn;"la.•.a quelli .•.•

CM m'cW8aci paura ilCOICOfT'ClU'llo,guardai in i!Ilo, e vidi le Ne spaIe

.:.J'1I1M_M'Pi;',!,!! .Iq'xlfio l!lodlico l;olco 1

Nel -.ezzo del calltfl'l1ndi nostra uita ::jrlli r'itrovai per una selva oscurachf la diritta uia era sllIar,.1ta.

Ah! quanto a dir qual era è cosa duraesta selva selvaggia e aspra e forteche n@} pensier rinava la paura'

Tant'è a.ara che poco è più IIOrte;

~.1 1

Privatee:4 • l

[nd SubPrivatef • "c:Open f11.Cle:aDo Vhll

L!nll.

LoopClollie Il[2 • 11l6 • Fi[nd Sub

Lettura di un File FixedLenght

Altro formato molto diffuso, per varimotivi citati nella didascalia della figura

carattere CR (Carriage Return, o più ba-nalmente Andata a Capo).

Se le varie righe si caricano in una Li-stBox è possibile, in un certo senso,conservarne il numero progressivo, inquanto il numero della riga corrispondeal valore della proprietà Listlndex (+ 1,s'intende, in quanto l'indice parte da O)della Lista. Lettura di un File

formattatoIn Windows 95 il formato RTF, Rich

Text Forma!, per i file testuali diventamolto importante.

Detto in parole povere è un formatoin cui oltre al testo viene memorizzata

Letturadi un File lungo ...

Ecco ora la lettura di un file testualeeseguita ... tutta di un colpo. L'intero fileviene letto tutto insieme e trasferito suuna variabile di tipo stringa, opportuna-mente dimensionata. L'istruzione di let-tura è la:

Input <nomefi1e> For Binary #1Get #l, , AC10se #1Il parametro mancante nell'istruzione

Get è quello che permette di leggere ilfile a partire da un certo carattere. Lavariabile A va dimensionata opportuna-mente, es.

Dim A As String*20000significa una stringa lunga di 20.000

caratteri.Esiste anche una funzione LenFi-

ne«nomefile» che riporta la lunghezzadel file, in byte, e che può essere usataper dimensionare esattamente la varia-bile.

Il limite teorico di tale procedimentoè di 64kbyte, mentre quello pratico, chedipende anche da altri fattori è di circala metà.

x

.!p'x'

...,..I09840PALlIl.KO19670103GULLI A

~ IPALER~O lA131107161 -IGIAlU----

'1610001.0.6

~11I~'!!·M~h~!.~dl!l:i!!8~9I1;;ll!.IIl1!!i!!II •••• [;.Jilg~l[lxilllfio l!lodlico l;olco 101213ROHA 1975 •.••02ROSSI AU3"'2HllAHO 19828123UERDI 8U••30210RIHO 19691123tlERI CU98"8PAlERI1O 196781113GIAlLi A8"39"PISA 19788516HARROHI AI

Input Alli 111

Dibl R A.llIStri • 32Pr lv_te Sub Form Load l)

Open "c:\vvvv\datl0S.txt" forInput #1, R: :!Icrivi

[nd SubPrivate Sub Pl Cl1ck (I

Input #1, R -It IOf (1) The:n

ft3qBox "DATI TER!lINATI"Clo3e IH

Ellllescrivi

[nd It[nd SubSub llIcrivi ()

TO • R1;.1 • !UdIR, l, S)T2 • RidIR, 6, 8lT3 • IUdIR, 31, 1)Y • Ve.\l f"id(R, 14, il)l! • "id(l8, 2) • 1D • IUd(20, 2) • 1Ti· DateSe:r1al(Y, !I, D)TS • "idlR, 22, 8)

lnd Sub

Figura 5 - VB4 - Lettura del formato Fixed Len-ght.Questo formato deve la sua (immeritata) famaal fatto che è un formato facilmente prodottodai Mainframe e datutti i programmi distampa che permetto-no di stampare su fileanziché su carta. /Iprogramma riceventedeve affrontare il pro-blema (peraltro facileda risolvere) di scom-porre la riga nei suoipezze t ti, ovvero neivari campi. Owiamen-te occorre conosceref' organizzazione del fi-le (in termini tecnici sichiama struttura delrecord).

Letturadi righe intere

Abbiamo visto come sia possibileleggere un file «comma delimited». Inaltri casi la virgola non è un separatoredi campi ma va letta come un qualsiasialtro carattere.

Vi proponiamo la lettura della DivinaCommedia, che è piena di virgole e dialtri caratteri strani, come accenti, apo-strofi, ecc. In questi casi l'istruzione piùindicata è la:

Line Input #1, Ache legge la riga tutta intera, fino alla

fine della riga stessa, identificata da un

MCmicrocomputer n. 165 - settembre 1996 335

Page 5: MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA … · Come al solito il titolo dell'articolo di Francesco Petroni MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA VISUAL BASIC

consente, sostanzialmente, di riferirsiad una sola variabile anziché al recordcompleto.

Ad esempio RV è la variabile «re-cord», RV.Cognome è la variabile«campo».

Nell'esercizio, che vi proponiamo per«toccare con mano» l'argomento, fac-ciamo tre cose:

leggiamo il nostro file sequenziale elo trasferiamo in un Array

lo trasferiamo dall'Array al file Ran-dom

ne permettiamo lo scorrimentosfruttando una ScroliBar i cui limiti so-no 1 (quello minimo) e il numero di re-cord scritti (quello massimo).

Le istruzioni le trovate riportate inte-gralmente nella figura, mentre il file da-ti è lo stesso dell'esercizio di figura 2.Rieseguendo l'esercizio ne capirete tut-

te le implicazioni.

.!p'xl

Co.e utilizzare questo docUllento

IC""1N95\CONAG. TXTIc"@Rd1ile Le991•.1 di IUcro.ott Windows95 per i co-..ndi d1 1'I'-.D05 di ConU9 .• Y.

-'9o.tO 1995

(c) Copyri'iJhtl'Iicl'o.ott Corporation, 1995Que.to docu.ento contiene intora.sioni a9'9'iuntive o e.tre._ente recenti

che coapletano la docuaentasione di Microsott. Windows 95.

Pr1vat.e Sub Pl_Cl1ckl)Dhn a .ls St.r1nO' S 32000cd.FUt.er • HFUe Tel!!lt.ual1 (s.t.xt.)ls.TXTIH

ed.ln1t.D1r • He: \ ,,1095": ed . .l.ct.1on· 1Open ed. tUename For Blnary 1.l!!I#1

Get. #1, , aClol!!le '11

1'0 • at.l • UCal!!Ie(cd.tilename): T2 • FUl!Len(cd.tllename)

[nd Sub

NdIMM,m".èFigura 6 - VB4 - Lettura di unfile lungo ... ma non troppo.Ulteriore problematica è quel-la che riguarda la lettura di unfile testuale testuale, da leg-gere tutto in blocco, senza se-paratori né di campo né di ri-ga. Esiste un 'apposita varian-te del comando Open (OpenFar Binary) che trova il suo li-mite nella dimensione dellavariabile alla quale passare ilfile testuale.

Ai tempi dei primi Basic esistevanosolo due modi per accedere ai Dati, ilprimo dei quali è quello visto fino ad

anche la formattazione (attenzione deltesto, non della pagina). WordPad, adesempio, salva in formato RTF e VisualBasic legge (e visualizza) tale formato inun apposito Controllo, che si chiama Ri-chTextBox, che dispone, tra le altre co-se, di un apposito metodo:

RTBox,LoadFile«nomefile»,rtfRTF

Lettura delcontenutodi una Directory evisualizzazionedei file Grafici

Un esercizio facilissimo darealizzare ma molto spettacolareè quello che mette insieme ilcontrollo File, quello che mostrauna lista di file di una directory(ma che è una Lista a tutti gli ef-fetti), e un controllo Picture che,con la sua funzione LoadPicture,è sempre pronto a visualizzareun'immagine.

Neli' esercizio, propostovi in figura 9,vediamo tre cose:

ciò che serve a fare in modo che lalista File punti una Directory con dei filegrafici (proprietà Path e proprietà Pat-tern), come fare a visualizzare nella Pic-ture il file il cui nome è puntato nella li-sta File,

una routine, eseguita dal pulsanteScorri Tutti, che esegue un ciclo chepunta via via tutti gli Item della lista eche li fa vedere nella PictureBox.

Va precisato che l'evento Click suuna lista si ottiene sia, ovviamente, fa-cendoci click sopra, sia spostandosi sue giù nella lista con i tasti freccia, siaimpostando dal fuori il numero del-l'ltem da puntare (ad esempio l'istruzio-ne L1.Listlndex = 3 produce un eventoL1.C1ick).

Figura 7 - VB4 - Lettura di un fi-le RTF.Uffa, che noia .. occorre impara-re un nuovo formato! UsandoVisual Basic 4 in modalità 32 bit(la versione per Windows 95quindi) è possibile utilizzare unnuovo controllo, la RichText-Box, che permette di caricareun file in formato RTF, quindiun testo formattato. E chiaroche per poter sfruttare benequesto nuovo oggetto occorreconoscere le possibilità offerteda questo controllo e occorreconoscere quali siano le carat-teristiche "internai" del forma-to RTF. Ad esempio pare che ilformato RTF non contenga lespecifiche relative alla formatta-zione della pagina, ma soloquelle relative alle parole e aiparagrafi. Questo significa cheoccorre formattare localmentela RichTextBox.

x

ora, con le sue numerose varianti, chesi chiama accesso Sequenziale perchécomporta la lettura di tutti i dati, nelsenso che non si può leggere il secon-do se non si è letto anche il primo.

Insomma anche se si desidera rag-giungere il milionesimo, occorrere leg-gere i primi novecentonovantanovemilae rotti.

L'altro sistema è l'Accesso Casuale.Si può leggere un record indipendente-mente da tutti gli altri a patto che se neconosca l'indirizzo (costituito da un nu-mero identificativo), si conosca la lun-ghezza, che in questo caso deve esse-re fissa, del record e che si dichiari lastruttura del Record.

Questa dichiarazione va fatta in unModulo BAS e si basa sulla definzionedi una variabile di tipo RecordType che

• PerVÌSlJalilllre questo file. ingrandire la finestra delBlocco note alle massime dimensioni.

• Per stampare qulSto lile. aprir10nel Blocco note o inun altro programma di elaborllionelesti,quindisc.gliere Stampa dal menuftle.

Qutito docum,nto conti,nl informazioni aggiuntiw oestremamente reCinti che completano ladocumentazion, di Miertsoft lindns.

Come utiliuart questo documento

LEGGIMI di Microsoft Windows 95sulla connessfone a Inleroe!

Agosto 1995

(c)CcWfgIIt_~, f995

SOMMARIO

.!:l' Pto_IoGuicle.p_F1

'!c'xl JJ

fio"-RTF

Questo documento contiene mformllioniaggiuntive oestr,mamenter.c,ntichecompl,tanoladocumentationedi Mic,uott .in4 •• s.

Com,vtilillire questo documento

SOMMARIO

LEGGIMI di Microsoft Windows 95sulla connessione a In!eroe!

Agosto 1995

(c)CcWfgIIt_~, f995

• Pervisualiuar, questo fil., ingrandire la finestra delBlocco note alle massime dimensioni.

• Per stampar, questofit •. aprirlonel Blocco note oinun altro programma di elabomionetesti,quindisc.gliert Stampa dal menu File.

• Perché Interneté ccsìpopolare• Come connettersi ad Intemet• Note• Servi li in linea· Dove trovare il file Msie.exe

Nd'.d·didnMUI';

Lettura di un Filead AccessoCasuale

336 MCmicrocomputer n. 165 - settembre 1996

Page 6: MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA … · Come al solito il titolo dell'articolo di Francesco Petroni MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA VISUAL BASIC

x

x •

Typ. RTJJoa. As St.rinq • 8Sed As Stnnq - 8Dee As DateIap As Currency

E.nd Type ~

~

SaMRa'dom

.".1:1:, .!q'x'0_ lt-aIe' .:.

JVEROI

IMllANO

nel successivo esercizio. Si legge il file,che contiene, in un certo senso in ma-niera codificata, i dati necessari per rea-lizzare un Diagramma.

Nel file dati di esempio (sulla sinistrain figura 11) abbiamo inserito alcuni Te-sti fissi, in pratica i vari titoli, e poi i duevalori (4 e 4 nel nostro esempio) che in-dicano il numero delle Serie ed il nume-ro dei Valori per Serie.

La routine di lettura, dopo ciò che ab-biamo visto fino ad ora, non presentanessuna difficoltà. Passiamo, ma soloper poter controllare meglio i dati, peruna Griglia, e poi realizziamo il Diagram-ma finale.

La scelta del tipo di grafico invece lafacciamo non leggendo un dato dal file,ma dalla nostra applicazione, proponen-do la lista dei tipi permessi dal ControlloChart.

In pratica proponiamo un'integrazio-

x

.!q'x'

Da D lO 4 RV 15 RT'uvate Sub Cl_Cl1ct()R. O: Open "C:\wwv\dat.108.TXr' for lnpue As lDo Whill!: Not EOr(l)

Input Il, Al, A2, A3, A4D(R, O) • Al: D(R, Il • A2D(R, 2).1.3: D(R, 3).14: R· R+ l

Loop: CtOSI!: Il: H.Bin • 1: H.llax • R: LO • RtxnSubEnd Sub'[1vate Sub C2_Cl1ck()Opeo "C:\vvw\d8t.108.dat." For Randoa A.:I l Len • 32For J • O To LO - l: R • J + lRY.Xoa. D(J, O): RV.Se:d. D(J. l)RV.Dee • D(J. 2): RV.Iap • D(J, 31Put Il, K. RV

Ne:xt J: Close: Il[nd SubPcivate: Sub H_Chanqe:(1LO • HOpen "C:\IIVWV\dati08.do.t" for Randoa As l Len • 32~t Il, H. RV: Close 'lTO • UCa:le(RV.Jfoa): Tl • UC~e(RV.'ed)T2 • TO[JLat(RV.Dee, "dd/D/n"')T3 • FOULat(RV.Iap, "',110")End Sub

Figura 8 - VB4 - Lettura di Filead accesso casuale.Ogni volta che si parla di ac-cesso ai file non si sa se parla-re anche di questo metodo diaccesso, oggi assolutamenteimproponibile (le tecniche ba-sate sul DataControl e suDAO sono ben più efficenti).Poiché era presente già neiprimi Basic è stato sicuramen-te lasciato per garantire lacompatibilità con precedentiprogrammi. Per poter accede-re direttamente ad un record,senza dover leggere necessa-riamente tutti i record prece-denti, occorre che il file abbiauna struttura fissa, che questasia dichiarata in un file di tipoModulo (BAS) e che ne sia di-chiarata, nelle istruzioni diapertura, la lunghezza. In que-sto esercizio, che legge il Se-quenziale e scrive il Casuale,usiamo lo stesso file dati usa-to nell'esercizio 2.

Pnvau: SUb Cl_Cl1c.lr: () • 5COU:l tuttl.

For I •. o To LI. L1stCO\D1t - lLl.ListIndu •. I

Next I

L1. L1stlndex • o "B.Ii!',n'[nd SubPrivate: Sub rora_Load(l

Ll.Pattern •.. ·.vat. ..Ll.Path •. "C:\I!SOYncr\CLIPAR'r"

[nd SubPrivate Sub Ll_Cl1ck()

Ti • Ll.Path + .•, .• + LIPl.Picture • LoadP1ct.ure(TlI

tnd Sub

Figura 9 - VB4 - Com-binazione tra una Listadi tipo File e una Pic-ture Box.Una Lista di tipo File èuna lista a tutti gli ef-fetti, solo che gli Itemmostrati sono File diuna Directory. Dispo-ne di tutte le proprietàe di tutti i metodi diuna Lista normale. Sela facciamo puntaread una Directory checontiene file graficipossiamo fare in mo-do di vederli (i file gra-fici) in una PictureBox,scegliendoli nella listaoppure facendo scor-rere vorticosamentela lista stessa con unciclo.

La funzione LoadPicture può essereusata per alimentare sia una Picture-Box, sia una Image, sia una cella di unaGrid (lo sapevate?). sia una Form.

Vi proponiamo un esercizio che mo-stra come caricare un'immagine in uncontrollo Image (che si chiama L1). sce-gliendola con una finestra Apri File, atti-vata da un Controllo Common DialogBox (che si chiama CD).

Altra sperimentazione proposta nel-l'esercizio è quella sull'evento Resize.

Lo usiamo per ridimensionare l'lma-

Lettura di un FileGrafico e gestionedinamica dellesue dimensioni

x

ge dinamicamente al ridimensionamen-to della Form. Occorre in pratica legarela proprietà Width della Image alla pro-prietà ScaleWidth della Form. Lo stessodicasi per L1.Height e Form.ScaleHei-ght. Il ridimensionamento deve comun-que lasciare libera una zona, in alto nellaForm, per i pulsanti.

Passaggiodi Dati tra File,Griglia e Chart

Un utilizzo nobile delle istruzioni dilettura di un file sequenziale è proposto

Figura IO - VB4 - Caricamentodi file grafico in un controlloImage e suo ridimensiona-mento.Vediamo come caricare un'im-magine in un controllo di tipoImage, utilizzando la Com-monDialogBox File Apri, e co-me variare le dimensioni dellaForm e contemporaneamentequelle dell'lmage. Occorre di-stricarsi tra dimensioni dellaImmagine (come file) dimen-sione della Form, dimensionedell'oggetto Image, sistema diriferimento, ecc. L'evento dagestire è la Resize della Form.

Pcivat.e Sub Cl C11c:1I:IlCD.Filtet • "B1tlf.ap (-.BJ'lP)I-.BJlPI"CD.1n1tdit • "C: WINDOWS"CD.Ac:t1on • lIl. Piewle • LoadP1et.ure (CD. t'ilenue)rOD_Resiz:e

lnd SubPuvat.e SUb C2 CHet()

eslO.i'idtb .-4920eslO.HeiQht • 4600rOD_Resiz:e

!nd •••Pt:ivate Sub Foa_Load()

eslO. Vidth • 4920uiD. He19ht • 4600FOla_Ru1z:e:

[nd SubPrivate Sub rora_Res1z:e ()

Il. V1dtb • eslO. ScaleVidthIl. Re19bt • uiO. ScaleBe1ljJht - 40LI • Il. Vidtb.L2 • Il.He:1qbt

lnd Sub

ii;'Wf'4'ti§f§·

.-•

MCmicrocomputer n. 165 - settembre 1996 337

Page 7: MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA … · Come al solito il titolo dell'articolo di Francesco Petroni MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA VISUAL BASIC

Puvate Sub cl Cl1ck()Op61 "c:\vvvv\dat.111.txt." For: Inpue .\:5 IlG.Col • o: Input 'l, a, b, CG.Rov '" O: G '" a: G.Rov '" 1: G '" b: G.Rov '" 2: G '" CInput Il, 1:[, cc: G. F1xedRovs '" 3For; ne '" l Te cc: G.Col '" ne - l

ror m: '" l Te tIInput '1, a: G.Rov '" nr: + 2: G '" a

Next m:Next neClose: 'lEnd SubPI:1vate Sub C2 Cl1ck ()~.Rov '" O: G.ta1 '" O: D.GuphT1Ue '" GD. Labels '" lD.1IuaSe:ts '" I:t - 1: D.NuaPoinu '" cc - lG.Rov'" 3: For Q '" 1 Te 3: G.Col '" Q: D.LeoendText. '" G: Jll!xt;.FOI: C '" O To cc - l

fOI: R '" l To rt: - 1: G.Rov '" R + 3G.Col '" CIt C '" O nU!n D.LebelText. '" G E.lse D.GuphDaU '" G

Next RNext CD. Dravftode '" 2End Sub

fio lI«ke I;olco"Andaaento Uendit.""Titolo X.."Titolo Y"

--"Rolllta","Milano""Torino""Penne"12.11585"Quaderni •.23_125185..eo••...21.176156"Penne"126215192

~1C2 d - ICIòok

'.&

Figura Il - VB4 - Filetestuale - Lettura inGriglia - Generazionedel Grafico.Ecco un altro esempiodi applicazione delleistruzioni di lettura diun file testuale. Que-sta volta il file è mi-sto, contiene titoli, le-gende, etichette e da-ti numerici necessariper la realizzazione diun grafico a barre. Al-cuni di questi datihanno, nel file testua-le, una posizione fissa(ad esempio i titoli), cisono poi i due numeriindicanti numero di ri-ghe e numero di co-lonne (Serie del grafi-co e Valori per Serie).

E per finire ...un pizzico di OLE

Vi proponiamo, per finire in bellezza,un esercizio nel quale da Visual Basiccreiamo un oggetto OLE di Excel, alquale passiamo dei dati, e al quale pas-siamo dei comandi. Il problema è setutto questo è un argomento fuori temaoppure no.

OLE che c'azzecca con la lettura deiFile?

Il terzo pulsante, il C3, che non ha fi-gure che ne visualizzano l'effetto, aprecome oggetto OLE un file di Excel, esi-stente, in cui c'è una Macro (già scritta)che viene lanciata direttamente dal co-dice VB.

H

Figura 12 - Excel VBA- Riutilizzo della routi-ne dell'esercizio 2 inuna Macro ExcelVBA.Visual Basic sta diven-tando il «linguaggiocomune" di tutti gliapplicativi «interme-di" della Microsoft.Vanno esclusi i pro-dotti Soho (Small Offi-ce e Home) e i pro-dotti evoluti di svilup-po (da Visual C++ insu). Vediamo come lostesso identico codi-ce utilizzato nell'eser-cizio 2 sia riutilizzabilein una Macro VBA diExcel. Vanno cambia-te solo le istruzioniche servono per tra-

sferire i dati letti dal file nelle celle del foglio.

GF

SubESEGUIOOpen ·c\WWWI'o\dati02.t>d" ForlnputAs IlR-l00 While NoI EOF(l)

Inputll. Cl. C2. C3. C4Cells(R. 1) - ClCells(R. 2) - C2Cells(R. 3) - C3Cells(R. 4) - C~Cells(R. 5) - CSR-R-l

Loop00s811EndSub

Dati

B C D ERoma 31/05/82 ~5600Milano 07f12/B~ 56000Nopoli 01/01/77 67000Torino 10/06183 3~500Palermo 0~,IIH/85 60000

IMS S•••• Se<l

123A

1 RossiZ Verdi3 Bionchi4 Neri5 Rose.&7•,

1011121314151&17li

"At

ne tra dati letti da file e opzioni sceltelocalmente e dinamicamente.

Excel VBA come VBIl penultimo esercizio consiste nel

verificare la trasportabilità del CodiceVB in una Macro scritta con il VBA diExcel.

Le istruzioni, che abbiamo riportatein una cornice sul foglio che riceve i datiletti, sono le stesse dell'esercizio 2, delquale abbiamo anche usato il file dati.

Variano solo le istruzioni di visualizza-zione che con il VB finalizziamo ad unaserie di TextBox o ad una Griglia e checon il VBA di Excel indirizziamo verso lecelle del foglio.

x

Opt.10n [xpl1cltDa xl .\3 Ob eccP!:ivate Sub Cl_CHeti)D1a 1 A5 Inte9l!I:

01.& xlchett. As Chatt3et. xl • Cteat.eObject("Excel.Appl1ce.tlon'"xl.Visibie • Ttue: xl.Wotkbooks ••••ddxl.Ranqe("al").Value • Tl.Textxl.Ranqel"a2").Value • T2.Tv:txl.Ranqe("a3").Ve.lue • n.T~txl.Ranoe("e.4").ToraUla. ".sua(al:a3)"xl.Ranqe(",u"I.Cuxt:l!ntReq1on. Select'et xlcbut • xl.Cbut3.1dd()xlchut. T'ype • x13DColwmTOI: i • 30 To 180 Step lO: xlchut.Rot.at.1on • 1: Nl!Xt

!:od SubPrivate Sub C2_Cl1ckll

xl ••••cUveVotkbook.Closl! rall!U!

x1.Qult!nd SubPtivat.e Sub C3_Cl1ck ()

Dia xl .\5 Object., PtoperSt.rlnq As StrinoSet. xl • Cteet.eObject.("!xcel.APpl1cat.ion")xl. V1s1ble • Ttuexl.Vorkbooks.Open r'c:\vvw\esl4.xls",xl. Run ~envenuto"

End Sub

Figura 13 - VB4 - Ma-nipolazione di un og-getto QLE da VisualBasic. Altra frontieraaperta è quella costi-tuita da OLE, ovvero,in Visual Basic, dallapossibilità di incorpo-rare nella propria appli-cazione «oggetti" rea-lizzati con un 'altra ap-plicazione e di gestirlidirettamente comefossero propri oggetti.Vediamo un program-ma Visual Basic che fatre cose. Lancia Excel,gli passa dei valori nu-menò e gli fa realizza-re un grafico tridimen-sionale (che si mette agirare). Chiude Excel.Infine crea un oggettoXL nel quale apreun 'applicazione che asua volta contiene una

Macro che viene lanciata dalla procedura VB.

ConclusioniScusate, appena si comincia a parla-

re di OLE ... mi comincia a far male la te-sta.

Scherzi a parte .. OLE è un altro film,del quale ogni tanto vediamo degli«spezzoni» impressionanti, che perònon ci consentono mai di farei un'ideacompleta ed esauriente, in altre parolesoddisfacente, dell'insieme.

Di OLE dovremo prima o poi parlarea fondo, magari proponendovi anche inquel caso 1.000 esercizi, 1.000 spezzo-ni da montare per avere un film com-pleto.

338 MCmicrocomputer n. 165 - settembre 1996

Page 8: MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA … · Come al solito il titolo dell'articolo di Francesco Petroni MILLE MODI PER LEGGERE FILE ESTERNI DA UN PROGRAMMA VISUAL BASIC

HOBBYTRONICA:IL PRIMO SALONE

DELLA MULTIMEDIALITÀPER LA FAMIGLIA.

DOVE PER TUTTIIL FUTURO

E' IL PRESENTE.

20 - 24 NOVEMBRE 1996TORINO, LINGOTTO FIERE

11Lingotto Fiere

EXPO 2000 S.P.A. - VIA NIZZA, 294 -10126 TORINOTEL. 011/664.4111 - FAX 011/664.6642

E-mail: [email protected]

RISERVATO AGLI ESPOSITORI:Azienda _

Indirizzo. _

Settore Merceologico. _

Tel. _

Fax _