Newsgroup: it.comp.lang.visual-basic
Titolo: VB6-Word Passo da eraly binding a late binding, MA....

Utlizzando i segnalibri, modifico e stampo un doc. word che non deve essere 
salvato (perché rimangano i segnalibri per ulteriori modifiche e stampe).
L'applicazione funziona solo sui pc che hanno Word 11 o versioni inferiori; 
infatti tra i riferimenti ho inserito word 11.
Per renderla compatibile con tutte le versioni di word, sono passato da 
early binding a late binding, ma ora non riesco piů ad evitare il 
salvataggio del documento.. che mi cancella tutti i segnalibri...
Come posso sostituire, nel late binding, questo codice:
objDoc.Close (Word.WdSaveOptions.wdDoNotSaveChanges)
che impediva il salvataggio con early binding?
Grazie!
Romano
Qui sotto ci sono le 2 versioni del codice:
EARLY:
Dim objWord As Word.Application
Dim objDoc As Word.Document
Dim orng As Word.Range
on error goto Errore
Set objWord = New Word.Application
objWord.Visible = False
Set objDoc = objWord.Documents.Add
objDoc.Activate
Set objDoc = objWord.Documents.Open(App.Path & "\mio.doc")
--------
Set orng = objDoc.Bookmarks("aa99").range
objDoc.Bookmarks("aa99").range.Text = FStampaFoglio.Label9.Caption
...eccetera....
-----
objDoc.PrintOut
objDoc.Close (objWord.WdSaveOptions.wdDoNotSaveChanges)
objWord.Quit
Set objWord = Nothing
exit sub
Errore:
....--------------------------------------------------------------------------------------..
LATE:
Dim objWord As Object
Dim objDoc As Object
Dim orng As Object
On Error Resume Next
Set objWord = GetObject(, "Word.Application")
If Err.Number = 429 Then
Set objWord = CreateObject("Word.Application")
End If
On Error GoTo 0
objWord.Visible = False
Set objDoc = objWord.Documents.Add
objDoc.Activate
objWord.Visible = False
Set objDoc = objWord.Documents.Add
objDoc.Activate
Set objDoc = objWord.Documents.Open(App.Path & "\mio.doc")
--------
Set orng = objDoc.Bookmarks("aa99").range
objDoc.Bookmarks("aa99").range.Text = FStampaFoglio.Label9.Caption
...eccetera....
-----
objDoc.PrintOut
objDoc.Close
objWord.Quit
Set objWord = Nothing
exit sub
......

 che impediva il salvataggio con early binding?
banalmente, guarda con il Visualizzatore Oggetti di VB il valore di
quella costante, e utilizzalo direttamente (oppure ridefinisci tu la
stessa costante)....
La cosa migliore sarebbe utilizzare le variabili di compilazione
condizionale per routine come questa, in modo da sviluppare e
debuggare con la comodità dell'early binding ma poi compilare e
distribuire la versione con il late binding; in questo caso le
costanti che mancano come nell'esempio sopra possono essere definite
solo nel secondo caso, ad esempio:
#Const EARLY_B = -1 'ridefinisci a 0 se vuoi il late binding
#If EARLY_B Then
 Dim objWord As Word.Application
 Dim objDoc As Word.Document
 Dim orng As Word.Range
 Set objWord = New Word.Application
#Else
 Dim objWord As Object
 Dim objDoc As Object
 Dim orng As Object
 Const wdDoNotSaveChanges As Long = 0
 Set objWord = CreateObject("Word.Application")
#End If
'tutto il resto del codice è indipendente da late/early, quindi non
hai bisogno di altre #IF
'[...]
'Anche questo funziona in entrambi i casi perchè non sei obbligato a
qualificare l'Enum
'quindi prende correttamente la costante nella libreria di Word o la
tua replica a seconda dei casi.
objDoc.Close wdDoNotSaveChanges

Ti ringrazio per il suggerimento: mi devo studiare il tuo codice... (in 
particolare, non ho capito perché dovrei avere 2 soluzioni diverse per 
sviluppo e distribuzione).
Intanto avevo trovato questa soluzione... che... almeno per il momento pare 
che funzioni:
Sostituisco
'objDoc.Close (Word.WdSaveOptions.wdDoNotSaveChanges)
 con:
objWord.ActiveDocument.Close SaveChanges:=0
(ho tolto il riferimento word) 

Pare proprio che funzioni....
Però se c'è una sessione di word già aperta, con documento non salvato, 
viene stampato il mio doc, viene chiuso, poi mi si chiede se voglio salvare 
il doc della sessione precedente. Se dò sì, salva e chiude word, se dò no, 
chiude ancora word senza salvare...
Penso sia una soluzione accettabile.... 

 objWord.ActiveDocument.Close SaveChanges:=0
Se riguardi bene l'incipit del mio post, ti rendi conto che
(tralasciando il discorso di cui sopra) ti era sufficente un semplice:
objDoc.Close 0 '0 è il valore esplicito di wdDoNotSaveChanges

La tua spiegazione č proprio esauriente. Ti ringrazio tantissimo.
ciao,
Romano