2011년 3월 3일 목요일

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를 붙여서 전송한다.

댓글 없음:

댓글 쓰기