Newsgroup: it.comp.lang.visual-basic
Titolo: stampare file Word

Salve a tutti, vorrei sapere se è possibile stampare un file word
senza obbligare il cliente ad avere il word installato.
Se è possibile sarebbe gradito del codice di esempio...=))))
ciao e grazie
Giacomo

 Se è possibile sarebbe gradito del codice di esempio...=))))
Senza dover scrivere alcuna riga di codice, ne' pagare alcuna licenza,
sul sito MS e' disponibile il "Word Viewer" per leggere e stampare
documenti Word.
E' freeware e MS addirittura ne "incoraggia" la diffusione:
http://office.microsoft.com/downloads/2000/wd97vwr32.aspx
hth
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt

 E' freeware e MS addirittura ne "incoraggia" la diffusione:
Io avevo pensato a wordpad, ma probabilmente non riuscirebbe a gestite
"tutte" le opzioni di formattazione di Word, in effetti...
Una domandina: Word Viewer è utilizzabile come automazione com (in soldoni
"da codice")?
Salutoni
Sergio

 com (in soldoni "da codice")?
Mai provato... ma ne dubito ;)



Magari bisognerebbe fare una prova su un pc senza word ma con word viewer, e
vedere se VB, nell'elenco dei riferimenti, espone comunque qualcosa di
agganciabile... Qualcuno si offre? (tutti i pc sui quali sono autorizzato a
smatettare hanno già installato Word....)
Salutoni
Sergio

Lokar
Giacomo

 lo inserisco nel pacchetto d'installazione?
Lo installi sul pc dove installerai il tuo sw e poi fai una bella shell
con dovuti AppActivate e SendKeys...
Ho provato ad installarlo su una macchina su cui era gia' presente Word,
ma non vi sono riferimenti aggiuntivi per poterlo utilizzare da
codice...



Non è conclusiva, come prova: potrebbe esporre le stesse librerie di
word.....
Se avanza tempo è ho voglia di giocare provo a disinstallare word.....
Salutoni
Sergio

 word.....
E' quello che credo anche io.
Può essere che sia un Word.Application, con tutto l'object model di Word, ma
che semplicemente ignori alcuni metodi, e abbia alcune cose Read-Only.
Ciao
Alberto

 e abbia alcune cose Read-Only.
Ne dubito, anche se alla MS "bevono" [1], per il triplice motivo:
1) Non e' possibile "bevano" cosi' tanto!
2) Non e' possibile che ad un semplice viewer per Word 97/2000 diano lo
stesso nome del riferimento a Word 2000 ovvero Microsoft Word 9.0 Object
Library!(Tantomeno che forniscano le API "cassate" al 90%!)
3) Nessuna delle DLL presenti nella cartella di installazione e'
"linkabile".
Lokar.sempre.piu.convinto
[1] cit. Lupo


> "Giacomo" [...]:

    Non credo tu possa legalmente inserirlo nel tuo pacchetto di
installazione ma puoi distribuirlo e installarlo cosi' come anche tu hai
fatto per te stesso. Semmai il tuo programma potrebbe, all'avvio, verificare
se e' installato e in caso contrario avvisare l'utente ed invitarlo ad
installarlo, magari assistendolo in questa fase lanciando per lui, da
programma l'installazione. (!?)
    Se non sbaglio l'installazione del viewer si "impossessa" di tutte o
alcune estensioni di word, se questo non e' presente. Pertanto se lanci la
stampa con ShellExecute lo stesso codice dovrebbe funzionare sia in presenza
di word che del viewer. Dovrei avere un pc vergine di Office. Stasera provo
poi, se nessuno mi avra' preceduto, ti informo.
--
Ciao :-)
Maurizio
--------
?SPQR(C)
 X
--------

Maurizio
Giacomo

 word ) ?
    In formato doc di word?... OpenOffice?...
    In formato rtf?... Varie applicazioni fra cui la tua...
    ?...


 poi, se nessuno mi avra' preceduto, ti informo.
Option Explicit
Private Enum SW_Enum
  SW_HIDE
  SW_SHOWNORMAL
  SW_SHOWMINIMIZED
  SW_SHOWMAXIMIZED
  SW_SHOWNOACTIVATE
  SW_SHOW
  SW_MINIMIZE
  SW_SHOWMINNOACTIVE
  SW_SHOWNA
  SW_RESTORE
End Enum
' HINSTANCE ShellExecute(
'   HWND    hWnd,
'   LPCTSTR lpOperation,
'   LPCTSTR lpFile,
'   LPCTSTR lpParameters,
'   LPCTSTR lpDirectory,
'   INT     nShowCmd
');
Private Declare Function ShellExecute _
  Lib "shell32.dll" Alias "ShellExecuteA" ( _
    ByVal hWnd As Long _
  , ByVal lpOperation As String _
  , ByVal lpFile As String _
  , ByVal lpParameters As String _
  , ByVal lpDirectory As String _
  , ByVal nShowCmd As SW_Enum _
  ) As Long
