2011-05-09 3 views
4

프린터 드라이버를 사용하지 않고 esc/p 명령 (EPSON TM-T70)을 사용하여 프린터로 직접 인쇄하려고합니다. 코드는 here입니다.직접 인쇄를 사용할 때 문자열이 잘리는 이유는 무엇입니까?

그러나 문자열을 인쇄하려고하면 잘립니다. 예 :

MyPrinter := TRawPrint.Create(nil); 
try 
    MyPrinter.DeviceName := 'EPSON TM-T70 Receipt'; 
    MyPrinter.JobName := 'MyJob'; 
    if MyPrinter.OpenDevice then 
    begin 
    MyPrinter.WriteString('This is page 1'); 
    MyPrinter.NewPage; 
    MyPrinter.WriteString('This is page 2'); 
    MyPrinter.CloseDevice; 
    end; 
finally 
    MyPrinter.Free; 
end; 

"This isThis is this"입니다. 줄 바꿈 명령을 보내려면 일반적으로 MyPrinter.NewPage을 사용하지 않지만 관계없이 왜 문자열을 자릅니다? I 코드를 통해 단계가 중단 점을 넣으면

Result := False; 
if IsOpenDevice then begin 
    Result := True; 
    if not WritePrinter(hPrinter, PChar(Text), Length(Text), WrittenChars) then begin 
    RaiseError(GetLastErrMsg); 
    Result := False; 
    end; 
end; 

다음 WrittenChars가 14로 설정되어, 올바른 :

또한 RawPrint 단위 WriteString 함수를 알. 왜 그렇게 행동합니까?

+0

어떤 델파이 버전입니까? –

답변

4

유니 코드 사용 버전의 델파이를 사용하고 있습니다. 챠리스는 2 바이트 길이입니다. Length(s)으로 함수를 호출하면 char 수를 전송하지만 함수는 아마도 버퍼 크기를 예상합니다. SizeOf ( Length(s)*SizeOf(Char))로 교체하십시오.

유니 코드 문자의 크기가 정확하게 2 바이트이기 때문에 버퍼 크기가 필요할 때 Length을 전송할 때 버퍼의 절반 만 사용하도록 API에 말합니다. 따라서 모든 문자열은 대략 반으로 나뉩니다.

+0

답변 해 주셔서 감사합니다. SizeOf는 나에게 4라는 값 (문자열의 크기?)을주었습니다. 그래서 문자열은 더 잘려졌습니다. 하지만 2로 길이를 곱하면 모든 것이 OK입니다. 나는 해결책으로 나를 인도 한 것처럼 당신의 대답을 받아들입니다. 다시 한 번 감사드립니다 – Peacelyk

4

아마도 문자열의 길이를 바이트 단위로 나타내는 ByteLength 함수를 사용할 수 있습니다.

+1

+1 그게 내가 찾고 있었지만 찾으려하지 않았습니다. 물론 Length (S) * SizeOf (Char)로 구현되었지만 깨끗하게 보이고 버퍼 길이 개념을 훨씬 잘 표현합니다. –

관련 문제