trichview.support.examples
How to access RichViewActions page setup properties in code |
Author |
Message |
Sergey Tkachenko |
Posted: 06/09/2005 10:09:07 1) Margins are stored in RVPrint, assigned to RVAControlPanel.RVPrint 2) Properties of header and footer are stored in global objects RVA_HeaderInfo and RVA_FooterInfo (Text, Alignment, PrintOnFirstPage properties) 3) Page size, orientation and source are stored in the global for the application printer settings. They are accessible via global Printer object (units Printers). Only orientation can be changed easily - Printer.Orientation. Other properties can be changed using WinAPI functions: 3.a) Changing paper source uses Printers; type TBinName = array [0..23] of Char; TBinNames = array [0..1000] of TBinName; PBinNames = ^TBinNames; TWordArray = array [0..1000] of Word; PWordArray = ^TWordArray; procedure GetAvailablePaperSources; var ADevice, ADriver, APort: array[0..79] of Char; ADeviceMode: THandle; DevMode: PDeviceMode; BinCount: Integer; begin Printer.GetPrinter(ADevice,ADriver,APort,ADeviceMode); if ADeviceMode<>0 then begin DevMode := PDeviceMode(GlobalLock(ADeviceMode)) end else raise Exception.Create('Error initializing printer'); BinCount := DeviceCapabilities(ADevice, APort, DC_BINNAMES, nil, DevMode); GetMem(BinNames, sizeof(TBinName)*BinCount); GetMem(BinCodes, sizeof(Integer)*BinCount); try DeviceCapabilities(ADevice, APort, DC_BINNAMES, Pointer(BinNames), DevMode); DeviceCapabilities(ADevice, APort, DC_BINS, Pointer(BinCodes), DevMode); { At this point, BinNames[0..BinCount-1] contain names of paper sources, BinCodes[0..BinCount-1] contain their codes that can be used in SetPaperSource. Store them somewhere. } finally FreeMem(PaperNames); FreeMem(PaperCodes); end; GlobalUnlock(ADeviceMode); end; procedure SetPaperSource(PaperSource: Integer); var ADevice, ADriver, APort: array[0..79] of Char; ADeviceMode: THandle; DevMode: PDeviceMode; begin Printer.GetPrinter(ADevice,ADriver,APort,ADeviceMode); if ADeviceMode<>0 then begin DevMode := PDeviceMode(GlobalLock(ADeviceMode)) end else raise Exception.Create('Error initializing printer'); DevMode.dmFields := DevMode.dmFields or DM_DEFAULTSOURCE; DevMode.dmDefaultSource := PaperSource; GlobalUnlock(ADeviceMode); Printer.SetPrinter(ADevice,ADriver,APort,ADeviceMode); end; 3.b) Paper size uses Printers; procedure SetPaperSize(PaperSize: Integer); var ADevice, ADriver, APort: array[0..79] of Char; ADeviceMode: THandle; DevMode: PDeviceMode; begin Printer.GetPrinter(ADevice,ADriver,APort,ADeviceMode); if ADeviceMode<>0 then begin DevMode := PDeviceMode(GlobalLock(ADeviceMode)) end else raise Exception.Create('Error initializing printer'); DevMode.dmFields := DevMode.dmFields or DM_PAPERSIZE; DevMode.dmPaperSize := PaperSize; GlobalUnlock(ADeviceMode); Printer.SetPrinter(ADevice,ADriver,APort,ADeviceMode); end; You can find a list of available paper sizes in Windows API Help (Delphi menu: Help | Windows SDK). Search DEVMODE in the help index, then search for DMPAPER_*** constants. For example, SetPaperSize(DMPAPER_A4) Do not forget to call RVPrint.FormatPages after any change in paper sizes. You can get the current printer's paper size: function GetPaperSize: Integer; var ADevice, ADriver, APort: array[0..79] of Char; ADeviceMode: THandle; DevMode: PDeviceMode; begin Printer.GetPrinter(ADevice,ADriver,APort,ADeviceMode); if ADeviceMode<>0 then begin DevMode := PDeviceMode(GlobalLock(ADeviceMode)) end else raise Exception.Create('Error initializing printer'); Result := DevMode.dmPaperSize; end; You can see how to get a list of available paper sizes and their names in the RichViewActions source code (in page setup form) |
Powered by ABC Amber Outlook Express Converter