반응형
한글 입력기 예제
목표:
"한글입력기 구현"에서 만든 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
반응형