Problemas p/imprimir
Prezados Colegas,
Preciso fazer a impressão de formulários continos através do meu software, como o tamanho da folha do formulário não é A4, Carta, Ofício e etc... eu preciso enviar os comandos direto para impressora para poder informar a qtd maxima de linhas q podem ser impressas por folha p/q ele possa saltar p/proxima pagina corretamente. Eu nunca precisei fazer nada do tipo antes, então pesquisando na rede descobri exemplos de como mandar isso direto p/impressora, exemplos como esse:
AssignFile(Texto,´LPT1´);
Rewrite(Texto);
Writeln(Texto,#27675150);
CloseFile(Texto);
Só q no meu caso, o usuário pode está usando uma impressora da rede, então isso não daria certo, suponho q eu teria q mandar esse código ou algo parecido para o QuickReport q é o q eu uso p/gerar esse relatório, só q não estou tendo sucesso. Alguem sabe como ajudar? Desde já agradeço.
Abçs.
Preciso fazer a impressão de formulários continos através do meu software, como o tamanho da folha do formulário não é A4, Carta, Ofício e etc... eu preciso enviar os comandos direto para impressora para poder informar a qtd maxima de linhas q podem ser impressas por folha p/q ele possa saltar p/proxima pagina corretamente. Eu nunca precisei fazer nada do tipo antes, então pesquisando na rede descobri exemplos de como mandar isso direto p/impressora, exemplos como esse:
AssignFile(Texto,´LPT1´);
Rewrite(Texto);
Writeln(Texto,#27675150);
CloseFile(Texto);
Só q no meu caso, o usuário pode está usando uma impressora da rede, então isso não daria certo, suponho q eu teria q mandar esse código ou algo parecido para o QuickReport q é o q eu uso p/gerar esse relatório, só q não estou tendo sucesso. Alguem sabe como ajudar? Desde já agradeço.
Abçs.
Fabiano_aprendiz
Curtidas 0
Respostas
Fabiano_aprendiz
09/01/2006
Em outro forum me aconselharam a colocar o nome da impressora na rede, exemplo: \\maquina01\espon02 . O problema é o seguinte, como é um software comercial da empresa em q trabalho, ele tem centenas de usuários, q usam XP, 2000, 98, ME e tbm não teria como eu colocar o nome da impressora...teria q ser algo genêrico.
Alguma dica??
Alguma dica??
GOSTEI 0
Anfm
09/01/2006
Crie um arquivo INI com as configurações da impressora, dae qdo vc abrir o sistema vc le esse arquivo e saberá onde que deve imprimir.
GOSTEI 0
Adriano Santos
09/01/2006
Em outro forum me aconselharam a colocar o nome da impressora na rede, exemplo: \\maquina01\espon02 . O problema é o seguinte, como é um software comercial da empresa em q trabalho, ele tem centenas de usuários, q usam XP, 2000, 98, ME e tbm não teria como eu colocar o nome da impressora...teria q ser algo genêrico.
Alguma dica??
Como assim genérico? Você pode guardar o nome da impressora em um arquivo INI ou mesmo em banco de dados e usá-lo no momento da impressão. Pode explicar melhor?
GOSTEI 0
Marcio.theis
09/01/2006
O componente VDOPrinter não iria lhe ajudar ? Dê uma olhada em: http://devres.freeprohost.com/portal/
GOSTEI 0
Fabiano_aprendiz
09/01/2006
Desculpem a minha ignorância, mas não estou entendendo, como disse esse software é comercial e está instalado em centenas de clientes então eu não sei qual o nome nem as configurações de suas impressoras. Mesmo assim daria p/criar um arquivo INI? Como seria?
Agradeço a todos.
Agradeço a todos.
GOSTEI 0
Fabiano_aprendiz
09/01/2006
Ainda não consegui resolver e acho q não soube explicar direito qual a minha dificuldade...fiz o q me disseram, utilizei um arquivo ini para guardar o nome da impressora. Mas mesmo assim não está funcionando. Estou usando o QuickReport p/gerar esse relatório, como devo proceder p/q ele absorva esse codigo:
AssignFile(Texto,´strNomImp´);
Rewrite(Texto);
Writeln(Texto,#27675150);
CloseFile(Texto);
Tem como?
AssignFile(Texto,´strNomImp´);
Rewrite(Texto);
Writeln(Texto,#27675150);
CloseFile(Texto);
Tem como?
GOSTEI 0
Aerreira
09/01/2006
Para pegar a impressora padrão + lista de impressoras do usuário, experimente o código abaixo:
Mas se seu caso é gerar relatório para impressoras matriciais, recomendo RDprint [url]www.deltress.com.br[/url] que faz isso tudo de forma muito mais fácil.
var WinIni: TIniFile; DevList: TStringList; device: string; i, p: integer; begin WinIni := TIniFile.Create(´WIN.INI´); // Get the current default printer device := WinIni.ReadString(´windows´, ´device´, ´,,´); if device = ´´ then device := ´,,´; p := Pos(´,´, device); DDevice.Name := Copy(device, 1, p-1); device := Copy(device, p+1, Length(device)-p); p := Pos(´,´, device); DDevice.Driver := Copy(device, 1, p-1); DDevice.Port := Copy(device, p+1, Length(device)-p); // Get the printers list DevList := TStringList.Create; WinIni.ReadSectionValues(´Devices´, DevList); // Store the printers list in a dynamic array SetLength(Devices, DevList.Count); for i := 0 to DevList.Count - 1 do begin device := DevList[i]; p := Pos(´=´, device); Devices[i].Name := Copy(device, 1, p-1); device := Copy(device, p+1, Length(device)-p); p := Pos(´,´, device); Devices[i].Driver := Copy(device, 1, p-1); Devices[i].Port := Copy(device, p+1, Length(device)-p); // Add the printer to the ListBox comboBox1.Items.Add(Devices[i].Name + ´ (´ + Devices[i].Port + ´)´); // Is the current default printer? if (CompareText(Devices[i].Name, DDevice.Name) = 0) and (CompareText(Devices[i].Driver, DDevice.Driver) = 0) and (CompareText(Devices[i].Port, DDevice.Port) = 0) then ComboBox1.ItemIndex := i; // Make it the selected printer end; WinIni.Free; end;
Mas se seu caso é gerar relatório para impressoras matriciais, recomendo RDprint [url]www.deltress.com.br[/url] que faz isso tudo de forma muito mais fácil.
GOSTEI 0
Fabiano_aprendiz
09/01/2006
O lance de pegar a a impressora eu resolvi usando um arquivo INI. Minha dúvida agora é a seguinte, estou usando o QuicReport p/gerar esse relatório, então não sei como fazer p/q ele receba a informação com o número máximo de linhas q ele deve imprimir por folha.
GOSTEI 0
Aerreira
09/01/2006
Fabiano, ou você usa o QuickReport ou usa o AssignFile/WriteLn os dois juntos não dá.
GOSTEI 0
Fabiano_aprendiz
09/01/2006
Ok, então tem como eu mandar a informação com a qtd de linhas p/o QuickReport?
GOSTEI 0
Aerreira
09/01/2006
No objeto QuickRep você diversas propriedades como page.papersize, page.orientation, page.length, etc, ou dando um duplo clique no objeto form você tem acesso ao Report Settings.
Mas ví mensagens recentes aqui no forum falando sobre tamanho de página que o QuickReport parece que não entende direito... Deram uma sugestão a respeito... procure aqui no forum que achará.
Mas ví mensagens recentes aqui no forum falando sobre tamanho de página que o QuickReport parece que não entende direito... Deram uma sugestão a respeito... procure aqui no forum que achará.
GOSTEI 0
Aerreira
09/01/2006
Complementando... pois acabei não te respondendo:
A quantidade de linhas depende do tamanho da fonte utilizada e do espaçamento entre elas. No QuickReport e qualquer outro do gênero, não existe o conceito de nº de linhas, pois não é fixo como no DOS.
A quantidade de linhas depende do tamanho da fonte utilizada e do espaçamento entre elas. No QuickReport e qualquer outro do gênero, não existe o conceito de nº de linhas, pois não é fixo como no DOS.
GOSTEI 0
Fabiano_aprendiz
09/01/2006
Já chequei o Report Settings, fiz as alterações nas propriedades Width e Length mas não surtiram efeito algum...vou dar uma procurada p/ver se localizo essa sugestão q foi dada aqui no forum. Vlw.
GOSTEI 0
Fabiano_aprendiz
09/01/2006
Continuo apanhando disso...
Pesquisando na net achei a seguinte informação em um site:
´Algumas opções, principalmente em impressoras matriciais, são obtidas através do envio dos chamados ´códigos de escape´ para a impressora (por exemplo, alterar espaçamento entre as linhas (#45), tipo de fonte (18, 23), etc). Em versões 16-bit do Windows, isso não era complicado, mas agora, nas versões 32-bit, o acesso direto ao hardware não é mais possível.
Portanto, para enviarmos caracteres diretamente a impressora, devemos utilizar o ´escape´ chamado ´PASSTHROUGH´ do Windows e enviarmos a informação desejada diretamente.
Na documentação do Win32 SDK este escape é dado como obsoleto, mas enquanto utilizarmos impressoras matriciais que necessitem de ´códigos escape´ para certas funcionalidades, ele será necessário.´
Tem apenas um único exemplo de como usar esse kra, mas como eu nunca tinha visto nem escutado falar eu ainda tenho minhas duvidas. Alguem sabe como mando a informação p/impressora de salto de página através desse Passthrough?
Pesquisando na net achei a seguinte informação em um site:
´Algumas opções, principalmente em impressoras matriciais, são obtidas através do envio dos chamados ´códigos de escape´ para a impressora (por exemplo, alterar espaçamento entre as linhas (#45), tipo de fonte (18, 23), etc). Em versões 16-bit do Windows, isso não era complicado, mas agora, nas versões 32-bit, o acesso direto ao hardware não é mais possível.
Portanto, para enviarmos caracteres diretamente a impressora, devemos utilizar o ´escape´ chamado ´PASSTHROUGH´ do Windows e enviarmos a informação desejada diretamente.
Na documentação do Win32 SDK este escape é dado como obsoleto, mas enquanto utilizarmos impressoras matriciais que necessitem de ´códigos escape´ para certas funcionalidades, ele será necessário.´
Tem apenas um único exemplo de como usar esse kra, mas como eu nunca tinha visto nem escutado falar eu ainda tenho minhas duvidas. Alguem sabe como mando a informação p/impressora de salto de página através desse Passthrough?
GOSTEI 0
Macario
09/01/2006
Não queira tentar com o Quick, pois será perda do seu tempo.
Faça por WriteLn mesmo muito mais facil e rapido.
quanto a impressora. voce deve setar via net use a porta lpt1 do micro que a contem instalada, eu uso desta maneira e não tenho problemas.
:arrow:
Faça por WriteLn mesmo muito mais facil e rapido.
quanto a impressora. voce deve setar via net use a porta lpt1 do micro que a contem instalada, eu uso desta maneira e não tenho problemas.
:arrow:
GOSTEI 0
Aerreira
09/01/2006
Fabiano, se você usar [b:55e504d400]assignfile/writeln[/b:55e504d400] você terá total controle sobre a sua impressora matricial, e bastará enviar códigos ASCII para que ela seja configurada. Naquele mesmo exemplo que você citou
Writeln(Texto,#27675150);
você já está enviando códigos de configuração para a impressora ´ESC + C + 3 + 2´, não precisa de passthrough para enviar códigos dessa forma. O que você vai precisar é de um guia de comandos para sua impressora.GOSTEI 0
Fabiano_aprendiz
09/01/2006
aerreira escreveu:
você já está enviando códigos de configuração para a impressora ´ESC + C + 3 + 2´, não precisa de passthrough para enviar códigos dessa forma. O que você vai precisar é de um guia de comandos para sua impressora.
Só q a impressora não está obedecendo a esses comandos...
você já está enviando códigos de configuração para a impressora ´ESC + C + 3 + 2´, não precisa de passthrough para enviar códigos dessa forma. O que você vai precisar é de um guia de comandos para sua impressora.
Só q a impressora não está obedecendo a esses comandos...
GOSTEI 0
Aerreira
09/01/2006
Qual é a sua impressora?
Se for Epson, você primeiro precisa inicializar ela com ´ESC @´, depois informa dados como espaçamento de linhas, tamanho da fonte, se desejar, tamanho do papel, tipo de letra, etc, etc... Depois inicia a impressão. Durante a impressão pode enviar códigos de compressão, negrito, sublinhado, etc, etc...
Isso aqui deve te ajudar: [url]http://support.epson.ru/products/manuals/000350/part1.pdf[/url]
Se for Epson, você primeiro precisa inicializar ela com ´ESC @´, depois informa dados como espaçamento de linhas, tamanho da fonte, se desejar, tamanho do papel, tipo de letra, etc, etc... Depois inicia a impressão. Durante a impressão pode enviar códigos de compressão, negrito, sublinhado, etc, etc...
Isso aqui deve te ajudar: [url]http://support.epson.ru/products/manuals/000350/part1.pdf[/url]
GOSTEI 0
Sremulador
09/01/2006
amigo se você utiliozar o fortes reporter ele vai imprimir bacana seus documentos...
GOSTEI 0
Fabiano_aprendiz
09/01/2006
amigo se você utiliozar o fortes reporter ele vai imprimir bacana seus documentos...
No fortes report tem como eu configurar o tamanho do papel? Porq o Quick Report possui o Report Settings mas as alterações q eu faço não surtem efeito algum, pergunto, no Fortes Report isso funciona??
GOSTEI 0
Fabiano_aprendiz
09/01/2006
Fabiano, ou você usa o QuickReport ou usa o AssignFile/WriteLn os dois juntos não dá.
Não existe mesmo a possibilidade dos dois funcionarem juntos?? Eu queria mandar p/impressora apenas a informação com a quantidade de linhas q devem ser impressas e depois sim imprimir o meu relatório.
Ex:
AssignFile(Texto,´LPT1´);
Rewrite(Texto);
Writeln(Texto,#2764);
Writeln(Texto,276730);
ae depois sim viria com o QuickReport:
Table1.Open;
Table1.First;
While not Table1.Eof Do begin
Application.CreateForm(TFrmImpressao, FrmImpressao);
...........
...........
FrmImpressao.QuickRep1.Print;
.............
Não tem como?
GOSTEI 0
Aerreira
09/01/2006
Fabiano, não adiantaria fazer isso, pois todo e qualquer aplicativo for Windows, ao enviar uma página para impressora sua imagem é montada de uma forma completamente diferente de uma página em texto puro (dos), e nessa imagem já vão as informações de margens, qualidade de impressão, etc, etc, etc, inclusive os códigos de inicialização da impressora que certamente cancelariam o código que você tivesse enviado antes.
Continuo te lembrando que o número de linhas em relatórios windows não é fixo... depende do tamanho da fonte e do espaçamento que você colocar entre as linhas... não há como definir número de linhas.
Continuo te lembrando que o número de linhas em relatórios windows não é fixo... depende do tamanho da fonte e do espaçamento que você colocar entre as linhas... não há como definir número de linhas.
GOSTEI 0
Fabiano_aprendiz
09/01/2006
Vlw aerreira,
fico muito grato por sua atenção e explicação. Vou dar uma olhada nesse Fortes Report....
Abçs.
fico muito grato por sua atenção e explicação. Vou dar uma olhada nesse Fortes Report....
Abçs.
GOSTEI 0
Fabiano_aprendiz
09/01/2006
Caro aerreira,
Eu rodei ,rodei e acabei optando por usar o WriteLn mesmo..rs . Agora minha dúvida é a seguinte, como faço para definir a posição dos campos na hora da impressão usando o writeln?
Eu rodei ,rodei e acabei optando por usar o WriteLn mesmo..rs . Agora minha dúvida é a seguinte, como faço para definir a posição dos campos na hora da impressão usando o writeln?
GOSTEI 0
Aerreira
09/01/2006
Com o writeln é tudo manual... Você vai ter que escrever linha por linha, e em cada uma delas terá que definir o que vai escrever, colocando os textos sequencialmente da primeira letra até a última em cada linha. Tudo manualmente.
Além do mais, a principio só conseguirá imprimir em sua impressora local, nada de rede, e também acabará criando relatórios restritos a um único modelo de impressora, pois os códigos das impressoras são diferentes entre si. A menos que crie rotinas ou drivers específicos para cada modelo de impressora, isso estaria tornando seu programa com cara de DOS, que funciona mais ou menos desse jeito. Já deu uma olhada no RDPrint (www.deltress.com.br), pois têm um componente muito bom para impressão em matriciais... pois acho que é este o seu caso.
Além do mais, a principio só conseguirá imprimir em sua impressora local, nada de rede, e também acabará criando relatórios restritos a um único modelo de impressora, pois os códigos das impressoras são diferentes entre si. A menos que crie rotinas ou drivers específicos para cada modelo de impressora, isso estaria tornando seu programa com cara de DOS, que funciona mais ou menos desse jeito. Já deu uma olhada no RDPrint (www.deltress.com.br), pois têm um componente muito bom para impressão em matriciais... pois acho que é este o seu caso.
GOSTEI 0
Fabiano_aprendiz
09/01/2006
Ok. segue um pedacinho do codigo:
AssignFile(Texto,´LPT1´);
Rewrite(Texto);
Writeln(Texto,#2764);
Writeln(Texto, ´Autor´);
Writeln(Texto, ´Cpf´);
Writeln(Texto, ´Cidade´);
Writeln(Texto,12);
CloseFile(Texto);
Gostaria de saber como faço p/informar a posição aonde cada campo deverá ser impresso?
Agradeço pela atenção.
abçs.
AssignFile(Texto,´LPT1´);
Rewrite(Texto);
Writeln(Texto,#2764);
Writeln(Texto, ´Autor´);
Writeln(Texto, ´Cpf´);
Writeln(Texto, ´Cidade´);
Writeln(Texto,12);
CloseFile(Texto);
Gostaria de saber como faço p/informar a posição aonde cada campo deverá ser impresso?
Agradeço pela atenção.
abçs.
GOSTEI 0
Aerreira
09/01/2006
Mais ou menos isso:
Lembre-se: esc @ é para Epson e compatíveis.
Writeln(Texto,#2764); writeln(texto,´Autor CPF Cidade´); while not eof na sua tabela writeln(texto,TabelaAutor.value+´ ´+TabelaCPF.value+´ ´+TabelaCidade.value); Writeln(Texto,12);
Lembre-se: esc @ é para Epson e compatíveis.
GOSTEI 0
Fabiano_aprendiz
09/01/2006
Além do mais, a principio só conseguirá imprimir em sua impressora local, nada de rede,
Realmente não to conseguindo imprimir em uma impressora na rede. Estou capturando todas as impressoras q estão configuradas na máquina e armazeno em um combobox e depois passo a informação no ´AssignFile´, mas naum está funcionando...Já tentei testar várias outras soluções como colocar direto o nome da impressora ex: AssignFile(Texto, ´\\maquina02\epson´) , armazenando em um arquivo ini e depois passando p/uma variavel ex: AssignFile(Texto, strNomImp)....mas nenhuma funciona, dá sempre erro de I/O 53 . Alguém tem alguma idéia? Com Writeln é realmente impossível imprimir em rede? O windows q estou usando é XP.
GOSTEI 0
Aerreira
09/01/2006
Por isso recomendo RDPrint, já testei em rede e funciona beleza. Mesmo sendo pago, vale o pequeno investimento.
GOSTEI 0
Fabiano_aprendiz
09/01/2006
Caro Aerreira,
Valeu pela dica , a melhor solução foi o RDprint mesmo, finalmente consegui fechar isso, obrigado.
Gostaria tbm de agradecer a todos que comentaram nesse tópico.
Abçs.
Valeu pela dica , a melhor solução foi o RDprint mesmo, finalmente consegui fechar isso, obrigado.
Gostaria tbm de agradecer a todos que comentaram nesse tópico.
Abçs.
GOSTEI 0
Aerreira
09/01/2006
Valeu pela dica , a melhor solução foi o RDprint mesmo, finalmente consegui fechar isso, obrigado.
Beleza...
GOSTEI 0