Porta de Impressora não é detectada no XP
Pessoal, bom dia!
Estou desenvolvedo um sistema em delphi 5 e preciso que ele mostre todas as impressoras instaladas para que o usuário escolha a impressora (impressão direta, sem report) e estou usando esse código para fazer isso:
var
i : integer;
begin
For I:= 1 to Printer.Printers.Count do
Begin
ComboBox1.Items.Add(printer.Printers.Strings[I-1]);
end;
Até ai blz, só que a resposta disso no windows 98 é (hp deskjet 3600 series on \\Comercial3\hp 3600)
1) ele determina o nome e a porta da impressora. Já no Windows XP ele só mostra o nome (hp deskjet 3600 series), não acha a porta.
2) Quando uso o Qreport, acontece outra coisa estranha, quando o delphi está aberto e eu coloco (RUN) na aplicação e visualizo o Qreport(Qreport.Preview) ele mostra e imprime legal, porém quando executo o aplicativo por fora do Delphi, executando o ´.exe´ as opções ´Print Setup´ e ´Print´ ficam desabilitadas.
Ai vem a pergunta (depois de muito blá, blá, blá) será que o delphi 5 não é a uma boa versão para criar aplicativos para Windows XP ? ou tem alguma dica para resolver isso?
Fica essa dúvida para os feras em Delphi responderem.
Ps. Precisava saber disso pois a aplicativo que eu estou fazendo é para o dono da Empresa que eu trabalho ... :lol: já viu a responsabilidade né...
Abraços
Estou desenvolvedo um sistema em delphi 5 e preciso que ele mostre todas as impressoras instaladas para que o usuário escolha a impressora (impressão direta, sem report) e estou usando esse código para fazer isso:
var
i : integer;
begin
For I:= 1 to Printer.Printers.Count do
Begin
ComboBox1.Items.Add(printer.Printers.Strings[I-1]);
end;
Até ai blz, só que a resposta disso no windows 98 é (hp deskjet 3600 series on \\Comercial3\hp 3600)
1) ele determina o nome e a porta da impressora. Já no Windows XP ele só mostra o nome (hp deskjet 3600 series), não acha a porta.
2) Quando uso o Qreport, acontece outra coisa estranha, quando o delphi está aberto e eu coloco (RUN) na aplicação e visualizo o Qreport(Qreport.Preview) ele mostra e imprime legal, porém quando executo o aplicativo por fora do Delphi, executando o ´.exe´ as opções ´Print Setup´ e ´Print´ ficam desabilitadas.
Ai vem a pergunta (depois de muito blá, blá, blá) será que o delphi 5 não é a uma boa versão para criar aplicativos para Windows XP ? ou tem alguma dica para resolver isso?
Fica essa dúvida para os feras em Delphi responderem.
Ps. Precisava saber disso pois a aplicativo que eu estou fazendo é para o dono da Empresa que eu trabalho ... :lol: já viu a responsabilidade né...
Abraços
Bonds
Curtidas 0
Respostas
Massuda
05/05/2005
Uso D5 + WinXP sem problemas a mais de um ano.
...ele determina o nome e a porta da impressora. Já no Windows XP ele só mostra o nome (hp deskjet 3600 series), não acha a porta....
Verifique a configuração das impressoras na máquina com Windows XP. Na minha máquina, o texto para impressoras de rede é algo do tipo ´\\Comercial3\hp 3600´ enquanto as impressoras locais aparecem como ´hp deskjet 3600 series´....porém quando executo o aplicativo por fora do Delphi, executando o ´.exe´ as opções ´Print Setup´ e ´Print´ ficam desabilitadas...
Existe um bug na VCL que as vezes faz o QR pensar que não tem impressora instalada na máquina, embora tenha impressora instalada. Dê uma olhada [url=http://www.qusoft.com/printerbug.html]nesta página[/url] da QUSoft, sobre o problema ´There is no default printer currently selected´.GOSTEI 0
Bonds
05/05/2005
Massuda, valeu pela segunda resposta em relação ao Qreport.
Em relação ao nome da impressora local realmente ele detecta ela, mas a porta que ela está não.
Por exemplo
Tenho uma Epson Stylus C65 na LPT1. No Win98 ele responde isso:
´Epson Stylus C65 on LPT1´ já no XP ele retorna somente o nome dela
´Epson Stylus C65´
Criei o combobox para detectar todas as impressoras instaladas (de rede ou local) e mando imprimir direto na impressora escolhida no combo o nome dela e determinando na procedure a porta.
Exemplo:
procedure TFormImprimir.FormShow(Sender: TObject);
var
I : Integer;
begin
ComboBox1.Items.Clear;
For I:= 1 to Printer.Printers.Count do
Begin
if Pos(´LPT´, printer.Printers.Strings[I-1]) > 0 Then
ComboBox1.Items.Add(´LPT1´)
Else if Pos(´\\´, printer.Printers.Strings[I-1]) > 0 Then
ComboBox1.Items.Add(Copy(printer.Printers.Strings[I-1],
Pos(´\\´, printer.Printers.Strings[I-1]),
length(printer.Printers.Strings[I-1]) -
Pos(´\\´, printer.Printers.Strings[I-1]) + 1));
End;
//Combobox1.ItemIndex := 0;
end;
Depois pego o valor da porta sacou !? :o
Verifique a configuração das impressoras na máquina com Windows XP. Na minha máquina, o texto para impressoras de rede é algo do tipo ´\\Comercial3\hp 3600´ enquanto as impressoras locais aparecem como ´hp deskjet 3600 series´.
Em relação ao nome da impressora local realmente ele detecta ela, mas a porta que ela está não.
Por exemplo
Tenho uma Epson Stylus C65 na LPT1. No Win98 ele responde isso:
´Epson Stylus C65 on LPT1´ já no XP ele retorna somente o nome dela
´Epson Stylus C65´
Criei o combobox para detectar todas as impressoras instaladas (de rede ou local) e mando imprimir direto na impressora escolhida no combo o nome dela e determinando na procedure a porta.
Exemplo:
procedure TFormImprimir.FormShow(Sender: TObject);
var
I : Integer;
begin
ComboBox1.Items.Clear;
For I:= 1 to Printer.Printers.Count do
Begin
if Pos(´LPT´, printer.Printers.Strings[I-1]) > 0 Then
ComboBox1.Items.Add(´LPT1´)
Else if Pos(´\\´, printer.Printers.Strings[I-1]) > 0 Then
ComboBox1.Items.Add(Copy(printer.Printers.Strings[I-1],
Pos(´\\´, printer.Printers.Strings[I-1]),
length(printer.Printers.Strings[I-1]) -
Pos(´\\´, printer.Printers.Strings[I-1]) + 1));
End;
//Combobox1.ItemIndex := 0;
end;
Depois pego o valor da porta sacou !? :o
GOSTEI 0
Massuda
05/05/2005
Testei numa máquina com Win2K... a verdade é que seu código parece funcionar apenas no Win9x; nas outras versões do Windows o nome da porta é omitido da lista de impressoras instaladas.
Depois de dar uma pesquisada, parece que isso funcionará em qualquer Windows (não testei muito)...
Depois de dar uma pesquisada, parece que isso funcionará em qualquer Windows (não testei muito)...
uses Printers, WinSpool, ... function GetCurrentPrinterHandle: THandle; var Device, Driver, Port: array[0..255] of Char; Mode: THandle; begin Printer.GetPrinter(Device, Driver, Port, Mode); if not OpenPrinter(@Device, Result, nil) then RaiseLastWin32Error; end; function GetCurrentPrinterPort: string; var Buffer: array of Char; Size: DWORD; H: THandle; begin H := GetCurrentPrinterHandle; try WinSpool.GetPrinter(H, 2, nil, 0, @Size); SetLength(Buffer, Size); try WinSpool.GetPrinter(H, 2, @Buffer[0], Size, @Size); Result := PPrinterInfo2(@Buffer[0])^.pPortName; finally Buffer := nil; end; finally ClosePrinter(H); end; end; // exemplo de uso... // preenche um combobox de modo parecido com o Win9x var I: Integer; X: Integer; ... X := Printer.PrinterIndex; for I:= 0 to Printer.Printers.Count-1 do begin Printer.PrinterIndex := I; ComboBox1.Items.Add(Printer.Printers[I] + ´ on ´ + GetCurrentPrinterPort); end; Printer.PrinterIndex := X;
GOSTEI 0
Bonds
05/05/2005
:D Cara Muito obrigado, Funcionou tranquilo nos dois (no 98 e no 2003) não testei no xp mas se funcionou no 2003 vai funfar no XP tbm.
Só não entendi a segunda função (GetCurrentPrinterPort) tem como comentar as linhas :lol: . Só a título de conhecimento.
Mais uma vez vlw
Só não entendi a segunda função (GetCurrentPrinterPort) tem como comentar as linhas :lol: . Só a título de conhecimento.
Mais uma vez vlw
GOSTEI 0
Massuda
05/05/2005
Só não entendi a segunda função (GetCurrentPrinterPort) tem como comentar as linhas...
Acho que a parte mais complicada é o fato de ter duas chamadas à função WinSpool.GetPrinter.Essa função é da API do Windows (veja a [url=http://msdn.microsoft.com/library/en-us/gdi/prntspol_1gky.asp]descrição da função[/url] no MSDN) e ela permite obter diversas informações sobre uma impressora ´em uso´.
Ela funciona assim... o tamanho do buffer com os dados que ela retorna pode variar com a versão do Windows, esta chamada (note o nil e o zero)...
WinSpool.GetPrinter(H, 2, nil, 0, @Size);
A segunda chamada...
WinSpool.GetPrinter(H, 2, @Buffer[0], Size, @Size);
GOSTEI 0