FILESYSTEMWATCHER X WEBBROWSER
Preciso ficar monitorando uma pasta(Isso faço com o FileSystemWatcher), e caso um novo arquivo seja criado nessa pasta eu deveria
imprimi-lo, mas isso sem intervenção do usuário. E o único objeto que achei interessante que imprime(HTML) direto para impressora PADRÃO é o WEBBROWSER.
Acontece que se eu etiver monitorando o diretorio, e encontrar um novo arquivo criado, é necessário fazer uma gambiarra para conseguir imprimir o dito cujo.
Alguém tem alguma idéia melhor e mais eficaz de imprimir um HTML diretamente assim que ele for criado em uma determinada pasta ?????
Aceito sugestões e exemplos, pois tudo o que consegui fazer foi abrir o html no objeto webbroser assim que criado, porém a impressão não ficou direta.
Ah, antes que eu me esqueça, o que ocorre é um conflito de threads.
Citação:ActiveX control [ô]8856f961-340a-11d0-a96b-00c04fd705a2[ô] cannot
be instantiated because the current thread is not in a
single-threaded apartment.
Já tentei algumas soluções que encontrei na net mas sem sucesso.
http://www.macoratti.net/vbn5_ept.htm
ou então trabalhar com delegates diretamente:
http://www.macoratti.net/10/01/threading.htm
http://www.jorgepaulino.com/2008/03/trabalhando-com-threads-multi-tarefas.html
vlw
Citação:ActiveX control [ô]8856f961-340a-11d0-a96b-00c04fd705a2[ô] cannot
be instantiated because the current thread is not in a
single-threaded apartment.
Coloca isso no Load do Form.
CheckForIllegalCrossThreadCalls = False
Citação::
ActiveX control [ô]8856f961-340a-11d0-a96b-00c04fd705a2[ô] cannot
be instantiated because the current thread is not in a
single-threaded apartment.
Coloca isso no Load do Form.
CheckForIllegalCrossThreadCalls = False
Citação::
Para capturar os dados das threads, você poderia usar o backgroundworker para sincronizar esses dados.
http://www.macoratti.net/vbn5_ept.htm
ou então trabalhar com delegates diretamente:
http://www.macoratti.net/10/01/threading.htm
http://www.jorgepaulino.com/2008/03/trabalhando-com-threads-multi-tarefas.html
vlw
Nilson, já utilizo essa propriedade e setada como False.
Já tentei com backgroundworker e tbem não foi.
Já pensei em até fazer um PROG, pois talvez seja mais fácil eu ficar dando um loop num diretorio, e qdo encontrar o bendito arquivo, imprimi-lo, e imediatamente exclui-lo ou move-lo.
vlw
Citação::
FoxMan, coloque a parte do código das threads que está dando conflito pra podermos analisar melhor. Talvez lançando um evento nas threads e captura-las fora seja uma das soluções. Esse tipo de coisa geralmente se resolve utilizando Delegate. é só utilizar o beginInvoker e verificar se o dito cujo está na mesma thread.
vlw
JABA, este é apenas um dos inumeros que tentei , e sem sucesso.Devo ter mais uns 3 projetos com codigos diferentes.
O projeto está todo aÃ, apenas tem um objeto webbrowser neste formulario.
A ideia inicial era criar um Windows Service, mas....não deu. (AINDA)
Dim WithEvents Arquivo As New FileSystemWatcher()
Private Shared WithEvents f As New frmImpressaoBoleto()
Private Sub frmImpressaoBoleto_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Arquivo.Path = [Ô]C:\BOLETO[Ô]
Arquivo.IncludeSubdirectories = False
Arquivo.Filter = [Ô]*.html[Ô]
Arquivo.NotifyFilter = NotifyFilters.FileName
Arquivo.EnableRaisingEvents = True
CheckForIllegalCrossThreadCalls = False
End Sub
Private Shared Sub inFile_All(ByVal sender As Object, ByVal e As FileSystemEventArgs) Handles Arquivo.Created
Try
pathfile = e.FullPath
[ô]teste
[ô]f = New frmImpressaoBoleto()
[ô]f.WindowState = FormWindowState.Maximized
[ô]f.WebBrowser.Url = New System.Uri(pathfile, System.UriKind.Absolute)
[ô]f.WebBrowser.Show()
Dim MyThread As System.Threading.Thread
MyThread = New System.Threading.Thread(AddressOf LaunchForm)
MyThread.SetApartmentState(Threading.ApartmentState.STA)
MyThread.Start()
Catch ex As Exception
MessageBox.Show(ex.Message.ToString)
End Try
End Sub
Public Shared Sub LaunchForm()
f = New frmImpressaoBoleto()
f.WindowState = FormWindowState.Maximized
f.WebBrowser.Url = New System.Uri(pathfile, System.UriKind.Absolute)
f.WebBrowser.Print()
Application.Run(f)
End Sub
kERPLUNK, não consegui testar o exemplo pois não veio duas DLL.
Lembrando que o projeto não consiste apenas em abrir o html e imprimi-lo através de um botão.
A concepção do projeto é checar se um arquivo foi criado , e imprimi-lo automaticamente sem intervenção do usuário.
Eu consigo checar o arquivo, abrir o form com o html montado, apenas jogando o html na pasta desejada, porém a impressão automática somente está ocorrendo
se eu iniciar uma manual, ou seja. Observei que o projeto até funciona, mas teria que dar um [Ô]START[Ô] para que ele andasse sozinho.
Observei também que a impressão não ocorre automaticamente, por conta de o codigo HTML não ter sido totalmente carreado, coloquei uma condição para chamar o print após o carregamento total do html, mas ainda continua com bug.
Ora, imprime, ora não imprime.
O teste pode ser executado com qualquer arquivo html.
Nesse exemplo, ele está criando um novo form, sendo assim, a cada novo html jogado na pasta, vai ser exibido em outro form.
veja ai e nos dê um feedback
vlw
Citação::
FoxMan, vê se é assim que você quer.
Nesse exemplo, ele está criando um novo form, sendo assim, a cada novo html jogado na pasta, vai ser exibido em outro form.
veja ai e nos dê um feedback
vlw
JABA, agradeço pelo retorno.
Então, esse exemplo eu até já tinha feito também, inclusive com o DedoDuro, rsrsrs. Mas tipo, o problema não é abrir o arquivo e exibi-lo, o problema é imprimir sem a intervenção do usuário.
Veja bem, se vc criar um objeto webbrowser num formulario, e setar no load que ele irá abrir tal arquivo, e após o carregamento total do arquivo vc enviar para impressora através da
propriedade .Print(), ele vai para impressora padrão sem mostrar Dialogo com o usuario.
Tipo assim :
Me.WebB.Url = New System.Uri([Ô]c:\boleto\xxxxx.html[Ô], System.UriKind.Absolute)
Me.WebB.Print()
Se a pagina ja estiver sido totalmente carregada será impresso, no exemplo assima não coloquei tal verificação.
O problema de tudo isso até agora é imprimir diretamente assim que jogar o arquivo no diretorio.
Pelo Fom1 que te passei, dá para fazer todo o controle utilizando o seus eventos, pois todo arquivo criado, deletado, alterado, na pasta boleto, vai ativar um desses eventos em Form1 sempre. é só pegar o contéudo ali e mandar imprimir.
vlw
http://www.macoratti.net/vbn5_uwb.htm
vlw