Word, VBA e Collection Class. Anche VBA ha gli attributi (nascosti)

VBA è il "parente povero" di Visual Basic 6, perchè ha qualche marcia in meno. Ma qualche risultato decente, in termini di produttività spicciola, lo si può raggiungere lo stesso...

Un giorno mi posi il problema di capire le "Collection class". Queste sono classi particolari che avvolgono un oggetto Collection, mantenendone i riferimenti all'interno della classe che li avvolge, e ne espongono proprietà e metodi con un'interfaccia simile, in modo che il codice creda di avere a che fare davvero con una Collection.

 

Implementai quindi una Collection Class in un mio piccolo modello Word (gestiva un indirizzario di nominativi, memorizzati in un database con un formato proprietario) e incontrai subito alcune esigenze particolari.

 

1) definire una qualsiasi proprietà come membro di default di una Classe

In VBA, dove a differenza del VB non esiste la finestra degli attributi di procedura, bisogna esportare la classe, modificare il file .cls in modo da aggiungere la linea che segue alla proprietà che si desidera rendere default della Classe:

 

"Attribute Item.VB_UserMemId = 0"

 

In questo caso, la proprietà Item diventa il membro di default; e il gioco è fatto. Ma bisogna poi ricordarsi di NON salvare il modulo di Classe nell'IDE del VBA, altrimenti si perdono questi Attributi nascosti... chissà perché =o)

 

2) aggiungere il supporto per l'enumerazione degli elementi utilizzando il ciclo "for each"

Come in VB6 si deve creare nel modulo di Classe una funzione piuttosto sibillina:

 

Function NewEnum() As IUnknown

   Set NewEnum = m_myClass.[_NewEnum]

End Function

 

In VBA, non essendo disponibile la finestra di dialogo degli attributi di procedura , bisogna agire come al precedente punto 1 e aggiungere a mano le due linee di 'attributo nascosto' che seguono:

 

Attribute NewEnum.VB_UserMemId = -4      ‘ID routine

Attribute NewEnum.VB_MemberFlags = "40" 

 

Quindi:

(a) create la classe, (b) salvate, (c) esportate la classe, (d) rimuovete la classe, (e) aggiungete manualmente gli attributi come visto, (f) reimportate la classe così editata (e non salvarla più nell'IDE).

 

 

3) salvare di colpo su disco l'intera collezione di elementi (anche detto problema della serializzazione o persistenza dei dati)

In VBA non si può e in VB6 bisogna ricorrere ad artifici (invece .Net prevede la clausola Serializable, se non sbaglio). Purtroppo la property bag (disponibile in VB6) non esiste per VBA (ho trovato bensì degli ActiveX di terzi che ne simulano l’utilizzo, ma volevo una soluzione il più possibile indipendente). Bisogna optare per strade alternative quali recordset disconnessi, xml, file .ini o di testo, file ad accesso casuale (ringrazio ancora Mauro Technical per i suoi suggerimenti di allora). Io non ho ancora risolto questo punto :o)

posted @ domenica 28 ottobre 2007 16:32

Print

Comments on this entry:

No comments posted yet.

Your comment:



 (will not be displayed)


 
 
 
Please add 8 and 1 and type the answer here:
 

Live Comment Preview: