DoboWiki
Top
> .NETプログラミング研究/87 をテンプレートにして作成
.NETプログラミング研究/87 をテンプレートにして作成
開始行:
#title(Visual Studio International Pack: Japanese Yomi Au...
#navi(.NETプログラミング研究)
#contents
*Visual Studio International Pack: Japanese Yomi Auto-Com...
Japanese Yomi Auto-Completion Libraryは、テキストボックス...
**ダウンロードとインストール [#wd828c82]
Japanese Yomi Auto-Completion Libraryをインストールする手...
またプロジェクトの参照に「YomiAutoCompletion.dll」を追加...
**YomiAutoCompletionListenerクラス [#ofcbe26d]
Japanese Yomi Auto-Completion Libraryの使い方は非常に簡単...
テキストボックス"TextBox1"にオートコンプリート機能を付け...
#code(vbnet){{
Private listener As Microsoft.International.Windows.YomiA...
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, ByVal e As...
Handles MyBase.Load
Me.listener = _
New Microsoft.International.Windows.YomiAutoCompl...
End Sub
}}
#code(csharp){{
private Microsoft.International.Windows.YomiAutoCompletio...
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
this.listener =
new Microsoft.International.Windows.YomiAutoCompl...
}
}}
例えば、このテキストボックスに日本語IMEを使って"青森"と入...
&ref(YomiAutoCompletion1.png);
このようにJapanese Yomi Auto-Completion Libraryは、日本語...
読みがなの登録はテキストボックスの内容が空であってもそう...
***自動的に登録される読みがなはどのように決定されるか [#q...
自動的に登録される読みがなは、ユーザーが実際にIMEで入力し...
***候補ウィンドウの実体 [#f9d60395]
候補ウィンドウの実体はCandidatesWindowクラスというもので...
**TextBoxクラスをオーバーライドして、オートコンプリート機...
TextBoxクラスをオーバーライドして、オートコンプリート機能...
#code(vbnet){{
''' <summary>
''' Japanese Yomi Auto-Completion Libraryを使って
''' 日本語IMEでのオートコンプリート機能を可能にしたテキス...
''' </summary>
Public Class YomiAutoCompleteTextBox
Inherits System.Windows.Forms.TextBox
Private listener As Microsoft.International.Windows.Y...
''' <summary>
''' 使用しているYomiAutoCompletionListener
''' </summary>
Public ReadOnly Property YomiAutoCompletionListener()...
Microsoft.International.Windows.YomiAutoCompletio...
Get
Return Me.listener
End Get
End Property
Public Sub New()
Me.listener = _
New Microsoft.International.Windows.YomiAutoC...
End Sub
End Class
}}
#code(csharp){{
/// <summary>
/// Japanese Yomi Auto-Completion Libraryを使って
/// 日本語IMEでのオートコンプリート機能を可能にしたテキス...
/// </summary>
public class YomiAutoCompleteTextBox : System.Windows.For...
{
private Microsoft.International.Windows.YomiAutoCompl...
/// <summary>
/// 使用しているYomiAutoCompletionListener
/// </summary>
public Microsoft.International.Windows.YomiAutoComple...
YomiAutoCompletionListener
{
get { return this.listener; }
}
public YomiAutoCompleteTextBox()
{
this.listener =
new Microsoft.International.Windows.YomiAutoC...
}
}
}}
このクラスを使用する方法は、「[[「○○○クラスの代わりに派生...
**登録された読みがなと候補を保存、復元する [#restoreyomi]
Japanese Yomi Auto-Completion Libraryで自動的に登録された...
今まで登録されている読みがなのリストは、YomiAutoCompletio...
以下に、現在登録されているソースリストをファイルに保存、...
#code(vbnet){{
Private listener As Microsoft.International.Windows.YomiA...
'オートコンプリートソースを保存するファイル
Private yomiListFile As String = _
System.IO.Path.Combine(Application.StartupPath, "yomi...
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, ByVal e As...
Handles MyBase.Load
Me.listener = _
New Microsoft.International.Windows.YomiAutoCompl...
'ソースリストを読み込む
If System.IO.File.Exists(Me.yomiListFile) Then
Me.LoadYomiSource(Me.yomiListFile, Me.listener)
End If
End Sub
'フォームのFormClosedイベントハンドラ
Private Sub Form1_FormClosed(ByVal sender As Object, ByVa...
Handles MyBase.FormClosed
'ソースリストを保存する
Me.SaveYomiSource(Me.yomiListFile, Me.listener)
End Sub
''' <summary>
''' YomiAutoCompletionListenerのオートコンプリートソース...
''' </summary>
''' <param name="filePath">保存先のファイル</param>
''' <param name="listen">保存するYomiAutoCompletionListen...
Public Sub SaveYomiSource(ByVal filePath As String, _
ByVal listen As Microsoft.International.Windows.Y...
Using strm As New System.IO.StreamWriter(filePath)
For Each strYomi As Microsoft.International.Windo...
In listen.ContextManager.Source
strm.WriteLine( _
String.Format("{0}" & vbTab & "{1}", strY...
Next
End Using
End Sub
''' <summary>
''' YomiAutoCompletionListenerのオートコンプリートソース...
''' </summary>
''' <param name="filePath">復元するファイル</param>
''' <param name="listen">復元先のYomiAutoCompletionListen...
Public Sub LoadYomiSource(ByVal filePath As String, _
ByVal listen As Microsoft.International.Windows.Y...
Using strm As New System.IO.StreamReader(filePath)
listen.ContextManager.Source.Clear()
Dim line As String = strm.ReadLine()
While (line IsNot Nothing)
Dim vals As String() = line.Split(New Char() ...
If vals.Length = 2 Then
listen.ContextManager.Source.Add(vals(0),...
End If
line = strm.ReadLine()
End While
End Using
End Sub
}}
#code(csharp){{
private Microsoft.International.Windows.YomiAutoCompletio...
//ソースリストを保存するファイル
string yomiListFile =
System.IO.Path.Combine(Application.StartupPath, "yomi...
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
this.listener =
new Microsoft.International.Windows.YomiAutoCompl...
//ソースリストを読み込む
if (System.IO.File.Exists(this.yomiListFile))
this.LoadYomiSource(this.yomiListFile, this.liste...
}
//フォームのFormClosedイベントハンドラ
private void Form1_FormClosed(object sender, FormClosedEv...
{
//ソースリストを保存する
this.SaveYomiSource(this.yomiListFile, this.listener);
}
/// <summary>
/// YomiAutoCompletionListenerのソースリストをファイルに...
/// </summary>
/// <param name="filePath">保存先のファイル</param>
/// <param name="listen">保存するYomiAutoCompletionListen...
public void SaveYomiSource(
string filePath,
Microsoft.International.Windows.YomiAutoCompletionLis...
{
using (System.IO.StreamWriter strm = new System.IO.St...
{
foreach (Microsoft.International.Windows.StringYo...
in listen.ContextManager.Source)
{
strm.WriteLine(string.Format("{0}\t{1}", strY...
}
}
}
/// <summary>
/// YomiAutoCompletionListenerのソースリストをファイルか...
/// </summary>
/// <param name="filePath">復元するファイル</param>
/// <param name="listen">復元先のYomiAutoCompletionListen...
public void LoadYomiSource(
string filePath,
Microsoft.International.Windows.YomiAutoCompletionLis...
{
using (System.IO.StreamReader strm = new System.IO.St...
{
listen.ContextManager.Source.Clear();
string line;
while ((line = strm.ReadLine()) != null)
{
string[] vals = line.Split(new char[] { '\t' ...
if (vals.Length == 2)
{
listen.ContextManager.Source.Add(vals[0],...
}
}
}
}
}}
**読みがなを独自に提供する [#ebe5af3e]
デフォルトではIMEで確定された文字列に対する読みがなが自動...
その方法は、ヘルプの「自分の辞書を利用する方法」にありま...
ヘルプで紹介されているIYomiProviderインターフェイスを実装...
#code(vbnet){{
Public Class MyYomiProvider
Implements Microsoft.International.Windows.IYomiProvi...
Public Function GetYomi(ByVal text As String) As _
System.Collections.ObjectModel.ReadOnlyCollec...
Implements Microsoft.International.Windows.IY...
Dim yomiCandidates As New List(Of String)()
Select Case text
Case "日本"
yomiCandidates.Add("にほん")
yomiCandidates.Add("にっぽん")
Exit Select
Case "日本人"
yomiCandidates.Add("にほんじん")
yomiCandidates.Add("にっぽんじん")
Exit Select
Case Else
Exit Select
End Select
Return New System.Collections.ObjectModel.ReadOnl...
(yomiCandidates)
End Function
End Class
}}
#code(csharp){{
public class MyYomiProvider :
Microsoft.International.Windows.IYomiProvider
{
public System.Collections.ObjectModel.ReadOnlyCollect...
string text)
{
List<string> yomiCandidates = new List<string>();
switch (text)
{
case "日本":
yomiCandidates.Add("にほん");
yomiCandidates.Add("にっぽん");
break;
case "日本人":
yomiCandidates.Add("にほんじん");
yomiCandidates.Add("にっぽんじん");
break;
default:
break;
}
return new System.Collections.ObjectModel.ReadOnl...
yomiCandidates);
}
}
}}
このクラスを利用するには、次のようにYomiAutoCompletionCon...
#code(vbnet){{
Private listener As Microsoft.International.Windows.YomiA...
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, ByVal e As...
Handles MyBase.Load
Me.listener = _
New Microsoft.International.Windows.YomiAutoCompl...
'YomiProviderを変更する
Me.listener.ContextManager.YomiProvider = New MyYomiP...
End Sub
}}
#code(csharp){{
private Microsoft.International.Windows.YomiAutoCompletio...
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
this.listener =
new Microsoft.International.Windows.YomiAutoCompl...
//YomiProviderを変更する
this.listener.ContextManager.YomiProvider = new MyYom...
}
}}
このようにして、TextBox1に日本語IMEで"に"と入力しても、候...
なぜはじめから候補ウィンドウが表示されないのかというと、...
よってこの例のように、提供される読みがなが少数であれば、...
***ある文字列について、GetYomiメソッドが返す読みがなをソ...
ユーザーがIMEで確定するのではなく、プログラムによって、あ...
例えば上記の例において、"日本"の読みがなの"にほん"と"にっ...
#code(vbnet){{
Me.listener = _
New Microsoft.International.Windows.YomiAutoCompletio...
'YomiProviderを変更する
Me.listener.ContextManager.YomiProvider = New MyYomiProvi...
'"日本"の読みがなをソースリストに追加する
Me.listener.ContextManager.AddToSource("日本", Nothing)
}}
#code(csharp){{
this.listener =
new Microsoft.International.Windows.YomiAutoCompletio...
//YomiProviderを変更する
this.listener.ContextManager.YomiProvider = new MyYomiPro...
//"日本"の読みがなをソースリストに追加する
this.listener.ContextManager.AddToSource("日本", null);
}}
**独自のソースリストだけを使い、入力された読みがなを登録...
先に述べたように、IYomiProviderを実装するよりも、ソースリ...
「[[登録された読みがなと候補を保存、復元する>#restoreyomi...
#code(vbnet){{
Me.listener = _
New Microsoft.International.Windows.YomiAutoCompletio...
'ユーザーが入力した読みがなを登録しない
Me.listener.ContextManager.YomiProvider = Nothing
If System.IO.File.Exists(Me.yomiListFile) Then
Me.LoadYomiSource(Me.yomiListFile, Me.listener)
End If
}}
#code(csharp){{
this.listener =
new Microsoft.International.Windows.YomiAutoCompletio...
//ユーザーが入力した読みがなを登録しない
this.listener.ContextManager.YomiProvider = null;
if (System.IO.File.Exists(this.yomiListFile))
this.LoadYomiSource(this.yomiListFile, this.listener);
}}
**複数のYomiAutoCompletionListenerのソースリストを共有す...
複数のテキストボックスで同じYomiAutoCompletionListenerを...
同期の方法やタイミングはいろいろ考えられますが、ここではI...
具体的なサンプルは以下のようになります。
#code(vbnet){{
''' <summary>
''' 複数のYomiAutoCompletionListenerでソースを共有するIYo...
''' </summary>
Public Class SharedSourceYomiProvider
Implements Microsoft.International.Windows.IYomiProvi...
'同期するすべてのソース
Private Shared sharedSources As New List( _
Of Microsoft.International.Windows.YomiStringColl...
'このYomiAutoCompletionListenerのソース
Private source As Microsoft.International.Windows.Yom...
'このIYomiProviderの基になるIYomiProvider
Private yomiProvider As Microsoft.International.Windo...
''' <summary>
''' SharedSourceYomiProviderのコンストラクタ
''' </summary>
''' <param name="listen">使用しているYomiAutoCompleti...
Public Sub New( _
ByVal listen As Microsoft.International.Windows.Y...
Me.source = listen.ContextManager.Source
Me.yomiProvider = listen.ContextManager.YomiProvi...
SharedSourceYomiProvider.sharedSources.Add(listen...
End Sub
Public Function GetYomi(ByVal text As String) As _
System.Collections.ObjectModel.ReadOnlyCollection...
Implements Microsoft.International.Windows.IYomiP...
'基のIYomiProviderのGetYomiを呼び出す
Dim ret As System.Collections.ObjectModel.ReadOnl...
Me.yomiProvider.GetYomi(text)
'ソースを同期する
For Each src As Microsoft.International.Windows.Y...
In SharedSourceYomiProvider.sharedSources
If Me.source IsNot src Then
For Each yomi As String In ret
src.Add(yomi, text)
Next
End If
Next
Return ret
End Function
End Class
}}
#code(csharp){{
/// <summary>
/// 複数のYomiAutoCompletionListenerでソースを共有するIYo...
/// </summary>
public class SharedSourceYomiProvider :
Microsoft.International.Windows.IYomiProvider
{
//同期するすべてのソース
private static List<Microsoft.International.Windows.Y...
new List<Microsoft.International.Windows.YomiStri...
//このYomiAutoCompletionListenerのソース
private Microsoft.International.Windows.YomiStringCol...
//このIYomiProviderの基になるIYomiProvider
private Microsoft.International.Windows.IYomiProvider...
/// <summary>
/// SharedSourceYomiProviderのコンストラクタ
/// </summary>
/// <param name="listen">使用しているYomiAutoCompleti...
public SharedSourceYomiProvider(
Microsoft.International.Windows.YomiAutoCompletio...
{
this.source = listen.ContextManager.Source;
this.yomiProvider = listen.ContextManager.YomiPro...
SharedSourceYomiProvider.sharedSources.Add(listen...
}
public System.Collections.ObjectModel.ReadOnlyCollect...
string text)
{
//基のIYomiProviderのGetYomiを呼び出す
System.Collections.ObjectModel.ReadOnlyCollection...
this.yomiProvider.GetYomi(text);
//ソースを同期する
foreach (Microsoft.International.Windows.YomiStri...
in SharedSourceYomiProvider.sharedSources)
{
if (this.source != src)
{
foreach (string yomi in ret)
{
src.Add(yomi, text);
}
}
}
return ret;
}
}
}}
例えばこのクラスを使って"TextBox1"と"TextBox2"の2つのテキ...
#code(vbnet){{
Private listener As Microsoft.International.Windows.YomiA...
Private listener2 As Microsoft.International.Windows.Yomi...
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, ByVal e As...
Handles MyBase.Load
Me.listener = _
New Microsoft.International.Windows.YomiAutoCompl...
'YomiProviderを変更する
Me.listener.ContextManager.YomiProvider = _
New SharedSourceYomiProvider(Me.listener)
Me.listener2 = _
New Microsoft.International.Windows.YomiAutoCompl...
'YomiProviderを変更する
Me.listener2.ContextManager.YomiProvider = _
New SharedSourceYomiProvider(Me.listener2)
End Sub
}}
#code(csharp){{
private Microsoft.International.Windows.YomiAutoCompletio...
private Microsoft.International.Windows.YomiAutoCompletio...
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
this.listener =
new Microsoft.International.Windows.YomiAutoCompl...
//YomiProviderを変更する
this.listener.ContextManager.YomiProvider = new Share...
this.listener2 =
new Microsoft.International.Windows.YomiAutoCompl...
//YomiProviderを変更する
this.listener2.ContextManager.YomiProvider = new Shar...
}
}}
**複数のソースリストを切り替えて使用する [#s2c12486]
状況によってソースリストを切り替え、候補として表示される...
これには、ソースリストを切り替えるときに現在のYomiAutoCom...
複数のソースリストをIDで切り替えられるようにしたYomiAutoC...
#code(vbnet){{
''' <summary>
''' 複数のソースリストを持つYomiAutoCompletionListener
''' </summary>
Public Class MultiSourceYomiListener
Inherits Microsoft.International.Windows.YomiAutoComp...
Private _sources As New Dictionary( _
Of String, Microsoft.International.Windows.YomiSt...
Private _sourceId As String
''' <summary>
''' ソースリストのID
''' </summary>
Public Property SourceId() As String
Get
Return Me._sourceId
End Get
Set(ByVal value As String)
If value.Equals(Me._sourceId) Then
Return
End If
'現在のIDのソースリストを保存
If Not Me._sources.ContainsKey(Me._sourceId) ...
'現在のIDのソースリストがなければ作る
Me._sources(Me._sourceId) = _
New Microsoft.International.Windows.Y...
Else
Me._sources(Me._sourceId).Clear()
End If
Me._sources(Me._sourceId).AddRange(Me.Context...
'ソースリストをクリア
Me.ContextManager.Source.Clear()
'ソースリストを復元
If Me._sources.ContainsKey(value) Then
Me.ContextManager.Source.AddRange(Me._sou...
End If
'IDを変更
Me._sourceId = value
End Set
End Property
''' <summary>
''' MultiSourceYomiListenerのコンストラクタ
''' </summary>
''' <param name="ctrl">バインド元のコントロール</para...
Public Sub New(ByVal ctrl As Control)
MyBase.New(ctrl)
Me._sourceId = ""
End Sub
End Class
}}
#code(csharp){{
/// <summary>
/// 複数のソースリストを持つYomiAutoCompletionListener
/// </summary>
public class MultiSourceYomiListener :
Microsoft.International.Windows.YomiAutoCompletionLis...
{
private Dictionary<string, Microsoft.International.Wi...
_sources =
new Dictionary<string, Microsoft.International.Wi...
private string _sourceId;
/// <summary>
/// ソースリストのID
/// </summary>
public string SourceId
{
get
{
return this._sourceId;
}
set
{
if (value.Equals(this._sourceId))
return;
//現在のIDのソースリストを保存
if (!this._sources.ContainsKey(this._sourceId))
{
//現在のIDのソースリストがなければ作る
this._sources[this._sourceId] =
new Microsoft.International.Windows.Y...
}
else
{
this._sources[this._sourceId].Clear();
}
this._sources[this._sourceId].AddRange(this.C...
//ソースリストをクリア
this.ContextManager.Source.Clear();
//ソースリストを復元
if (this._sources.ContainsKey(value))
{
this.ContextManager.Source.AddRange(this....
}
//IDを変更
this._sourceId = value;
}
}
/// <summary>
/// MultiSourceYomiListenerのコンストラクタ
/// </summary>
/// <param name="ctrl">バインド元のコントロール</param>
public MultiSourceYomiListener(Control ctrl) : base(c...
{
this._sourceId = "";
}
}
}}
このクラスの使い方はYomiAutoCompletionListenerと同じで、...
#code(vbnet){{
Private listener As MultiSourceYomiListener
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, ByVal e As...
Handles MyBase.Load
Me.listener = New MultiSourceYomiListener(Me.TextBox1)
End Sub
}}
#code(csharp){{
private MultiSourceYomiListener listener;
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
this.listener = new MultiSourceYomiListener(this.Text...
}
}}
**参考 [#nf9cd7a4]
-[[ディベロッパー製品開発統括部 Blog : 開発者共通の悩み?...
**コメント [#b051b1d4]
- 大変貴重な情報ありがとうございます。 -- やまと &new{201...
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]] [[:Category/ASP.NET]],2008-1...
終了行:
#title(Visual Studio International Pack: Japanese Yomi Au...
#navi(.NETプログラミング研究)
#contents
*Visual Studio International Pack: Japanese Yomi Auto-Com...
Japanese Yomi Auto-Completion Libraryは、テキストボックス...
**ダウンロードとインストール [#wd828c82]
Japanese Yomi Auto-Completion Libraryをインストールする手...
またプロジェクトの参照に「YomiAutoCompletion.dll」を追加...
**YomiAutoCompletionListenerクラス [#ofcbe26d]
Japanese Yomi Auto-Completion Libraryの使い方は非常に簡単...
テキストボックス"TextBox1"にオートコンプリート機能を付け...
#code(vbnet){{
Private listener As Microsoft.International.Windows.YomiA...
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, ByVal e As...
Handles MyBase.Load
Me.listener = _
New Microsoft.International.Windows.YomiAutoCompl...
End Sub
}}
#code(csharp){{
private Microsoft.International.Windows.YomiAutoCompletio...
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
this.listener =
new Microsoft.International.Windows.YomiAutoCompl...
}
}}
例えば、このテキストボックスに日本語IMEを使って"青森"と入...
&ref(YomiAutoCompletion1.png);
このようにJapanese Yomi Auto-Completion Libraryは、日本語...
読みがなの登録はテキストボックスの内容が空であってもそう...
***自動的に登録される読みがなはどのように決定されるか [#q...
自動的に登録される読みがなは、ユーザーが実際にIMEで入力し...
***候補ウィンドウの実体 [#f9d60395]
候補ウィンドウの実体はCandidatesWindowクラスというもので...
**TextBoxクラスをオーバーライドして、オートコンプリート機...
TextBoxクラスをオーバーライドして、オートコンプリート機能...
#code(vbnet){{
''' <summary>
''' Japanese Yomi Auto-Completion Libraryを使って
''' 日本語IMEでのオートコンプリート機能を可能にしたテキス...
''' </summary>
Public Class YomiAutoCompleteTextBox
Inherits System.Windows.Forms.TextBox
Private listener As Microsoft.International.Windows.Y...
''' <summary>
''' 使用しているYomiAutoCompletionListener
''' </summary>
Public ReadOnly Property YomiAutoCompletionListener()...
Microsoft.International.Windows.YomiAutoCompletio...
Get
Return Me.listener
End Get
End Property
Public Sub New()
Me.listener = _
New Microsoft.International.Windows.YomiAutoC...
End Sub
End Class
}}
#code(csharp){{
/// <summary>
/// Japanese Yomi Auto-Completion Libraryを使って
/// 日本語IMEでのオートコンプリート機能を可能にしたテキス...
/// </summary>
public class YomiAutoCompleteTextBox : System.Windows.For...
{
private Microsoft.International.Windows.YomiAutoCompl...
/// <summary>
/// 使用しているYomiAutoCompletionListener
/// </summary>
public Microsoft.International.Windows.YomiAutoComple...
YomiAutoCompletionListener
{
get { return this.listener; }
}
public YomiAutoCompleteTextBox()
{
this.listener =
new Microsoft.International.Windows.YomiAutoC...
}
}
}}
このクラスを使用する方法は、「[[「○○○クラスの代わりに派生...
**登録された読みがなと候補を保存、復元する [#restoreyomi]
Japanese Yomi Auto-Completion Libraryで自動的に登録された...
今まで登録されている読みがなのリストは、YomiAutoCompletio...
以下に、現在登録されているソースリストをファイルに保存、...
#code(vbnet){{
Private listener As Microsoft.International.Windows.YomiA...
'オートコンプリートソースを保存するファイル
Private yomiListFile As String = _
System.IO.Path.Combine(Application.StartupPath, "yomi...
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, ByVal e As...
Handles MyBase.Load
Me.listener = _
New Microsoft.International.Windows.YomiAutoCompl...
'ソースリストを読み込む
If System.IO.File.Exists(Me.yomiListFile) Then
Me.LoadYomiSource(Me.yomiListFile, Me.listener)
End If
End Sub
'フォームのFormClosedイベントハンドラ
Private Sub Form1_FormClosed(ByVal sender As Object, ByVa...
Handles MyBase.FormClosed
'ソースリストを保存する
Me.SaveYomiSource(Me.yomiListFile, Me.listener)
End Sub
''' <summary>
''' YomiAutoCompletionListenerのオートコンプリートソース...
''' </summary>
''' <param name="filePath">保存先のファイル</param>
''' <param name="listen">保存するYomiAutoCompletionListen...
Public Sub SaveYomiSource(ByVal filePath As String, _
ByVal listen As Microsoft.International.Windows.Y...
Using strm As New System.IO.StreamWriter(filePath)
For Each strYomi As Microsoft.International.Windo...
In listen.ContextManager.Source
strm.WriteLine( _
String.Format("{0}" & vbTab & "{1}", strY...
Next
End Using
End Sub
''' <summary>
''' YomiAutoCompletionListenerのオートコンプリートソース...
''' </summary>
''' <param name="filePath">復元するファイル</param>
''' <param name="listen">復元先のYomiAutoCompletionListen...
Public Sub LoadYomiSource(ByVal filePath As String, _
ByVal listen As Microsoft.International.Windows.Y...
Using strm As New System.IO.StreamReader(filePath)
listen.ContextManager.Source.Clear()
Dim line As String = strm.ReadLine()
While (line IsNot Nothing)
Dim vals As String() = line.Split(New Char() ...
If vals.Length = 2 Then
listen.ContextManager.Source.Add(vals(0),...
End If
line = strm.ReadLine()
End While
End Using
End Sub
}}
#code(csharp){{
private Microsoft.International.Windows.YomiAutoCompletio...
//ソースリストを保存するファイル
string yomiListFile =
System.IO.Path.Combine(Application.StartupPath, "yomi...
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
this.listener =
new Microsoft.International.Windows.YomiAutoCompl...
//ソースリストを読み込む
if (System.IO.File.Exists(this.yomiListFile))
this.LoadYomiSource(this.yomiListFile, this.liste...
}
//フォームのFormClosedイベントハンドラ
private void Form1_FormClosed(object sender, FormClosedEv...
{
//ソースリストを保存する
this.SaveYomiSource(this.yomiListFile, this.listener);
}
/// <summary>
/// YomiAutoCompletionListenerのソースリストをファイルに...
/// </summary>
/// <param name="filePath">保存先のファイル</param>
/// <param name="listen">保存するYomiAutoCompletionListen...
public void SaveYomiSource(
string filePath,
Microsoft.International.Windows.YomiAutoCompletionLis...
{
using (System.IO.StreamWriter strm = new System.IO.St...
{
foreach (Microsoft.International.Windows.StringYo...
in listen.ContextManager.Source)
{
strm.WriteLine(string.Format("{0}\t{1}", strY...
}
}
}
/// <summary>
/// YomiAutoCompletionListenerのソースリストをファイルか...
/// </summary>
/// <param name="filePath">復元するファイル</param>
/// <param name="listen">復元先のYomiAutoCompletionListen...
public void LoadYomiSource(
string filePath,
Microsoft.International.Windows.YomiAutoCompletionLis...
{
using (System.IO.StreamReader strm = new System.IO.St...
{
listen.ContextManager.Source.Clear();
string line;
while ((line = strm.ReadLine()) != null)
{
string[] vals = line.Split(new char[] { '\t' ...
if (vals.Length == 2)
{
listen.ContextManager.Source.Add(vals[0],...
}
}
}
}
}}
**読みがなを独自に提供する [#ebe5af3e]
デフォルトではIMEで確定された文字列に対する読みがなが自動...
その方法は、ヘルプの「自分の辞書を利用する方法」にありま...
ヘルプで紹介されているIYomiProviderインターフェイスを実装...
#code(vbnet){{
Public Class MyYomiProvider
Implements Microsoft.International.Windows.IYomiProvi...
Public Function GetYomi(ByVal text As String) As _
System.Collections.ObjectModel.ReadOnlyCollec...
Implements Microsoft.International.Windows.IY...
Dim yomiCandidates As New List(Of String)()
Select Case text
Case "日本"
yomiCandidates.Add("にほん")
yomiCandidates.Add("にっぽん")
Exit Select
Case "日本人"
yomiCandidates.Add("にほんじん")
yomiCandidates.Add("にっぽんじん")
Exit Select
Case Else
Exit Select
End Select
Return New System.Collections.ObjectModel.ReadOnl...
(yomiCandidates)
End Function
End Class
}}
#code(csharp){{
public class MyYomiProvider :
Microsoft.International.Windows.IYomiProvider
{
public System.Collections.ObjectModel.ReadOnlyCollect...
string text)
{
List<string> yomiCandidates = new List<string>();
switch (text)
{
case "日本":
yomiCandidates.Add("にほん");
yomiCandidates.Add("にっぽん");
break;
case "日本人":
yomiCandidates.Add("にほんじん");
yomiCandidates.Add("にっぽんじん");
break;
default:
break;
}
return new System.Collections.ObjectModel.ReadOnl...
yomiCandidates);
}
}
}}
このクラスを利用するには、次のようにYomiAutoCompletionCon...
#code(vbnet){{
Private listener As Microsoft.International.Windows.YomiA...
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, ByVal e As...
Handles MyBase.Load
Me.listener = _
New Microsoft.International.Windows.YomiAutoCompl...
'YomiProviderを変更する
Me.listener.ContextManager.YomiProvider = New MyYomiP...
End Sub
}}
#code(csharp){{
private Microsoft.International.Windows.YomiAutoCompletio...
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
this.listener =
new Microsoft.International.Windows.YomiAutoCompl...
//YomiProviderを変更する
this.listener.ContextManager.YomiProvider = new MyYom...
}
}}
このようにして、TextBox1に日本語IMEで"に"と入力しても、候...
なぜはじめから候補ウィンドウが表示されないのかというと、...
よってこの例のように、提供される読みがなが少数であれば、...
***ある文字列について、GetYomiメソッドが返す読みがなをソ...
ユーザーがIMEで確定するのではなく、プログラムによって、あ...
例えば上記の例において、"日本"の読みがなの"にほん"と"にっ...
#code(vbnet){{
Me.listener = _
New Microsoft.International.Windows.YomiAutoCompletio...
'YomiProviderを変更する
Me.listener.ContextManager.YomiProvider = New MyYomiProvi...
'"日本"の読みがなをソースリストに追加する
Me.listener.ContextManager.AddToSource("日本", Nothing)
}}
#code(csharp){{
this.listener =
new Microsoft.International.Windows.YomiAutoCompletio...
//YomiProviderを変更する
this.listener.ContextManager.YomiProvider = new MyYomiPro...
//"日本"の読みがなをソースリストに追加する
this.listener.ContextManager.AddToSource("日本", null);
}}
**独自のソースリストだけを使い、入力された読みがなを登録...
先に述べたように、IYomiProviderを実装するよりも、ソースリ...
「[[登録された読みがなと候補を保存、復元する>#restoreyomi...
#code(vbnet){{
Me.listener = _
New Microsoft.International.Windows.YomiAutoCompletio...
'ユーザーが入力した読みがなを登録しない
Me.listener.ContextManager.YomiProvider = Nothing
If System.IO.File.Exists(Me.yomiListFile) Then
Me.LoadYomiSource(Me.yomiListFile, Me.listener)
End If
}}
#code(csharp){{
this.listener =
new Microsoft.International.Windows.YomiAutoCompletio...
//ユーザーが入力した読みがなを登録しない
this.listener.ContextManager.YomiProvider = null;
if (System.IO.File.Exists(this.yomiListFile))
this.LoadYomiSource(this.yomiListFile, this.listener);
}}
**複数のYomiAutoCompletionListenerのソースリストを共有す...
複数のテキストボックスで同じYomiAutoCompletionListenerを...
同期の方法やタイミングはいろいろ考えられますが、ここではI...
具体的なサンプルは以下のようになります。
#code(vbnet){{
''' <summary>
''' 複数のYomiAutoCompletionListenerでソースを共有するIYo...
''' </summary>
Public Class SharedSourceYomiProvider
Implements Microsoft.International.Windows.IYomiProvi...
'同期するすべてのソース
Private Shared sharedSources As New List( _
Of Microsoft.International.Windows.YomiStringColl...
'このYomiAutoCompletionListenerのソース
Private source As Microsoft.International.Windows.Yom...
'このIYomiProviderの基になるIYomiProvider
Private yomiProvider As Microsoft.International.Windo...
''' <summary>
''' SharedSourceYomiProviderのコンストラクタ
''' </summary>
''' <param name="listen">使用しているYomiAutoCompleti...
Public Sub New( _
ByVal listen As Microsoft.International.Windows.Y...
Me.source = listen.ContextManager.Source
Me.yomiProvider = listen.ContextManager.YomiProvi...
SharedSourceYomiProvider.sharedSources.Add(listen...
End Sub
Public Function GetYomi(ByVal text As String) As _
System.Collections.ObjectModel.ReadOnlyCollection...
Implements Microsoft.International.Windows.IYomiP...
'基のIYomiProviderのGetYomiを呼び出す
Dim ret As System.Collections.ObjectModel.ReadOnl...
Me.yomiProvider.GetYomi(text)
'ソースを同期する
For Each src As Microsoft.International.Windows.Y...
In SharedSourceYomiProvider.sharedSources
If Me.source IsNot src Then
For Each yomi As String In ret
src.Add(yomi, text)
Next
End If
Next
Return ret
End Function
End Class
}}
#code(csharp){{
/// <summary>
/// 複数のYomiAutoCompletionListenerでソースを共有するIYo...
/// </summary>
public class SharedSourceYomiProvider :
Microsoft.International.Windows.IYomiProvider
{
//同期するすべてのソース
private static List<Microsoft.International.Windows.Y...
new List<Microsoft.International.Windows.YomiStri...
//このYomiAutoCompletionListenerのソース
private Microsoft.International.Windows.YomiStringCol...
//このIYomiProviderの基になるIYomiProvider
private Microsoft.International.Windows.IYomiProvider...
/// <summary>
/// SharedSourceYomiProviderのコンストラクタ
/// </summary>
/// <param name="listen">使用しているYomiAutoCompleti...
public SharedSourceYomiProvider(
Microsoft.International.Windows.YomiAutoCompletio...
{
this.source = listen.ContextManager.Source;
this.yomiProvider = listen.ContextManager.YomiPro...
SharedSourceYomiProvider.sharedSources.Add(listen...
}
public System.Collections.ObjectModel.ReadOnlyCollect...
string text)
{
//基のIYomiProviderのGetYomiを呼び出す
System.Collections.ObjectModel.ReadOnlyCollection...
this.yomiProvider.GetYomi(text);
//ソースを同期する
foreach (Microsoft.International.Windows.YomiStri...
in SharedSourceYomiProvider.sharedSources)
{
if (this.source != src)
{
foreach (string yomi in ret)
{
src.Add(yomi, text);
}
}
}
return ret;
}
}
}}
例えばこのクラスを使って"TextBox1"と"TextBox2"の2つのテキ...
#code(vbnet){{
Private listener As Microsoft.International.Windows.YomiA...
Private listener2 As Microsoft.International.Windows.Yomi...
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, ByVal e As...
Handles MyBase.Load
Me.listener = _
New Microsoft.International.Windows.YomiAutoCompl...
'YomiProviderを変更する
Me.listener.ContextManager.YomiProvider = _
New SharedSourceYomiProvider(Me.listener)
Me.listener2 = _
New Microsoft.International.Windows.YomiAutoCompl...
'YomiProviderを変更する
Me.listener2.ContextManager.YomiProvider = _
New SharedSourceYomiProvider(Me.listener2)
End Sub
}}
#code(csharp){{
private Microsoft.International.Windows.YomiAutoCompletio...
private Microsoft.International.Windows.YomiAutoCompletio...
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
this.listener =
new Microsoft.International.Windows.YomiAutoCompl...
//YomiProviderを変更する
this.listener.ContextManager.YomiProvider = new Share...
this.listener2 =
new Microsoft.International.Windows.YomiAutoCompl...
//YomiProviderを変更する
this.listener2.ContextManager.YomiProvider = new Shar...
}
}}
**複数のソースリストを切り替えて使用する [#s2c12486]
状況によってソースリストを切り替え、候補として表示される...
これには、ソースリストを切り替えるときに現在のYomiAutoCom...
複数のソースリストをIDで切り替えられるようにしたYomiAutoC...
#code(vbnet){{
''' <summary>
''' 複数のソースリストを持つYomiAutoCompletionListener
''' </summary>
Public Class MultiSourceYomiListener
Inherits Microsoft.International.Windows.YomiAutoComp...
Private _sources As New Dictionary( _
Of String, Microsoft.International.Windows.YomiSt...
Private _sourceId As String
''' <summary>
''' ソースリストのID
''' </summary>
Public Property SourceId() As String
Get
Return Me._sourceId
End Get
Set(ByVal value As String)
If value.Equals(Me._sourceId) Then
Return
End If
'現在のIDのソースリストを保存
If Not Me._sources.ContainsKey(Me._sourceId) ...
'現在のIDのソースリストがなければ作る
Me._sources(Me._sourceId) = _
New Microsoft.International.Windows.Y...
Else
Me._sources(Me._sourceId).Clear()
End If
Me._sources(Me._sourceId).AddRange(Me.Context...
'ソースリストをクリア
Me.ContextManager.Source.Clear()
'ソースリストを復元
If Me._sources.ContainsKey(value) Then
Me.ContextManager.Source.AddRange(Me._sou...
End If
'IDを変更
Me._sourceId = value
End Set
End Property
''' <summary>
''' MultiSourceYomiListenerのコンストラクタ
''' </summary>
''' <param name="ctrl">バインド元のコントロール</para...
Public Sub New(ByVal ctrl As Control)
MyBase.New(ctrl)
Me._sourceId = ""
End Sub
End Class
}}
#code(csharp){{
/// <summary>
/// 複数のソースリストを持つYomiAutoCompletionListener
/// </summary>
public class MultiSourceYomiListener :
Microsoft.International.Windows.YomiAutoCompletionLis...
{
private Dictionary<string, Microsoft.International.Wi...
_sources =
new Dictionary<string, Microsoft.International.Wi...
private string _sourceId;
/// <summary>
/// ソースリストのID
/// </summary>
public string SourceId
{
get
{
return this._sourceId;
}
set
{
if (value.Equals(this._sourceId))
return;
//現在のIDのソースリストを保存
if (!this._sources.ContainsKey(this._sourceId))
{
//現在のIDのソースリストがなければ作る
this._sources[this._sourceId] =
new Microsoft.International.Windows.Y...
}
else
{
this._sources[this._sourceId].Clear();
}
this._sources[this._sourceId].AddRange(this.C...
//ソースリストをクリア
this.ContextManager.Source.Clear();
//ソースリストを復元
if (this._sources.ContainsKey(value))
{
this.ContextManager.Source.AddRange(this....
}
//IDを変更
this._sourceId = value;
}
}
/// <summary>
/// MultiSourceYomiListenerのコンストラクタ
/// </summary>
/// <param name="ctrl">バインド元のコントロール</param>
public MultiSourceYomiListener(Control ctrl) : base(c...
{
this._sourceId = "";
}
}
}}
このクラスの使い方はYomiAutoCompletionListenerと同じで、...
#code(vbnet){{
Private listener As MultiSourceYomiListener
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, ByVal e As...
Handles MyBase.Load
Me.listener = New MultiSourceYomiListener(Me.TextBox1)
End Sub
}}
#code(csharp){{
private MultiSourceYomiListener listener;
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
this.listener = new MultiSourceYomiListener(this.Text...
}
}}
**参考 [#nf9cd7a4]
-[[ディベロッパー製品開発統括部 Blog : 開発者共通の悩み?...
**コメント [#b051b1d4]
- 大変貴重な情報ありがとうございます。 -- やまと &new{201...
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]] [[:Category/ASP.NET]],2008-1...
ページ名:
▲
▼
[
トップ
] [
新規
|
子ページ作成
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]