자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi 델파이7과 델파이XE에서의 동일 함수의 리턴값이 서로 다릅니다.
2012.05.03 20:29
궁금한 사항이 있어서 문의드립니다.
Delphi7과 Delphi XE에서 아래의 함수를 각각 실행해 보았을 때Return(sT)값이 서로 틀리게 넘어오는데 왜 그런지 확인 부탁드립니다.
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, ComCtrls, ExtCtrls;
type TForm1 = class(TForm) Button1: TButton; IdTCPClient: TIdTCPClient; Button2: TButton; Button3: TButton; edtIp: TEdit; edtPort: TEdit; Label1: TLabel; Label2: TLabel; lStatus: TPanel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
const STX = #$02; ETX = #$03;
LF = #$0A; // Line Feed CR = #$0D; // Carriage Return SO = #$0E; // 확대적용 SI = #$0F; // 확대취소
implementation
{$R *.DFM}
// CRC를 계산해 준다function funGetCrc( lsData : String ) : String;var crc,temp : Word; lnI,lnJ,lnL : Integer; SEED : word;begin
SEED := $8005; crc := $ffff;
if Length(lsdata) = 0 then begin result := #$00#$00; Exit; end;
lnL := length(lsData);
for lnI := 1 to lnL do begin temp := byte(lsData[lnI]) and $00ff; for lnJ := 1 to 8 do begin if ((crc and $0001) xor (temp and $0001)) <> $0000 then begin crc := (crc shr 1) xor SEED; end else begin crc := (crc shr 1); end; temp := (temp shr 1); end; end;
result := chr(low(Temp)) + chr(low(crc)) ;
crc := not crc; temp := crc; crc := (crc shl 8) or ((temp shr 8) and $00ff);
temp := (crc shr 8); crc := (crc shl 8); crc := (crc shr 8);
result := chr(Temp) + chr(crc);
end;
function funMakePrt( PrtFileName, PrtData : String ) : String;var sT : String; iT : integer;begin SetLength(sT,17); FillChar(Pointer(sT)^,17,' '); Move(Pointer(PrtFileName)^,Pointer(sT)^,Length(PrtFileName));
sT := sT + FormatFloat('0000',Length(PrtData)) + PrtData ; iT := Length(sT); sT := Chr((iT shr 8)) + Chr((iT and $ff)) + 'P' + sT + #$03;
Result := #$02 + sT + funGetCrc(sT);end;
procedure TForm1.Button1Click(Sender: TObject);var Command: string; sSendStr: string; sPrtFileName: string;begin Command := 'C' + CR + LF; Command := Command + 'T110' + '일반' + CR + LF; Command := Command + 'T110' + SO + '가로확대' + SI + CR + LF; Command := Command + 'T110' + SO + '세로확대' + SI + CR + LF; Command := Command + 'T110' + SO + '가로세로확대' + SI + CR + LF; Command := Command + 'L50' + CR + LF; // 라인피드 5회 Command := Command + 'PC' + CR + LF; // 프린트 & 컷팅
sPrtFileName := 'A123456' + FormatDatetime('MMddhhmmss',Now);
// 1. 델파이7에서 실행했을 때와 델파이 XE에서 실행했을 때의 함수 리턴값(=sSendStr)이 서로 틀립니다. sSendStr := funMakePrt(sPrtFileName, Command);
// 2. 아래의 코드를 XE에서 실행하면 오류가 발생을 하는데// XE에서 실행하려 하면 어떻게 변경해야 하는지요.. IdTcpClient.Socket.Send(pointer(sSendStr)^,length(sSendStr));end;
procedure TForm1.Button2Click(Sender: TObject);begin with IdTcpClient do begin Host := edtIp.Text; Port := StrToInt(edtPort.Text); try Connect; if Connected then begin lStatus. Caption := '연결성공'; end; except MessageDlg('TS-163N 단말기 연결 실패', mtInformation, [mbOk], 0); end; end;
end;
procedure TForm1.Button3Click(Sender: TObject);begin// IdTcpClient.Socket.InputBuffer.Clear; IdTcpClient.Disconnect; lStatus.Caption := '';
end;
end.
댓글 2
Delphi 델파이7과 델파이XE에서의 동일 함수의 리턴값이 서로 다릅니다.
2012.05.03 20:29
궁금한 사항이 있어서 문의드립니다.
Delphi7과 Delphi XE에서 아래의 함수를 각각 실행해 보았을 때
Return(sT)값이 서로 틀리게 넘어오는데
왜 그런지 확인 부탁드립니다.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
ComCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
IdTCPClient: TIdTCPClient;
Button2: TButton;
Button3: TButton;
edtIp: TEdit;
edtPort: TEdit;
Label1: TLabel;
Label2: TLabel;
lStatus: TPanel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
const
STX = #$02;
ETX = #$03;
LF = #$0A; // Line Feed
CR = #$0D; // Carriage Return
SO = #$0E; // 확대적용
SI = #$0F; // 확대취소
implementation
{$R *.DFM}
// CRC를 계산해 준다
function funGetCrc( lsData : String ) : String;
var crc,temp : Word;
lnI,lnJ,lnL : Integer;
SEED : word;
begin
SEED := $8005;
crc := $ffff;
if Length(lsdata) = 0 then
begin
result := #$00#$00;
Exit;
end;
lnL := length(lsData);
for lnI := 1 to lnL do
begin
temp := byte(lsData[lnI]) and $00ff;
for lnJ := 1 to 8 do
begin
if ((crc and $0001) xor (temp and $0001)) <> $0000 then
begin
crc := (crc shr 1) xor SEED;
end else
begin
crc := (crc shr 1);
end;
temp := (temp shr 1);
end;
end;
result := chr(low(Temp)) + chr(low(crc)) ;
crc := not crc;
temp := crc;
crc := (crc shl 8) or ((temp shr 8) and $00ff);
temp := (crc shr 8);
crc := (crc shl 8);
crc := (crc shr 8);
result := chr(Temp) + chr(crc);
end;
function funMakePrt( PrtFileName, PrtData : String ) : String;
var
sT : String;
iT : integer;
begin
SetLength(sT,17);
FillChar(Pointer(sT)^,17,' ');
Move(Pointer(PrtFileName)^,Pointer(sT)^,Length(PrtFileName));
sT := sT + FormatFloat('0000',Length(PrtData)) + PrtData ;
iT := Length(sT);
sT := Chr((iT shr 8)) + Chr((iT and $ff)) + 'P' + sT + #$03;
Result := #$02 + sT + funGetCrc(sT);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Command: string;
sSendStr: string;
sPrtFileName: string;
begin
Command := 'C' + CR + LF;
Command := Command + 'T110' + '일반' + CR + LF;
Command := Command + 'T110' + SO + '가로확대' + SI + CR + LF;
Command := Command + 'T110' + SO + '세로확대' + SI + CR + LF;
Command := Command + 'T110' + SO + '가로세로확대' + SI + CR + LF;
Command := Command + 'L50' + CR + LF; // 라인피드 5회
Command := Command + 'PC' + CR + LF; // 프린트 & 컷팅
sPrtFileName := 'A123456' + FormatDatetime('MMddhhmmss',Now);
// 1. 델파이7에서 실행했을 때와 델파이 XE에서 실행했을 때의 함수 리턴값(=sSendStr)이 서로 틀립니다.
sSendStr := funMakePrt(sPrtFileName, Command);
// 2. 아래의 코드를 XE에서 실행하면 오류가 발생을 하는데
// XE에서 실행하려 하면 어떻게 변경해야 하는지요..
IdTcpClient.Socket.Send(pointer(sSendStr)^,length(sSendStr));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
with IdTcpClient do
begin
Host := edtIp.Text;
Port := StrToInt(edtPort.Text);
try
Connect;
if Connected then
begin
lStatus. Caption := '연결성공';
end;
except
MessageDlg('TS-163N 단말기 연결 실패', mtInformation, [mbOk], 0);
end;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
// IdTcpClient.Socket.InputBuffer.Clear;
IdTcpClient.Disconnect;
lStatus.Caption := '';
end;
end.
아마도 Length 함수에서 길이를 구해오는 차이에서 발생하는 문제 인것 같습니다.
기본적으로 델파이XE에서는 Unicode를 사용하고 있기 때문에 이전에 2바이트로 처리되던 한글을
1바이트로 인식하고 있어서 나타나는 문제가 아니가 싶습니다.
예를들면 Length('한글')는 델파이 XE에서 2로 리턴합니다.
델파이7이었으면 4의 값이 돌아 오겠죠
결론적으로 XE에서는 영문 혹은 한글 동일하게 한개의 문자로 인식하므로
거기에 맞게 코딩을 해주셔야 문제가 없습니다.