Fórum Porta de Impressora não é detectada no XP #280177
05/05/2005
0
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
Curtir tópico
+ 0Posts
05/05/2005
Massuda
Gostei + 0
05/05/2005
Bonds
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
05/05/2005
Massuda
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
06/05/2005
Bonds
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
06/05/2005
Massuda
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
Clique aqui para fazer login e interagir na Comunidade :)