2011년 3월 15일 화요일

indy10에서 한글깨지는 경우

uses에 IdGlobal, IdContext 추가

채팅의 경우 Acontext....ReadIn(#13, enUTF8)을 하면됨

참고로 Get()에 마우스 올려서 TIdEncoding, enDefault가 인자로 지원한다면 Get('텍스트', enUTF8); 이렇게 하면됨

========================================================================
델마당의 동영상강좌중 메신져 부분을 참고로 만들었다.

unit uClient;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls,
ExtCtrls, IdAntiFreezeBase, IdAntiFreeze, IdGlobal;
type
TfmMain = class(TForm)
Memo1: TMemo;
Edit1: TEdit;
Button1: TButton;
IdTCPClient1: TIdTCPClient;
Timer1: TTimer;
Edit2: TEdit;
Edit3: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Edit3KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmMain: TfmMain;
implementation
{$R *.dfm}
procedure TfmMain.Button1Click(Sender: TObject);begin
try
if Not IdTCPClient1.Connected then
begin
IdTCPClient1.Connect;
fmMain.Color := clLime;
Caption := '클라이언트 프로그램' + ' 동작';
IdTCPClient1.IOHandler.WriteLn(Format('Login;%s;',[Edit2.Text]),enUTF8);
end
else
begin
IdTCPClient1.Disconnect;
fmMain.Color := clRed;
Caption := '클라이언트 프로그램' + ' 멈춤';
end;
except on E: Exception do
ShowMessage('서버와 접속할 수 없습니다.');
end;
end;
procedure TfmMain.Button2Click(Sender: TObject);begin
IdTCPClient1.IOHandler.WriteLn(Format('Msg;%s;%s;%s;',[Edit2.Text, Edit3.Text, Edit1.Text]),enUTF8);
end;
procedure TfmMain.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then Begin
// Key := #0;
IdTCPClient1.IOHandler.WriteLn(Format('Talk;%s;%s;',[Edit2.Text, Edit1.Text]), enUTF8);
Edit1.Text := '';
End;
end;
procedure TfmMain.Edit2KeyPress(Sender: TObject; var Key: Char);begin
if Key = #$0D then
Button1Click(Button1);
end;
procedure TfmMain.Edit3KeyPress(Sender: TObject; var Key: Char);begin
if Key = #$0D then
Button2Click(Button2);
end;
procedure TfmMain.Timer1Timer(Sender: TObject);var
stTemp: String;
begin
if Not IdTCPClient1.Connected then Exit;
stTemp := IdTCPClient1.IOHandler.ReadLn(#10, 5, 0,enUTF8); //2009는 유니코드사용.
if stTemp <> '' then
Memo1.Lines.Add(stTemp);
end;
end.

인디는 엔터를 치고 전송하면 #$0D#$0A를 붙여서 전송한다.

댓글 없음:

댓글 쓰기