Exibir e selecionar impressoras instaladas

03/12/2003

2

Alguém sabe como fazer para exibir todas as impressoras instaladas e selecionar uma delas para impressão.
Valeu galera


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:

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ê

   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
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira