본문 바로가기
Application/Delphi Lecture

한글 입력기 예제

by 현이빈이 2008. 7. 24.
반응형

한글 입력기 예제

목표:

"한글입력기 구현"에서 만든 THanInput 콤포넌트를 가지고 실제로 데모 어플리케이션을 제작해 보겠습니다. 기본적으로 form 상에는 각각의 한글 자모가 씌여진 버튼과, 백스페이스, 클리어, 그리고 영문자 버튼이 있으며, 이것을 눌림에 따라서 화면상에 조합된 문자열이 나타나게 됩니다.

배경지식:

  • 한글입력기 구현 참조.
  • "한글입력기 구현"에서 만든 THanInput 콤포넌트는 한글 한 글자 만을 조합, 수정하는 것으로 문자열에 대한 조합은 따로 처리를 해야만 합니다. 예를 들어서, THanInput.Insert 함수의 리턴값은 현재 상태에서 조합이 끝난 (더이상 조합이 불가능한) 문자입니다. 다시 말해서 현재 조합중인 글자가 "갈" 인 경우에 "ㅕ"가 입력된다면, "가"라는 글자는 조합이 완료되어 리턴값으로 나오게 되고, 새로이 "려"라는 글자가 한글 입력기 내부에 저장되게 됩니다. 따라서 문자열을 처리하려면 조합이 완료된 문자(THanInput.Insert의 리턴값)와 현재 조합중인 문자(THanInput.Composing)를 적절히 처리해 주는 로직이 필요한 거지요.
  • 예외적으로 THanInput 콤포넌트에 "#8" (백스페이스)가 입력되면 현재 조합중인 문자에서 최종적인 하나의 자모를 빼는 기능을 합니다. 만일 현재 조합중인 문자가 없다면, 이미 조합이 완료된 문자열에서 최후의 한 문자를 제거하도록 해야겠죠.

코드:

코드는 소스 파일 (.pas) 과 폼 파일 (.dfm) 두 가지로 이루어 집니다.

소스 파일 (unit1.pas)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  CuteHanIME, StdCtrls, ExtCtrls, HanInput;

type
  TForm1 = class(TForm)
    HanInput1: THanInput;
    Panel1: TPanel;
    Label1: TLabel;
    btnBS: TButton;
    btnClear: TButton;
    btnSPC: TButton;
    btnA: TButton;
    procedure FormCreate(Sender: TObject);
    procedure ButtonClick(Sender: TObject);
    procedure btnClearClick(Sender: TObject);
    procedure btnBSClick(Sender: TObject);
    procedure btnSPCClick(Sender: TObject);
    procedure btnAClick(Sender: TObject);
  private
    { Private declarations }
    function DelLastLetter(const Src: string): string;
  public
    { Public declarations }
    Composed: string;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
const
  Roman = 'rRseEfaqQtTdwWczxvgkoiOjpuPhynbml';
  Hangul = 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ' +
           'ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅛㅜㅠㅡㅣ';
  cRow = 4;
  cColumn = 9;
var
  I, J: Integer;
begin
  // Create buttons
  for I := 0 to cRow - 1 do
    for J := 0 to cColumn - 1 do
      with TButton.Create(Self) do begin
        Parent := Panel1;
        Left := J * Panel1.Width div cColumn;
        Top := I * Panel1.Height div cRow;
        Width := Panel1.Width div cColumn;
        Height := Panel1.Height div cRow;
        Caption := Copy(Hangul, 1 + (I * cColumn + J) * 2, 2);
        Hint := Copy(Roman, 1 + I * cColumn + J, 1);
        OnClick := ButtonClick;
      end;
end;

procedure TForm1.ButtonClick(Sender: TObject);
var
  Tmp: string;
begin
  Tmp := (Sender as TButton).Hint;
  if Tmp = '' then Exit;
  Composed := Composed + HanInput1.Insert(Tmp[1]);
  Label1.Caption := Composed + '&' + HanInput1.Composing;
end;

procedure TForm1.btnClearClick(Sender: TObject);
begin
  HanInput1.Init;
  Composed := '';
  Label1.Caption := '';
end;

procedure TForm1.btnBSClick(Sender: TObject);
var
  BS: Char;
begin
  BS := #8;
  if HanInput1.Composing = '' then begin
    Composed := DelLastLetter(Composed);
  end else begin
    HanInput1.Insert(BS);
  end;
  Label1.Caption := Composed + '&' + HanInput1.Composing;
end;

procedure TForm1.btnSPCClick(Sender: TObject);
begin
  Composed := Composed + HanInput1.Composing + ' ';
  HanInput1.Init;
  Label1.Caption := Composed + '&' + HanInput1.Composing;
end;

procedure TForm1.btnAClick(Sender: TObject);
begin
  Composed := Composed + HanInput1.Composing + 'A';
  HanInput1.Init;
  Label1.Caption := Composed + '&' + HanInput1.Composing;
end;

function TForm1.DelLastLetter(const Src: string): string;
var
  Tmp: WideString;
begin
  Tmp := WideString(Composed);
  Tmp := Copy(Tmp, 1, Length(Tmp) - 1);
  Result := string(Tmp);
end;

end.

폼 파일 (unit1.dfm)

object Form1: TForm1
  Left = 192
  Top = 107
  Width = 411
  Height = 316
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -27
  Font.Name = '굴림'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 27
  object Label1: TLabel
    Left = 8
    Top = 16
    Width = 377
    Height = 35
    AutoSize = False
    Caption = '&'
    ParentColor = False
    Layout = tlCenter
  end
  object Panel1: TPanel
    Left = 8
    Top = 64
    Width = 369
    Height = 169
    TabOrder = 0
  end
  object btnBS: TButton
    Left = 64
    Top = 248
    Width = 49
    Height = 25
    Caption = '<'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -13
    Font.Name = '굴림'
    Font.Style = []
    ParentFont = False
    TabOrder = 1
    OnClick = btnBSClick
  end
  object btnClear: TButton
    Left = 8
    Top = 248
    Width = 49
    Height = 25
    Caption = 'Clear'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -13
    Font.Name = '굴림'
    Font.Style = []
    ParentFont = False
    TabOrder = 2
    OnClick = btnClearClick
  end
  object btnSPC: TButton
    Left = 120
    Top = 248
    Width = 57
    Height = 25
    Caption = 'SPC'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -13
    Font.Name = '굴림'
    Font.Style = []
    ParentFont = False
    TabOrder = 3
    OnClick = btnSPCClick
  end
  object btnA: TButton
    Left = 184
    Top = 248
    Width = 57
    Height = 25
    Caption = 'A'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -13
    Font.Name = '굴림'
    Font.Style = []
    ParentFont = False
    TabOrder = 4
    OnClick = btnAClick
  end
  object HanInput1: THanInput
    Left = 72
    Top = 72
  end
end
반응형