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
|