معرفة خصائص الطابعة .
#1
السلام عليكم ورحمة الله وبركاته ،
كنت أبحث عن كيفية معرفة خصائص الطابعة ، هل تسمح بالطباعة على الجهتين  Recto/Verso  ، وجدت هذا المثال ، فوضعته هنا عسى أن يستفيد منه الإخوة.
1- لمعرفة جميع الطابعات المثبة على  جهازك ، مع معرفة إذا ما كانت تسمح بالطباعة على الجهتين .
أنشئ مشروع جديد ، ضع المكونات التالية :
 TListView
 Bouton
 Label


كود :
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    PrintDialog1: TPrintDialog;
    ListView1: TListView;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
    procedure InitListView;
  end;
 
var
  Form1: TForm1;
 
implementation
uses Printers,WinSpool;
{$R *.dfm}
procedure TForm1.InitListView;
var AListColumn:TListColumn;
begin
  ListView1.Clear;
  ListView1.Columns.Clear;
  ListView1.ViewStyle:=vsReport;
 
  AListColumn:=ListView1.Columns.Add;
  AListColumn.Caption:='Nom de l''imprimante';
    AListColumn:=ListView1.Columns.Add;
  AListColumn.Caption:='Nom du Driver';
    AListColumn:=ListView1.Columns.Add;
  AListColumn.Caption:='Recto Verso';
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
  AListItem:TListItem;
  Device, Driver, Port: array[0..255] of Char;
  hDevMode: THandle;
  TypeDeDuplex:Integer;
  s:string;
begin
  InitListView;
  Printer.PrinterIndex:=-1;
  Printer.GetPrinter(Device, Driver, Port, hDevmode);
  Label1.Caption:='Imprimante par défaut : '+string(Device);
  for i:=-1 to printer.Printers.Count-1 do
  begin
    Printer.PrinterIndex:=i;
    Printer.GetPrinter(Device, Driver, Port, hDevmode);
    TypeDeDuplex:=WinSpool.DeviceCapabilities(Device, Port, DC_DUPLEX, nil, nil);
    AListItem:=ListView1.Items.Add;
    AListItem.Caption:=Device;
    s:=Driver;
    if s='' then s:='<Non fourni>';
    AListItem.SubItems.Add(s);
    case TypeDeDuplex of
      -1:s:='Erreur';
       0:s:='Non';
       1:s:='Oui';
    end;
    AListItem.SubItems.Add(s);
  end;
end;
 
end.


وهذا البرنامج للطباعة Recto Verso

كود :
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    PrintDialog1: TPrintDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;
 
var
  Form1: TForm1;
 
implementation
uses WinSpool, Printers;
{$R *.dfm}
function PrinterSupportsDuplex: Boolean;
var
  Device, Driver, Port: array[0..255] of Char;
  hDevMode: THandle;
begin
  Printer.GetPrinter(Device, Driver, Port, hDevmode);
  Result :=
    WinSpool.DeviceCapabilities(Device, Port, DC_DUPLEX, nil, nil) <>
    0;
end;
 
procedure ForceDuplexMode;
var
  Device, Driver, Port: array[0..80] of Char;
  DevMode: THandle;
  pDevmode: PDeviceMode;
begin
  Printer.GetPrinter(Device, Driver, Port, DevMode);
  if Devmode <> 0 then begin
    pDevMode := GlobalLock(Devmode);
    if pDevmode <> nil then
    try
      with pDevmode^ do begin
        dmDuplex := DMDUP_VERTICAL;
        dmFields := dmFields or DM_DUPLEX;
      end;
    finally
      GlobalUnlock(Devmode);
    end;
  end; { If }
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  if PrintDialog1.Execute then
  begin
    ForceDuplexMode;
 
    Printer.BeginDoc;
    printer.canvas.TextOut(10,10,'Recto');
 
    Printer.NewPage;
 
    printer.canvas.TextOut(10,10,'Verso');
 
    Printer.EndDoc;
  end;
end;
 
end.


بالتوفيق للجميع.
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
[-] كل من 4 users say قال شكرا ل أبو معاذ على المشاركة المفيدة
  • bassem_43, Mr.DOS, h-farid, wadoud
الرد
#2
بارك الله فيك
كنت ابحث عنها recto verso
الفاشلون نوعان : الأول : فكر ولم يفعل .. والآخر: فعل ولم يفكر
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم