Q&A

  • 프린트시 Landscape로 바꾸려면....
텍스트파일을 열어 출력하는 프로시져입니다. 문제는 이게 프린터설정을 무시하고 출력합니다. 출력을 랜드스케이프로 하고 싶은데 어렵군요.

아마 코드중 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;



0  COMMENTS