1

スペル チェックを提供するために、アプリケーションで NetSpell を使用しています。NetSpell の 1 つの機能以外はすべて正常に動作しています。これが「単語の置換」機能です (むしろ、スペル チェッカーでは重要な機能ですよね?)。

コードは次のとおりです。

private NetSpell.SpellChecker.Spelling spelling;
    private NetSpell.SpellChecker.Dictionary.WordDictionary wordDictionary;
    internal System.Windows.Forms.Button spellButton;
    internal System.Windows.Forms.RichTextBox demoRichText;
    private System.ComponentModel.IContainer components2;
    internal System.Windows.Forms.RichTextBox Document;
    internal NetSpell.SpellChecker.Spelling SpellChecker;
    private System.ComponentModel.IContainer components1;
    internal NetSpell.SpellChecker.Dictionary.WordDictionary WordDictionary;

スペル チェックを起動します。

 private void toolStripButton1_Click(object sender, EventArgs e)
    {
        try
        {
            if (richTextBoxPrintCtrl1.Text == null)
            {
                MessageBox.Show("There is no text to check. Spellcheck will not be launched", "No Text", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            else
            {
                this.spelling1.Text = this.richTextBoxPrintCtrl1.Text;
                this.spelling1.SpellCheck();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error loading Spell Checker. Please reload application and try again. " + ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

単語を置換:

 private void spelling_ReplacedWord(object sender, NetSpell.SpellChecker.ReplaceWordEventArgs e)
        {
            int start = this.richTextBoxPrintCtrl1.SelectionStart;
            int length = this.richTextBoxPrintCtrl1.SelectionLength;

            this.richTextBoxPrintCtrl1.Select(e.TextIndex, e.Word.Length);
            this.richTextBoxPrintCtrl1.SelectedText = e.ReplacementWord;

            if (start > this.richTextBoxPrintCtrl1.Text.Length)
                start = this.richTextBoxPrintCtrl1.Text.Length;

            if ((start + length) > this.richTextBoxPrintCtrl1.Text.Length)
                length = 0;

            this.richTextBoxPrintCtrl1.Select(start, length);
        }

単語を削除:

private void spelling_DeletedWord(object sender, NetSpell.SpellChecker.SpellingEventArgs e)
    {
        int start = this.richTextBoxPrintCtrl1.SelectionStart;
        int length = this.richTextBoxPrintCtrl1.SelectionLength;

        this.richTextBoxPrintCtrl1.Select(e.TextIndex, e.Word.Length);
        this.richTextBoxPrintCtrl1.SelectedText = "";

        if (start > this.richTextBoxPrintCtrl1.Text.Length)
            start = this.richTextBoxPrintCtrl1.Text.Length;

        if ((start + length) > this.richTextBoxPrintCtrl1.Text.Length)
            length = 0;

        this.richTextBoxPrintCtrl1.Select(start, length);
    }

問題がどこにあるのか、私は今立ち往生しています。誰かが私を正しい方向に向けるのを手伝ってもらえますか?

ありがとう。

- 編集 -

スペル チェック機能で使用されるすべてのコードを追加しました。これが正しくない場合は申し訳ありませんが、私はプログラミングに不慣れで、まだすべての技術用語を完全には理解していません。:o)

--編集2--

もう少しわかってきました。「すべて置換」機能はある程度機能します。単語を変更して「すべて置換」を押すと、スペル チェック内では変更されますが、フォーム上では変更されません。たとえば、次の画像を参照してください。

単語置換前

単語が置換されたら ([すべて置換] を使用)

まだ変わらない!

4

1 に答える 1

0

これら 2 つの関数を自分で作成し、テストしました。彼らは働いています。イベント ハンドラーから呼び出すことができます。

static public class RichTextBoxExtensions
{
    static public void ReplaceWord(this RichTextBox rtb, int index, int length, string newWord)
    {
        rtb.Select(index, length);
        rtb.SelectedText = newWord;
        rtb.Select(index, newWord.Length);
    }

    static public void ReplaceWord(this RichTextBox rtb, string oldWord, string newWord)
    {
        rtb.ReplaceWord(rtb.Text.IndexOf(oldWord), oldWord.Length, newWord);
    }

}
于 2013-04-28T10:54:00.357 に答える