Usando Delphi VCL. Quando o usuário inicia um trabalho de impressão, eu exibo o TPrintDialog.
O ideal seria que a caixa de diálogo de impressão mostrasse o nome da impressora, o tamanho do papel e a orientação que o usuário utilizou por último (que salvei). Mas, embora eu possa passar a orientação para a impressora e fazer com que ela apareça na caixa de diálogo, não consigo encontrar uma maneira de fazer com que a caixa de diálogo mostre algo diferente da impressora e do tamanho do papel padrão.
Eu poderia criar uma caixa de diálogo personalizada que se parecesse com a caixa de diálogo de impressão e passar os parâmetros dessa forma, mas parece que deveria haver uma maneira de passá-los para o TPrintDialog.
Obrigado.
Scott
OK, não tenho certeza se estou fazendo isso corretamente do ponto de vista do StackOverflow. Por favor, desculpe se não estiver.
Resolvi o problema do VCL funcionar com a ajuda do Remy, mas agora estou preso na versão FMX para MacOS.
Trabalhando com a orientação da página, posso definir e obter a orientação com sucesso, mas isso não afeta a orientação na caixa de diálogo de configuração da página nem como a página é realmente impressa.
Aqui está o que eu tenho:
function getOrientation: string;
var
FPrintInfo: NSPrintInfo;
orientation: integer;
begin
result:='';
FPrintInfo := TNSPrintInfo.Wrap(TNSPrintInfo.OCClass.sharedPrintInfo);
FPrintInfo.retain;
PMGetOrientation(FPrintInfo.PMPageFormat, @orientation);
FPrintInfo.release;
if (orientation=1) or (orientation=3) then result:='portrait';
if (orientation=2) or (orientation=4) then result:='landscape';
end;
procedure setOrientation (const toSetS:string);
var
FPrintInfo: NSPrintInfo;
orientation: integer;
begin
if toSetS='portrait' then orientation:=1 else orientation:=2;
FPrintInfo := TNSPrintInfo.Wrap(TNSPrintInfo.OCClass.sharedPrintInfo);
FPrintInfo.retain;
PMSetOrientation(FPrintInfo.PMPageFormat,orientation,true);
FPrintInfo.release;
end;
Obrigado.
TPrintDialog
não oferece suporte nativo aos valores que você está perguntando. No entanto, internamente, ele apenas chama aPrintDlg()
API Win32, que pode ser inicializada usando umaDEVMODE
struct, que possui camposdmOrientation
e .dmPaperSize
TPrintDialog
recupera umDEVMODE
fromTPrinter
antes de chamarPrintDlg()
, e então atribui o resultadoDEVMODE
de volta aTPrinter
se o diálogo for bem-sucedido. Assim, você pode usar oTPrinter.SetPrinter()
método para fornecer o seu próprioDEVMODE
para o dispositivo desejado antes de invocarTPrintDialog
.A
TPrinter.Orientation
propriedade lê/grava odmOrientation
campo doTPrinter
's atualmente atribuídoDEVMODE
.TPrinter
Não tem uma propriedade para ler/gravar odmPaperSize
campo, mas você pode fazer isso manualmente.