Csanapeti Posted February 5, 2009 Posted February 5, 2009 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.
Csanapeti Posted February 5, 2009 Author Posted February 5, 2009 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
arpsoft Posted February 5, 2009 Posted February 5, 2009 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?
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now