Exibir e selecionar impressoras instaladas
03/12/2003
0
Alguém sabe como fazer para exibir todas as impressoras instaladas e selecionar uma delas para impressão.
Valeu galera
Valeu galera
Drogao
Curtir tópico
+ 0
Responder
Posts
04/12/2003
Deus
Bem, digamos que você queira listar todas as impressoras disponíveis num ComboBox. Para tal, você cria uma função chamada [i:c289a63096]slListaImpressoras[/i:c289a63096], que fica assim:
Aí, quando o Formulário que tem este ComboBox for ser ativado, é só colocar no OnActivate o seguinte código:
Já para mudar a impressora padrão, crie o seguinte procedimento:
Agora, no OnClick do seu ComboBox, é só fazer:
Lembrando que, ao mudar a impressora padrão, você talvez queira depois restaurar o estado inicial, então eu criei essa função para retornar o índice da impressora padrão atual:
Agora, é só você, ao ativar o form, guardar o valor dessa função num inteiro qualquer e, ao terminar a aplicação, usar o procedimento MudaImpressora com o valor guardado original. Fácil, né? :)
Espero ter ajudado! :) Abraços, dEUS.
function slListaImpressoras: TStringList; var i: Integer; slTmp: TStringList; begin slTmp := TStringList.Create; for i := 0 to Pred(Printer.Printers.Count) do slTmp.Add(Printer.Printers[i]); Result := slTmp; end;
Aí, quando o Formulário que tem este ComboBox for ser ativado, é só colocar no OnActivate o seguinte código:
ComboBox1.Items := slListaImpressoras;
Já para mudar a impressora padrão, crie o seguinte procedimento:
procedure MudaImpressora(index: integer); var szPrinterName, szIniInfo, szSection: PChar ; begin try GetMem(szPrinterName, SizeOf(Char) * 256); GetMem(szIniInfo, SizeOf(Char) * 256); GetMem(szSection, 10); if (Pos(´on´, Printer.Printers[index]) = 0) then StrPCopy(szPrinterName, Copy(Printer.Printers[index], 1, Length(Printer.Printers[index]))) else StrPCopy(szPrinterName, Copy(Printer.Printers[index], 1, Pos(´on´, Printer.Printers[index]) - 2 )); GetProfileString(´DEVICES´, szPrinterName, nil, szIniInfo, 254); if szIniInfo^ <> 0 then begin StrCat(szPrinterName, ´,´); StrCat(szPrinterName, szIniInfo); WriteProfileString(´Windows´, ´DEVICE´, szPrinterName); StrCopy(szSection, ´Windows´); PostMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(szSection)); end ; FreeMem(szPrinterName, SizeOf(Char) * 256); FreeMem(szIniInfo, SizeOf(Char) * 256); FreeMem(szSection, 10) ; except on E: EOutOfMemory do ShowMessage(E.Message); on E: EInvalidPointer do ShowMessage(E.Message); end ; end;
Agora, no OnClick do seu ComboBox, é só fazer:
MudaImpressora(ComboBox1.ItemIndex)
Lembrando que, ao mudar a impressora padrão, você talvez queira depois restaurar o estado inicial, então eu criei essa função para retornar o índice da impressora padrão atual:
function IndiceDefaultPrinter: Integer; begin Result := Printer.PrinterIndex; end;
Agora, é só você, ao ativar o form, guardar o valor dessa função num inteiro qualquer e, ao terminar a aplicação, usar o procedimento MudaImpressora com o valor guardado original. Fácil, né? :)
Espero ter ajudado! :) Abraços, dEUS.
Responder
04/12/2003
Deus
Eu só queria fazer uma correção no código, para que ele ficasse sem erros pois, fazendo uma revisão mental depois, eu vi que havia a possibilidade de, havendo uma impressora ´Epson´, por exemplo, dar um erro. Desta forma, onde você lê
troque por
Uma mudança bem pequena, apenas adicionando espaços antes e depois do ´on´, para que ele virasse ´ on ´, e trocando o - 2 da última linha por - 1. Ah, e não esqueça de adicionar [b:b74ab72f74]printers[/b:b74ab72f74] na cláusula [i:b74ab72f74]uses[/i:b74ab72f74]. :) Era só isso, ok? ;) Espero ter ajudado!
if (Pos(´on´, Printer.Printers[index]) = 0) then StrPCopy(szPrinterName, Copy(Printer.Printers[index], 1, Length(Printer.Printers[index]))) else StrPCopy(szPrinterName, Copy(Printer.Printers[index], 1, Pos(´on´, Printer.Printers[index]) - 2 ));
troque por
if (Pos(´ on ´, Printer.Printers[index]) = 0) then StrPCopy(szPrinterName, Copy(Printer.Printers[index], 1, Length(Printer.Printers[index]))) else StrPCopy(szPrinterName, Copy(Printer.Printers[index], 1, Pos(´ on ´, Printer.Printers[index]) - 1 ));
Uma mudança bem pequena, apenas adicionando espaços antes e depois do ´on´, para que ele virasse ´ on ´, e trocando o - 2 da última linha por - 1. Ah, e não esqueça de adicionar [b:b74ab72f74]printers[/b:b74ab72f74] na cláusula [i:b74ab72f74]uses[/i:b74ab72f74]. :) Era só isso, ok? ;) Espero ter ajudado!
Responder
Clique aqui para fazer login e interagir na Comunidade :)