Fórum Porta de Impressora não é detectada no XP #280177

05/05/2005

0

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


Bonds

Bonds

Responder

Posts

05/05/2005

Massuda

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´.


Responder

Gostei + 0

05/05/2005

Bonds

Massuda, valeu pela segunda resposta em relação ao Qreport.

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


Responder

Gostei + 0

05/05/2005

Massuda

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)...
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;



Responder

Gostei + 0

06/05/2005

Bonds

: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


Responder

Gostei + 0

06/05/2005

Massuda

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);
...serve para ela informar quantos bytes são necessários para armazenar as informações que ela vai retornar.

A segunda chamada...
WinSpool.GetPrinter(H, 2, @Buffer[0], Size, @Size);
...é feita com um buffer (no caso um array dinâmico) do tamanho necessário; a função preenche o buffer e faço um typecast via ponteiro para obter a informação desejada. O tipo de dado PPrinterInfo2 está declarado na unit WinSpool.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar