1. 텍스트 파일을 읽어서, 윈도 기본 프린터로 출력 합니다.
while not SeekEof(DocF) do
begin
Readln(DocF, GetText);
-- 제어문자 처리
-- if 페이지스킵... 페이지스킵 처리후 continue;
-- if 타이틀처리 (문자 굵게, 크게하고) ...
textout 하고 continue;
Printer.Canvas.textout(x, y, GetText);
end;
와 비슷한 양식 입니다.
2. 텍스트 파일 내에는 프린트 제어를 위한 특별한 문자를 삽입했습니다.
예) INCB(Increase Bold: 문자를 굵게, 크게 표시해라)
SKIP(Page Skip을 해라)
실제 GetText에는 'INCB집계표'와 같은 값이 들어갑니다.
3. 프로그램에서 if 조건으로 제어문자를 점검 합니다.
예) if Copy(GetText, 1, 4) = 'SKIP' then
begin
Printer.NewPage;
I := 0; // textout의 y첨자제어용.
continue;
end;
이 예가 위 1번의 while loop 내에 존재 합니다.
4. 실제 출력을 해보면, 처음 페이지는 잘 나오는데,
두번째 페이지 부터 출력이 않됩니다.
5. 그래서, 서버 텍스트 파일을 편집해서 SKIP을 없애면,
한페이지는 정상 출력, 다음 페이지는 내용이 출력된후,
타이틀이 찍힙니다.
6. 디버깅을 위해서, while loop내에서 showmessage로 GetText를 찍어보면,
서버 파일과 동일한 내용으로 출력됩니다.
헌데... 결과가 ....
질문이 너무 난해한것 같아서 죄송합니다.
특별한 델파이 솔루션이 없어서, 어려운 방법을 택한것 같기도 하고...
많은 조언을 부탁드립니다.
질문이 이해가 안가시면, 다시금 요청해 주세요.. 감사합니다...
델파이 팁에서 퍼온 것입니다.
개인적으로 적용하여 잘 되고 있습니다.
단지 프리터에 스풀되어 있어
프리트가 끝임을 알려주는 커맨드를 추가적으로 날려 주어야 됨
(이것은 찾는 중임)
_____________________________________________________________________________
[Tip] 텍스트파일을 프린터로 직접보내는법
uses Printers, WinSpool;
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
{$IFDEF VER120} //Delphi 4
Count, BytesWritten: integer;
{$ELSE}
Count, BytesWritten: cardinal;
{$ENDIF}
hPrinter,
hDeviceMode: THandle;
Device,
Driver,
Port : array[0..255] of char;
DocInfo: TDoc_Info_1;
f: file;
Buffer: Pointer;
begin
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;
________________________________________________________________________________
전기봉 wrote:
> 1. 텍스트 파일을 읽어서, 윈도 기본 프린터로 출력 합니다.
>
> while not SeekEof(DocF) do
> begin
> Readln(DocF, GetText);
> -- 제어문자 처리
> -- if 페이지스킵... 페이지스킵 처리후 continue;
> -- if 타이틀처리 (문자 굵게, 크게하고) ...
> textout 하고 continue;
> Printer.Canvas.textout(x, y, GetText);
> end;
> 와 비슷한 양식 입니다.
>
> 2. 텍스트 파일 내에는 프린트 제어를 위한 특별한 문자를 삽입했습니다.
>
> 예) INCB(Increase Bold: 문자를 굵게, 크게 표시해라)
> SKIP(Page Skip을 해라)
> 실제 GetText에는 'INCB집계표'와 같은 값이 들어갑니다.
>
> 3. 프로그램에서 if 조건으로 제어문자를 점검 합니다.
>
> 예) if Copy(GetText, 1, 4) = 'SKIP' then
> begin
> Printer.NewPage;
> I := 0; // textout의 y첨자제어용.
> continue;
> end;
> 이 예가 위 1번의 while loop 내에 존재 합니다.
>
> 4. 실제 출력을 해보면, 처음 페이지는 잘 나오는데,
> 두번째 페이지 부터 출력이 않됩니다.
>
> 5. 그래서, 서버 텍스트 파일을 편집해서 SKIP을 없애면,
> 한페이지는 정상 출력, 다음 페이지는 내용이 출력된후,
> 타이틀이 찍힙니다.
>
> 6. 디버깅을 위해서, while loop내에서 showmessage로 GetText를 찍어보면,
> 서버 파일과 동일한 내용으로 출력됩니다.
> 헌데... 결과가 ....
>
> 질문이 너무 난해한것 같아서 죄송합니다.
> 특별한 델파이 솔루션이 없어서, 어려운 방법을 택한것 같기도 하고...
> 많은 조언을 부탁드립니다.
> 질문이 이해가 안가시면, 다시금 요청해 주세요.. 감사합니다...