お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"読み仮名取得コンポーネント"

この発言に対し以下のコメントが寄せられています
#01247 かつぼー さん RE:読み仮名取得コンポーネント

IMEで変換したヨミを取得するコンポーネントを作ってみました。 なお、多くのFDELPHIの発言と、 nifty:sinprise/lib/2/416 yomiedit32.LZHを参考にしました。 type TYomiEvent = procedure(Sender: TObject; Yomi: string) of object; TYomi = class(TComponent) private FControl: TWinControl; FOldWinProc: Pointer; FProcInstance: Pointer; FOnYomi: TYomiEvent; procedure SetControl(AControl: TWinControl); procedure WndProc(var Message: TMessage); procedure WMImeComposition(var msg: TMessage); message WM_IME_COMPOSITION; protected procedure Notification( AComponent: TComponent; Operation: TOperation);override; public published property YomiControl: TWinControl read FControl write SetControl; property OnYomi: TYomiEvent read FOnYomi write FOnYomi; end; procedure Register; implementation uses Imm; procedure Register; begin RegisterComponents('Samples', [TYomi]); end; procedure TYomi.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if (Operation = opRemove) and (AComponent <> nil) and (AComponent = FControl) then begin // SetWindowLong(FControl.Handle, GWL_WNDPROC, Longint(FOldWinProc)); FreeObjectInstance(FOldWinProc); FreeObjectInstance(FProcInstance); FOldWinProc := nil; FProcInstance := nil; FControl := nil; end; end; procedure TYomi.SetControl(AControl: TWinControl); begin if AControl <> nil Then begin FProcInstance := MakeObjectInstance(WndProc); FOldWinProc := Pointer(GetWindowLong(AControl.Handle, GWL_WNDPROC)); SetWindowLong(AControl.Handle, GWL_WNDPROC, Longint(FProcInstance)); end else begin if FControl <> nil then SetWindowLong(FControl.Handle, GWL_WNDPROC, Longint(FOldWinProc)); FreeObjectInstance(FProcInstance); FOldWinProc := nil; FProcInstance := nil; end; FControl := AControl; end; procedure TYomi.WndProc(var Message: TMessage); begin with Message do Result := CallWindowProc(FOldWinProc, FControl.Handle, Msg, WParam, LParam ); if Message.Msg = WM_IME_COMPOSITION then Dispatch(Message); end; procedure TYomi.WMImeComposition(var msg: TMessage); var s: string; Imc: HIMC; Size: DWORD; begin s := ''; if (msg.lParam and GCS_RESULTREADSTR) <> 0 then begin Imc := ImmGetContext(FControl.Handle); Size := ImmGetCompositionString(Imc, GCS_RESULTREADSTR, nil, 0); SetLength(s, Size + 1); ImmGetCompositionString(Imc, GCS_RESULTREADSTR, PChar(s), Size + 1); // SetLength(s, 255); // Size := ImmGetCompositionString(Imc, GCS_RESULTREADSTR, PChar(s), 255); ImmReleaseContext(FControl.Handle, Imc); SetLength(s, Size); if Assigned(FOnYomi) then FOnYomi(FControl, s); end; inherited; end; 使い方。 フォームにYomiコンポーネントを一つ、Editを二つ、貼り付けます。 Yomi1のYomiControlプロパティに、Edit1を設定します。 Yomi1をダブルクリックして、 procedure TForm1.Yomi1Yomi(Sender: TObject; Yomi: String); begin Edit2.Text := Yomi; end; と書きます。 Edit1に日本語を入力すると、 Edit2にそのヨミが入ります。    かつぼー  Original document by かつぼー 氏 ID:(CQU00157)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum