Newsgroup: it.comp.lang.delphi
Titolo: Stampare con CppWebBrowser

Ciao a tutti!
Avrei bisogno di stampare in automatico il contenuto di un file, senza
l'intervento dell'utente, col CppWebBrowser. Il contenuto del file
cambia mediante un ciclo for. Il codice che ho usato è il seguente:
//scrivo sul file
Memo1->Lines->SaveToFile(fileHtml);
//apro il file col CppWebBrowser
Variant vURL = fileHtml;
Variant vFlag = 16;
TNoParam noparam;
Variant vHeaders = Variant(noparam);
CppWebBrowser1->Navigate(vURL,vFlag,NULL,NULL,vHeaders);
//stampa il file
TVariant  I, O;
I = 0;
CppWebBrowser1->ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, I,
O);
Se il ciclo for viene eseguito solo una volta non ci sono problemi, ma
se viene eseguito più di una volta viene visualizzato un errore di
scrittura, secondo il quale il file non può essere creato.
Sembra che il file rimanga in qualche modo bloccato, e che
Memo1->Lines->SaveToFile() non riesca a scrivere.
Ho provato a questo punto a creare dinamicamente il browser, con:
TCppWebBrowser *CppWebBrowser1 = new TCppWebBrowser(this);
Così non ottengo nessun errore, ma la pagina non viene stampata. Mai.
Avete qualche idea su cosa si possa fare?
Grazie mille in anticipo! Ciao!

Ecco un'altro piccolo esempio, col quale ottengo sempre lo stesso
errore: "Cannot create file"
Variant vURL = ordineHtml;
Variant vFlag = 16;
TNoParam noparam;
Variant vHeaders = Variant(noparam);
TVariant  I, O;
for (int i=0; i<2; i++)
{
        Memo1->Lines->SaveToFile(ordineHtml);
        //opre il file
        CppWebBrowser1->Navigate(vURL,vFlag,NULL,NULL,vHeaders);
}
Se invece il for ha un solo ciclo tutto funziona correttamente. Sembra
perciò che il CppWebBrowser1 tenga bloccato il file...
Spero nel vostro aiuto! Grazie!!

 perciò che il CppWebBrowser1 tenga bloccato il file...
non è che il save è asincrono?
A.

Sono riuscito a risolvere il problema dell'errore di scrittura salvando
i dati su un TMemoryStream:
Variant vURL = "about:blank";
Variant vFlag = 16;
TNoParam noparam;
Variant vHeaders = Variant(noparam);
TVariant I, O;
//apre il file
CppWebBrowser1->Navigate(vURL,vFlag,NULL,NULL,vHeaders);
TMemoryStream *stm = new TMemoryStream();
Memo1->Lines->SaveToStream(stm);
IPersistStreamInit *psi;
stm->Seek(0,0);
TStreamAdapter *sa = new TStreamAdapter(stm,soReference);
if
(SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IPersistStreamInit,(void
**)&psi)))
psi->Load(*sa);
delete stm;
//stampa
I = 0;
CppWebBrowser1->ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, I,
O);
- Purtroppo però, risolto questo problema ne spunta un'altro: non
stampa. Alla stampante adesso non arriva nulla.
- Ho fatto dei test per vedere se la causa del problema era il Memo
oppure il CppWebBrowser. Dai test emerge che il problema è dovuto al
CppWebBrowser, che in qualche modo tiene bloccato il file e non
permette al prossimo ciclo che il Memo scriva su di esso.
Spero nel vostro aiuto! Grazie di nuovo!

Sono riuscito a risolvere il problema dell'errore di scrittura e della
stampa in questo modo:
Siccome l'utente deve scegliere ogni quanti minuti stampare, ho
inserito il codice per il salvataggio e l'apertura del documento html
in un evento Timer.
La pagina viene stampata appena viene caricata nel browser, inserendo
il codice per la stampa nell'evento OnDownloadComplete del browser.
Il codice che ho usato è il seguente:
//global variables
Variant vURL = "about:blank";
Variant vFlag = 16;
TNoParam noparam;
Variant vHeaders = Variant(noparam);
TVariant I, O;
//TTimer::OnTimer Event, open html file
CppWebBrowser1->Navigate(vURL,vFlag,NULL,NULL,vHeaders);
TMemoryStream *stm = new TMemoryStream();
Memo1->Lines->SaveToStream(stm);
IPersistStreamInit *psi;
stm->Seek(0,0);
TStreamAdapter *sa = new TStreamAdapter(stm,soReference);
if
(SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IPersistStreamInit,(void**)&psi)))
     psi->Load(*sa);
delete stm;
//CppWebBrowser::OnDownloadComplete Event, print html file
I = 0;
CppWebBrowser1->ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, I,
O);
Adesso il problema è che vengono stampate anche delle pagine bianche,
e mi pare che non sempre vengano stampati tutti i documenti. Forse
questo problema è legato al fatto che lo stream viene creato ad ogni
ciclo??
Ho notato un'altra cosa: dopo il primo ciclo (ovvero l'evento TTimer),
con cui il browser mostra la prima pagina, le altre pagine vengono
mostrate come bianche

Sto pensando che forse sarebbe meglio utilizzare qualcos'altro invece
del CppWebBrowser, per fare quello che mi serve.
Quello che mi serve è un'applicazione in cui l'utente scelga ogni
quanti minuti vuole stampare un report, i cui dati vengono presi da un
database. Forse la soluzione migliore sarebbe utilizzare un
QuickReport, azionando la stampa in modo automatico con un TTimer.
Credevo però che non fosse possibile avviare la stampa in automatico
da un QuickReport...
Qualche idea?