텍스트파일을 열어 출력하는 프로시져입니다. 문제는 이게 프린터설정을 무시하고 출력합니다. 출력을 랜드스케이프로 하고 싶은데 어렵군요.
아마 코드중 if not WinSpool.OpenPrinter(@Device, hPrinter, nil) then부분에서 nil값을 쓰지않고 구조체값을 주어야 할 것 같은데 초보라서 어렵군요.
도움말을 보면 다음과 같습니다.
BOOL OpenPrinter(
LPTSTR pPrinterName, // address of printer or server name
LPHANDLE phPrinter, // address of printer or server handle
LPPRINTER_DEFAULTS pDefault // address of printer defaults structure
);
typedef struct _PRINTER_DEFAULTS { // pd
LPTSTR pDatatype;
LPDEVMODE pDevMode;
ACCESS_MASK DesiredAccess;
} PRINTER_DEFAULTS;
typedef struct _devicemode { // dvmd
중략...
short dmOrientation;
중략...
} DEVMODE;
dmOrientation에 값을 넣어주어야 할 것 같은데...구조체를 어떻게 정의하고 사용하는지 몰라서요...
다음은 텍스트파일 프린트 프로시져입니다.
procedure PrintFile(const sFileName: string);
{ Prints a text file directly to the default printer. }
const
BufSize = 16384;
type
TDoc_Info_1 = record
pDocName,
pOutputFile,
pDataType: pChar;
end;
var
Count, BytesWritten: integer;
hPrinter, hDeviceMode: THandle;
Device, Driver, Port : array[0..255] of char;
DocInfo: TDoc_Info_1;
f: file;
Buffer: Pointer;
begin
Printer.Orientation :=poLandscape;
Printer.PrinterIndex := -1;
Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
if not WinSpool.OpenPrinter(@Device, hPrinter, nil ) then
Exit;
DocInfo.pDocName := 'MyDocument';
DocInfo.pOutputFile := nil;
DocInfo.pDatatype := 'RAW';
if StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then
begin
WinSpool.ClosePrinter(hPrinter);
Exit;
end;
if not StartPagePrinter(hPrinter) then
begin
EndDocPrinter(hPrinter);
WinSpool.ClosePrinter(hPrinter);
Exit;
end;
System.Assign(f, sFileName);
try
Reset(f, 1);
GetMem(Buffer, BufSize);
while not eof(f) do
begin
Blockread(f, Buffer^, BufSize, Count);
if Count > 0 then
if not WritePrinter(hPrinter, Buffer, Count, BytesWritten) then
begin
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
WinSpool.ClosePrinter(hPrinter);
FreeMem(Buffer, BufSize);
Exit;
end;
end;
FreeMem(Buffer, BufSize);
EndDocPrinter(hPrinter);
WinSpool.ClosePrinter(hPrinter);
finally
System.Closefile( f );
end;
end;