안녕 하세요...
오랜 만에 글을 올리는 군요...
서버에서 작성된 리포트를 클라이언트에서 찍는 컴퓨팅 환경 입니다.
현재 클라이언트는 도스라서...
서버가 프린트 제어코드를 포함한 리포트 형식으로 파일을 생성하면,
클라이언트는 FTP로 파일을 수신한 후,
한라인씩 무조건 프린트에 write하면 출력이 됩니다.
헌데...
클라이언트가 윈도 버젼으로 가면서는
위와 같은 방법이 잘 되지 않는군요.
서버가 많은 클라이언트를 관리 하기 때문에...
일관성을 위해서 서버에서 리포트를 생성하는 솔루션이
가장 무난한데...
클라이언트에서 출력하는 것이 문제점이 되고 있습니다.
여러분의 많은 조언을 기다리겠습니다.
소스가 지저분해서.. 올리기는 싫으나..
도움이 되시길 바랍니다..
윈도우즈에서도, 아래처럼 도스 방식으로 출력할 수 있습니다..
From 류..
---------
{$I-}
Unit Prt;
Interface
Type
CodeStr = String[20];
Const
KSSM : Packed Array [1..48] of CodeStr
= (
'KSSM', '46',
'#폼피드', #12,
'#초기화', #27+'@',
'#1/180', #27+'J'+#1,
'#2/180', #27+'J'+#2,
'#5/180', #27+'J'+#5,
'#10/180', #27+'J'+#10,
'#18/180', #27+'J'+#18,
'#완성형', #27+'@'+#28+'&'+#28+'t0',
'#조합형', #27+'@'+#28+'&'+#28+'t1',
'#이탤릭체지정', #27+'4',
'#이탤릭체취소', #27+'5',
'#강조체지정', #27+'E',
'#강조체취소', #27+'F',
'#일반문자', #27+'q'+#0,
'#음각문자', #27+'q'+#1,
'#영상문자', #27+'q'+#2,
'#음각영상', #27+'q'+#3,
'#두배확대', #28+'W1',
'#두배취소', #28+'W0',
'#가로두배지정', #27+'W'+#1,
'#가로두배취소', #27+'W'+#0,
'#세로두배지정', #27+'y'+#1,
'#세로두배취소', #27+'y'+#0
);
KS : Packed Array [1..48] of CodeStr
= (
'KS', '46',
'#폼피드', #12,
'#초기화', #27+'@',
'#1/180', #27+'J'+#1,
'#2/180', #27+'J'+#2,
'#5/180', #27+'J'+#5,
'#10/180', #27+'J'+#10,
'#18/180', #27+'J'+#18,
'#고딕체', #27+'m'+#1,
'#명조체', #27+'m'+#0,
'#이탤릭체지정', #27+'4',
'#이탤릭체취소', #27+'5',
'#강조체지정', #27+'E',
'#강조체취소', #27+'F',
'#역상지정', #27+'r'+#1,
'#역상취소', #27+'r'+#0,
'#음영지정', #27+'z'+#1,
'#음영취소', #27+'z'+#0,
'#1.5배지정', #27+'s'+#1,
'#1.5배취소', #27+'s'+#0,
'#가로두배지정', #27+'W'+#1,
'#가로두배취소', #27+'W'+#0,
'#세로두배지정', #27+'y'+#1,
'#세로두배취소', #27+'y'+#0
);
Var
PrtFile : TextFile;
TimeOut, PrtError : Byte;
PrintPage : Boolean;
PrintFileName : String;
Procedure OpenPrinter;
Procedure PrintStr(Strg:String);
Procedure PrintLnStr(Strg:String);
Procedure PrintCode(Code:Array of CodeStr; Strg:String);
Procedure PrintLnCode(Code:Array of CodeStr; Strg:String);
Procedure PrintFile(code:Array of CodeStr; FileName:String);
Procedure CRLF(Lines:Word);
Procedure FormFeed;
Procedure ClosePrinter;
Implementation
Uses
Windows, SysUtils, Forms, Dialogs, Printers, Strg, Bit;
Procedure TranslateHex(Var St:String);
Var
Position, TempInt : Integer;
TempStr, TempStr1, TempStr2 : String;
Begin
Position:= Pos('~[', St);
While Position > 0 do
Begin
TempStr1:= Copy(St, Position+2, Length(St));
TempInt:= Pos(']~', TempStr1);
If TempInt > 0 then Dec(TempInt);
SetLength(TempStr1, TempInt);
If TempStr1 <> '' then
Begin
TempStr2:= TempStr1;
TempStr:= '';
While TempStr2 <> '' do
Begin
TempStr:= TempStr + Char(HexToByte(Copy(TempStr2, 1, 2)));
Delete(TempStr2, 1, 2);
End;
Translate(St, '~['+TempStr1+']~', TempStr);
End
Else Delete(St, Position, 2);
Position:= Pos('~[', St);
End;
end;
Procedure OpenPrinter;
Begin
PrtError:= 0;
AssignFile(PrtFile, PrintFileName);
ReWrite(PrtFile);
If IOResult <> 0 then
Begin
PrtError:= 1;
ShowMessage('프린터를 점검하여 주십시오. ');
End;
End;
Procedure PrintStr(Strg:String);
Begin
Write(PrtFile, Strg);
End;
Procedure PrintLnStr(Strg:String);
Begin
WriteLn(PrtFile, Strg);
End;
Procedure PrintCode(Code:Array of CodeStr; Strg:String);
Var
Loop, ListSize : Integer;
TempStr : String;
Begin
ListSize:= StrToInt(Code[1]);
TempStr:= Strg;
For Loop:= 1 to ListSize Div 2 Do
Begin
Translate(TempStr, Code[Loop*2], Code[Loop*2+1]);
If Pos('#폼피드', TempStr) > 0 then PrintPage:= True;
If Pos(#12, TempStr) > 0 then PrintPage:= True;
End;
TranslateHex(TempStr);
Write(PrtFile, TempStr);
End;
Procedure PrintLnCode(Code:Array of CodeStr; Strg:String);
Var
Loop, ListSize : Integer;
TempStr : String;
Begin
ListSize:= StrToInt(Code[1]);
TempStr:= Strg;
For Loop:= 1 to ListSize Div 2 Do
Begin
Translate(TempStr, Code[Loop*2], Code[Loop*2+1]);
If Pos('#폼피드', TempStr) > 0 then PrintPage:= True;
If Pos(#12, TempStr) > 0 then PrintPage:= True;
End;
TranslateHex(TempStr);
WriteLn(PrtFile, TempStr);
End;
Procedure PrintFile(Code:Array of CodeStr; FileName:String);
Var
PFile : TextFile;
Line : String;
Begin
PrtError:= 0;
AssignFile(PFile, FileName);
Reset(PFile);
If IOResult = 0 then
Begin
Repeat
Line[1]:= 'X';
ReadLn(PFile, Line);
If Line[1] = '.' then
Begin
Delete(Line, 1, 1);
PrintCode(Code, Line);
End
Else PrintLnCode(Code, Line);
Until EOF(PFile);
CloseFile(PFile);
End
Else
Begin
PrtError:= 1;
ShowMessage('화일을 읽을 수가 없습니다.');
End;
End;
Procedure CRLF(Lines:Word);
Var
Loop : Word;
Begin
For Loop:= 1 to Lines Do WriteLn(PrtFile);
End;
Procedure FormFeed;
Begin
Write(PrtFile, #12);
End;
Procedure ClosePrinter;
Begin
CloseFile(PrtFile);
End;
{ 기존에 있던 것
Begin
PrintFileName:= 'LPT1';
End.
}
// 경문이가 고친 것
Var
aDevice, aDriver, aPort: PChar;
aHandle: THandle;
Begin
GetMem(aDevice, 50); // 50은 충분히 큰 값
GetMem(aDriver, 50);
GetMem(aPort, 50);
Printer.GetPrinter(aDevice, aDriver, aPort, aHandle);
PrintFileName:= StrPas(aPort);
FreeMem(aDevice);
FreeMem(aDriver);
FreeMem(aPort);
End.
전기봉 wrote:
> 안녕 하세요...
> 오랜 만에 글을 올리는 군요...
>
> 서버에서 작성된 리포트를 클라이언트에서 찍는 컴퓨팅 환경 입니다.
> 현재 클라이언트는 도스라서...
> 서버가 프린트 제어코드를 포함한 리포트 형식으로 파일을 생성하면,
> 클라이언트는 FTP로 파일을 수신한 후,
> 한라인씩 무조건 프린트에 write하면 출력이 됩니다.
>
> 헌데...
> 클라이언트가 윈도 버젼으로 가면서는
> 위와 같은 방법이 잘 되지 않는군요.
>
> 서버가 많은 클라이언트를 관리 하기 때문에...
> 일관성을 위해서 서버에서 리포트를 생성하는 솔루션이
> 가장 무난한데...
>
> 클라이언트에서 출력하는 것이 문제점이 되고 있습니다.
> 여러분의 많은 조언을 기다리겠습니다.
>
>
>