Jump to content
GSForum - Segélyvonal

Delphi nyomtatás + papírméret


Recommended Posts

Posted

Vista alatt programozok Delphi 7-ben.

 

A printers unittal nyomtatok, ki egy táblázatot benne szöveggel. Van valami lehetõség, hogy a Printer Setup dialógus ablakon kívül beállítsam valahogy a papír méretét? Bármilyen megoldás érdekel. QuickReport és Rave nem jöhet szóba, mivel futási idõben írok és rajzolok a papírra, és QR-ben és Rave-ben nem lehet új oldalt létrehozni, illetve nekem nem sikerült az ha az egyik oldalon már nem fér ki valami akkor a másikon folytassa, illetve nem tudtam rendesen pozicionálni.

 

A következõ kódot kipróbáltam, de ...

 

HP LaserJet P1505 nyomtatónál, le sem fut, gondolom nem tudja átváltani DeviceMode-ba.

Adobe PDF Printernél, lefut ugyan de Acces Violation-nal ki is fagy.

 

procedure TForm1.Button1Click(Sender: TObject);
var
Device : array[0..255] of char;
Driver : array[0..255] of char;
Port   : array[0..255] of char;
hDMode : THandle;
PDMode : PDEVMODE;
begin
  Printer.PrinterIndex := Printer.PrinterIndex;
  Printer.GetPrinter(Device, Driver, Port, hDMode);
  if hDMode <> 0 then begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then begin
     {Set to legal}
      pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;
      pDMode^.dmPaperSize := DMPAPER_LEGAL;
     {Set to custom size}
      pDMode^.dmFields := pDMode^.dmFields or
                          DM_PAPERSIZE or
                          DM_PAPERWIDTH or
                          DM_PAPERLENGTH;
      pDMode^.dmPaperSize := DMPAPER_USER;
      pDMode^.dmPaperWidth :=  100 {SomeValueInTenthsOfAMillimeter};
      pDMode^.dmPaperLength :=  100 {SomeValueInTenthsOfAMillimeter};
     {Set the bin to use}
      pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
      pDMode^.dmDefaultSource := DMBIN_MANUAL;
      GlobalUnlock(hDMode);
    end;
  end;
  Printer.PrinterIndex := Printer.PrinterIndex;
  Printer.BeginDoc;
  Printer.Canvas.TextOut( 50, 50, 'Test  ');
  Printer.EndDoc;
end;

 

Elõre is köszönöm.

Posted

Kipróbáltam az eljárást, a következõ kóddal.

 

procedure Tform1.PrinterSettings( Paper: Integer; Orientation: Integer );
var
  FDevice, FDriver, FPort: array[0..79] of Char;
  DeviceMode: THandle;
  pDevMode: PDeviceMode;
begin
  Printer.GetPrinter(FDevice, FDriver, FPort, DeviceMode);
  if DeviceMode <> 0 then
  begin
    pDevMode := GlobalLock(DeviceMode);
    if pDevMode <> nil then
    try
      if ( (pDevMode^.dmFields and DM_PAPERSIZE) <> 0 ) then
        pDevMode^.dmPaperSize := Paper;
      if ( (pDevMode^.dmFields and DM_ORIENTATION) <> 0 ) then
        pDevMode^.dmOrientation := Orientation;
      Printer.SetPrinter( FDevice, FDriver, FPort, DeviceMode );
    finally
      GlobalUnlock(DeviceMode);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
PrinterSettings(DMPAPER_A_PLUS,DMORIENT_PORTRAIT);
Printer.BeginDoc;
Printer.Canvas.TextOut(100,100,'Hello Delphi!');
Printer.EndDoc;
end;

 

Most a Lézernyomtatón tökéletes mûködik, nem jelez hibát, nem fagy ki.

 

Adobe PDF nyomtatónál a Printer.BeginDoc; résznél elszáll Acces Violationnal :(

Posted

Az előző kódban egy 1cm x 1cm-s papírméretet állítottál be. Direkt?

Nem lehet, hogy előbb kéne unlock-ot mondani és utána hívni a setprinter-t?

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...