Newsgroup: it.comp.lang.visual-basic
Titolo: [CR] API PEOutputToWindow (lunghino)

Ciao a tutti.
Ho realizzato una piccola funzione che apre un report CR utilizando le
chiamate API invece degli oggetti ocx o dll. Ho notato infatti che usando
questo approccio i GPF sono meno frequenti :P anche se è molto difficile
capirci qualcosa (anche perchè gli esempi che quelli della Seagate
spiattellano nel file developr.hlp non sono sempre funzionanti - e nemmeno
aggiornati, visto che molti contengono chiamate API obsolete). Però la
velocità ci guadagna, quindi...
Questa è la mia funzione (ho messo [...] sulle chiamate ad altre funzioni
che non sono necessarie da mettere e occupano solo spazio :P)
Public Sub subCaricaReport(strFileReport As String, MyRPT As itRPT_Engine)
[...]
    ' Identificatore del PE Engine;
    Dim intPEOpenRes As Integer
    ' Identificativo del Job che verrà aperto sul report;
    Dim intJobNum As Integer
    ' Generico valore di ritorno dalle chiamate API;
    Dim intResult As Integer
    ' Apro il motore crystal; wrummm! :-P (questa è di Franz :-P)
    intPEOpenRes = PEOpenEngine()
[...]
    ' Apro un job sul report passatomi;
    intJobNum = PEOpenPrintJob(strFileReport)
[...]
    Dim TableType As PETableType
    Dim LogOnInfo As PELogOnInfo
    Dim TableLocation As PETableLocation
    Dim SessionInfo As PESessionInfo
    Dim TestTableType As PETableType
    Dim TestLogOnInfo As PELogOnInfo
    Dim TestTableLocation As PETableLocation
    Dim TestSessionInfo As PESessionInfo
    ' Var. in cui metto il numero di tablelle presenti nel report;
    Dim TableCount As Integer
    TableType.StructSize = PE_SIZEOF_TABLE_TYPE
    LogOnInfo.StructSize = PE_SIZEOF_LOGON_INFO
    TableLocation.StructSize = PE_SIZEOF_TABLE_LOCATION
    SessionInfo.StructSize = PE_SIZEOF_SESSION_INFO
    TestTableType.StructSize = PE_SIZEOF_TABLE_TYPE
    TestLogOnInfo.StructSize = PE_SIZEOF_LOGON_INFO
    TestTableLocation.StructSize = PE_SIZEOF_TABLE_LOCATION
    TestSessionInfo.StructSize = PE_SIZEOF_SESSION_INFO
    ' Ottengo il numero di tablelle presenti nel report;
    TableCount = PEGetNTables(intJobNum)
[...]
    ' Adesso comincia il bello;
    ' Devo passare tabella per tabella modificandone le impostazioni in
    ' modo che punti al database passato al motore itRPT.
    Dim i As Integer
    ' Ciclo tutte le tablelle (di cui prima ho ottenuto il numero);
    For i = 0 To TableCount - 1
        intResult = PEGetNthTableType(intJobNum, i, TableType)
[...]
        intResult = PEGetNthTableLogOnInfo(intJobNum, 0, LogOnInfo)
[...]
        intResult = PEGetNthTableLocation(intJobNum, i, TableLocation)
[...]
        'MsgBox TableLocation.Location
        intResult = PEGetNthTableSessionInfo(intJobNum, i, SessionInfo)
[...]
        LogOnInfo.ServerName = App.Path & "\Example\Datavuoto2002.mdb" &
Chr$(0)
        intResult = PESetNthTableLogOnInfo(intJobNum, i, LogOnInfo, True)
[...]
    Next i
    intResult = PEOutputToWindow( _
            intJobNum, _
            "Anteprima di stampa" & Chr$(0), _
            CW_USEDEFAULT, _
            CW_USEDEFAULT, _
            CW_USEDEFAULT, _
            CW_USEDEFAULT, _
            WS_VISIBLE, _
            MyRPT.OwnerForm.hWnd)
[...]
    intResult = PEStartPrintJob(intJobNum, 1)
[...]
    Dim lngTemp As Long
    lngTemp = 1
    Do While lngTemp <> 0
        lngTemp = PEGetWindowHandle(intJobNum)
        DoEvents
        DoEvents
    Loop
    ' Chiudo il job di stampa aperto in precedenza;
    PEClosePrintJob intJobNum
    ' Chiudo il motore PE;
    PECloseEngine
[...]
End Sub
Tutte le chiamate API filano lisce come l'olio (nessuna mi va in errore)
quindi penso che alla fin fine il report riesca a caricarselo.
Però nell'ultima parte di codice (PEOutputToWindow e PEStartPrintJob) non
producono alcun risultato. Nel senso che la funzione PEGetWindowHandle mi
ritorna sempre un valore non zero quindi penso che la finestra di preview
sia stata caricata in qualche modo, però non viene visualizzata per un
qualsiasi motivo del piffero e che non riesco a capire. Da quello che ho
capito il do...loop finale è necessario per attendere che la maschera di
print preview venga chiusa (va tutto in tilt se chiudo baracca e burattini -
PEClosePrintJob  e PECloseEngine - prima di chiudere la maschera di
anteprima di stampa).
Che può essere? E' tutta la mattina che giro per Google ed ho trovato
pochino (anzi nulla - tutti gli esempi che ho pescato sono uguali al mio
codice o son fatti della stessa pasta).
Qualcuno mi da un consiglio prima che io parta in missione punitiva verso la
Crystal? :-)
CiaoZ
SebaMix
P.S. Uso CR 8.0 e VB 6.0 Pro

 capirci qualcosa
:-)))))))))))))
Domanda: perchè chiudi l'engine?
ciao
ugo


Bè lo apro all'inizio della sub e lo chiudo alla fine.
Secondo tè è preferibile aprirlo una sola volta?
...
mhhhh
...
Forse è meglio aprirlo e chiuderlo una sola volta, giusto? :-)
CiaoZ
SebaMix


Beh, direi...   :-)
ciao
ugo