Public Function ApriDoc( _
  ByVal PercorsoCompleto As String _
, ByVal NomeDelFile As String _
) As Boolean
  ApriDoc _
    = (ShellExecute( _
          Me.hWnd _
        , "open" _
        , NomeDelFile _
        , vbNullString _
        , PercorsoCompleto _
        , SW_SHOWNORMAL) _
    > 32)
End Function
Public Function StampaDoc( _
  ByVal PercorsoCompleto As String _
, ByVal NomeDelFile As String _
) As Boolean
  StampaDoc _
    = (ShellExecute( _
          Me.hWnd _
        , "print" _
        , NomeDelFile _
        , vbNullString _
        , PercorsoCompleto _
        , SW_SHOWNORMAL) _
    > 32)
End Function
Private Function GetFileName( _
  ByVal FullPathFileName As String _
) As String
  GetFileName _
    = Mid$(FullPathFileName, InStrRev(FullPathFileName, "\") + 1)
End Function
Private Function GetPath( _
  ByVal FullPathFileName As String _
) As String
  GetPath _
    = Left$(FullPathFileName, InStrRev(FullPathFileName, "\") - 1)
End Function
Private Sub Command1_Click()
  Dim sText As String
  sText = Me.Text1.Text
  If (ApriDoc(GetPath(sText), GetFileName(sText)) = True) Then
    Debug.Print "Ok."
  Else
    Debug.Print "Ko."
  End If
End Sub
Private Sub Command2_Click()
  Dim sText As String
  sText = Me.Text1.Text
  If (StampaDoc(GetPath(sText), GetFileName(sText)) = True) Then
    Debug.Print "Ok."
  Else
    Debug.Print "Ko."
  End If
End Sub
Private Sub Form_Load()
  Me.Label1.Caption = "&Documento:"
  Me.Text1.Text = "C:\TEMP\LOL.doc"
  Me.Command1.Caption = "Apri"
  Me.Command2.Caption = "Stampa"
End Sub
    Tutto ok. Eseguito su pc con Office e Word: aperto e stampato con Word.
Su pc senza Office e senza Word: aperto e stampato con WordViewer.
    Penso si debba stare attenti alla versione di doc con la quale si salva.


     Penso si debba stare attenti alla versione di doc con la quale si
salva.
Vediamo se ho capito: con le funzioni che hai postato non utilizzi le
librerie del word processor in modo diretto, chiedi al sistema operativo di
aprire o stampare un determinato file, ed il sistema operativo,
dall'estensione, lo gira a word o a wordviewer a seconda di quello che ha a
disposizione? Se č cosě, potrebbe funzionare anche per tutte le altre
estensioni? (ora che ci penso: č come fare bottone destro del mouse eccetera
eccetera...)
Ganzo.
Salutoni
Sergio

 Su pc senza Office e senza Word: aperto e stampato con WordViewer.
Grazie per averci tolto una curiosità.
Una però mi è rimasta: se anzichè le Api si volesse usare l'Object Model di
Word, la cosa è comatibile?
Sei l'unico che possa darmi una risposta, perchè credo che più o meno tutti
abbiamo un word sulle macchine...
Ciao
Alberto

 tutti abbiamo un word sulle macchine...
    Ok.
Private Sub Command3_Click()
  On Error GoTo erh
  Dim sText   As String
 'Dim oWdDoc  As Word.Document
  Dim oWdDoc  As Object
  sText = Me.Text1.Text
  Set oWdDoc = GetObject(sText)
  With oWdDoc
10  .Activate
20  .PrintOut False
  End With
ext:
  On Error Resume Next
  oWdDoc.Close False
  Set oWdDoc = Nothing
  Exit Sub
erh:
  With Err
    MsgBox _
        (.Description) _
      , vbCritical _
      , "ERR#" & CStr(.Number) & " - LINE#" & CStr(Erl)
  End With
  Resume ext
End Sub
Private Sub Form_Load()
  Me.Label1.Caption = "&Documento:"
  Me.Text1.Text = "C:\TEMP\LOL.doc"
  Me.Command1.Caption = "&Apri"
  Me.Command2.Caption = "&Stampa"
  Me.Command3.Caption = "Stampa &oggetto"
End Sub
    Su pc senza Office e senza Word ma con WordViewer (v. 7.1):
        ERR#438 - LINE#10
        Object doesn't support this property or method.


 Ganzo.
--


         Object doesn't support this property or method.
E se anzichč il GetObject provi ad usare il CreateObject con
Word.Application?
La classe esiste sul PC?
Alberto


Scusa la pignoleria: con questo post mi confermi che quelle routine citate
ottengono l'equivalente cliccare con il bottone destro del mouse sul file in
"esplora risorse", e attivare i comandi "apri" e "stampa", (ovviamente se ci
sono)?
Salutoni

 La classe esiste sul PC?
Private Sub Command3_Click()
   On Error GoTo erh
   Dim sDblQ     As String
   Dim sText     As String
  'Dim oWdDoc    As Word.Document
   Dim oWdDoc    As Object
   Dim sTypeName As String
   sDblQ = Chr$(34)
   sText = Me.Text1.Text
10 Set oWdDoc = GetObject(sText)
20 sTypeName = TypeName(oWdDoc)
30 MsgBox _
       "TypeName: " & sDblQ & sTypeName & sDblQ & "." _
     , vbInformation _
     , sDblQ & sText & sDblQ
40 oWdDoc.Activate
50 'oWdDoc.PrintOut False
ext:
   On Error Resume Next
   oWdDoc.Close False
   Set oWdDoc = Nothing
   Exit Sub
erh:
   With Err
     MsgBox _
         (.Description) _
       , vbCritical _
       , "ERR#" & CStr(.Number) & " - LINE#" & CStr(Erl)
   End With
   Resume ext
End Sub
        "D:\TEMP\LOL.doc"
        [i] TypeName: "Object".
        ERR#438 - LINE#40
        Object doesn't support this property or method.
--


> "Maurizio Borrelli" [...]:

    Scusa. Ho dimenticato la conclusione:
    ... se invece fosse installato Word otterremmo il messaggio:
        "D:\TEMP\LOL.doc"
        [i] TypeName: "Document".
e, se esiste Document, esiste Application.


     Non serve. Vedi sotto.
Beh, in realtà è un po' diverso. Nel senso che col GetObject cerchi di
ottenere un Word.Application.Document, mentre forse ad un livello superiore
(Word.Application) si potrebbe arrivare al documento in qualche altro modo.
Sostanzialmente, sono curioso di sapere se funziona quanto segue:
Dim Wrd as object
Set Wrd = GetObject(, "Word.Application")
Ciao
Alberto

 Set Wrd = GetObject(, "Word.Application")
    Ti accontento.
Private Sub Command4_Click()
   On Error GoTo erh
   Const c_sWdAppClass = "Word.Application"
   Dim lErr   As Long
  'Dim oWdApp As Word.Application
   Dim oWdApp As Object
   On Error Resume Next
   Set oWdApp = GetObject(, c_sWdAppClass)
   lErr = Err.Number
   On Error GoTo erh
   If (lErr = 0) Then
   ElseIf (lErr = 429) Then
10   lErr = 0
20   Set oWdApp = CreateObject(c_sWdAppClass)
   Else
     Err.Raise lErr
   End If
ext:
   On Error Resume Next
   oWdApp.Quit False
   Set oWdApp = Nothing
   Exit Sub
erh:
   With Err
     MsgBox _
         (.Description) _
       , vbCritical _
       , "ERR#" & CStr(.Number) & " - LINE#" & CStr(Erl)
   End With
   Resume ext
End Sub
Private Sub Form_Load()
  Me.Label1.Caption = "&Documento:"
  Me.Text1.Text = "D:\TEMP\LOL.doc"
  Me.Command1.Caption = "&Apri"
  Me.Command2.Caption = "&Stampa"
  Me.Command3.Caption = "Stampa &oggetto"
  Me.Command4.Caption = "A&pplication"
End Sub
        ERR#429 - LINE#20
        ActiveX component can't create object


 ci sono)?
    L'effetto e' quello ma non e' la stessa cosa e potrebbe anche essere
diverso.
    I comandi di cui parli, quelli del menu' contestuale, eseguono quanto
impostato nelle chiavi di registro relative a tali voci del menu'. Nel caso
di Word esamina le voci:
        HKEY_CLASSES_ROOT
            Word.Document.x ' Dove x = versione installata
                shell
                    New
                    Open
                    Print
                    Printto
e le relative dipendenze. Scavando troverai che si arriva a invocare
"Shdocvw.dll" che e' come dire "Shell32.dll". La dll appunto di
ShellExecute. Ma, ripeto, questo e' vero se nessun uomo o programma ha
alterato tali chiavi.
    Mentre ShellExecute *sicuramente* fa quello che deve fare.


         ActiveX component can't create object
Accontentato.
Peccato, però.
Poteva essere una buona soluzione per distribuire sw che richiede Word,
senza obbligare all'acquisto di una licenza, senza dover neppure cambiare il
codice...
Ciao
Alberto

 il codice...
    E' il solito problema della moglie piena e della botte ubriaca. Della
cerchiatura del quadro, insomma.


Maurizio
Giacomo

Maurizio
Giacomo

 ( spero non mi abbia postato 2 volte... )
    L'ha fatto, il malandrino! ;-)


Maurizio