2011-01-20 6 views
4

私はそのテキストが特定のテーブルからのいくつかの単語の連結であるrichtextboxを持っています。 (テーブルの列は 'word'、 'translate'、 'id')richtextboxの各単語の追加情報 - richtextboxとsqlテーブルの間のリンク

ユーザーが各単語にカーソルを合わせると、関連する翻訳が単語のツールチップに表示されます。 (Google翻訳のようなものですが、Windowsフォームアプリケーションです)

誰かが私に解決策を教えてもらえますか?これは、トリックを行います

答えて

1

ウェブブラウザの制御とJavaScriptを使用して私の問題を解決しました。 ;)

0

...

private void richTextBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    // whitespace definition 
    char[] whitespace = new char[] { ' ', '\r', '\n', '\t' }; 

    int charPosition = this.richTextBox1.GetCharIndexFromPosition(e.Location); 

    string fullText = this.richTextBox1.Text; 

    // if we are on whitespace, exit 
    if (whitespace.Contains(fullText[charPosition])) 
    { 
     return; 
    } 

    // find a whitespace towards the start of the text 
    int firstWhiteSpace = charPosition; 
    while (firstWhiteSpace > 0 
     && firstWhiteSpace < fullText.Length 
     && !whitespace.Contains(fullText[firstWhiteSpace])) 
    { 
     firstWhiteSpace--; 
    } 
    if (firstWhiteSpace!=0) 
     firstWhiteSpace++; 
    // find the next whitespace 
    int lastWhiteSpace = fullText.IndexOfAny(whitespace, charPosition); 
    if (lastWhiteSpace == -1) 
     lastWhiteSpace = fullText.Length; 

    // substring the word out of the flat text 
    string word = fullText.Substring(
     firstWhiteSpace, 
     lastWhiteSpace - firstWhiteSpace); 

    // show the result 
    label1.Text = String.Format("pos:{0} fsp:{1}, lsp:{2}, len:{3}, word:{4}", 
     charPosition, 
     firstWhiteSpace, 
     lastWhiteSpace, 
     fullText.Length, word); 

} 
+0

ご回答いただきありがとうございます。これは言葉を得る。しかし、どうやって相対的なIDと変換を行うことができますか?あなたの回答に感謝します。 – ARZ

0

私はC#で流暢ではない、と私はまた、このフォーラムに新しいブランドです。しかし、あなたが翻訳テーブルを照会して翻訳テキストを返す関数で投稿されたコードreneを補足するなら、あなたはこれを持っているでしょう(私の擬似コード屠殺を許してください - 私はVBに非常に堪能です。ネット、つもり間もなくC#構文を学ぶ):次に

Private String TranslatedWord(ByVal SelectedWord String) 
    { 
     //Use ADO and SQL to retrieve the Translation(s) associated with the submitted Word 

     // A string SQL Statement (the GROUP ON is in case there are multiple instances of the same word, with different translations (synonyms). THis SQL Should return a a single record for each possible translation of the submitted word (more than one result possible): 
      Dim SQL as String = _ 
      "SELECT tr.ID, tr.Translate " & _ 
      "FROM MyTranslationTable AS tr " & _ 
      "WHERE tr.Word LIKE @Word" 

     //Since I could be ALL DAY struggling to write the C# code for this, I will just step through it in "pseudocode": 
     // 1. Execute the SQL using ADO.Net, set up the @Word Param in your command, and return a sqlDataReader 
     // 2. Iterate through the returned records, and append the Translation results to a System.Text.Stringbuilder object. Delimit each returned value with a semi-colon (or your delimiter of choice). 
     // Return the Stringbuilder.ToString property as the result of this function; 

}

ルネのコードの最後の部分を変更する(「//結果を表示」)としては、適切な私の恐ろしいC#の問題を補正(次の! ):

 private void richTextBox1_MouseMove(object sender, MouseEventArgs e)           
    {            
     // whitespace definition            
     char[] whitespace = new char[] { ' ', '\r', '\n', '\t' };                      
     int charPosition = this.richTextBox1.GetCharIndexFromPosition(e.Location);                      
     string fullText = this.richTextBox1.Text; 

     // if we are on whitespace, exit            
     if (whitespace.Contains(fullText[charPosition]))            
     {             
      return;            
     }                      
     // find a whitespace towards the start of the text            
     int firstWhiteSpace = charPosition;            
     while (firstWhiteSpace > 0             
      && firstWhiteSpace < fullText.Length             
      && !whitespace.Contains(fullText[firstWhiteSpace]))            
      {             
      firstWhiteSpace--;            
     }            
     if (firstWhiteSpace!=0)             
      firstWhiteSpace++; 

     // find the next whitespace            
     int lastWhiteSpace = fullText.IndexOfAny(whitespace, charPosition);            
     if (lastWhiteSpace == -1)             
      lastWhiteSpace = fullText.Length; 

     // substring the word out of the flat text            
     string word = fullText.Substring(             
      firstWhiteSpace,             
      lastWhiteSpace - firstWhiteSpace); 

     // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
     //My CHanges start here, and will likely require 
     // some tweaking . . . 

     //Use the function I have poorly described above to retreive the 
     //translation(s) for the current Word: 
     string TRANSLATION = TranslatedWord(word);               

     // show the result  
     //Since there are so many minor but important differences between C# and VB, I am not going to attempt 
     //to account for them. Essentially, display the translated word instead of the word over which the mouse is hovering:     
     label1.Text = String.Format("pos:{0} fsp:{1}, lsp:{2}, len:{3}, word:{4}",             
      charPosition,             
      firstWhiteSpace,             
      lastWhiteSpace,             
      fullText.Length, TRANSLATION);  

    } 

もしそれが役に立つとすれば、私はバストアウトすることができますこのvb.netのコードはかなり早いですが、それが役に立たない限り、私はそれをやるつもりはありませんでした。

希望します。私はC#を学ぶ上で少し働かなければならないし、このフォーラムでの投稿の私の理解を向上させる必要があるだろう!コードを正しく見えるようにすることは難題です。 。 。

+0

しかし、大きな問題は "...どこに.Word LIKE @Word"ですか?私のアプリケーションでは、1つの単語がその文脈に複数の翻訳ベースを持つ可能性があるからです。対応する変換IDを正確に指し示す必要があります。 – ARZ

+0

私は、文脈に依存して複数の翻訳があった場合、ツールとして表示する文字列にALLを連結することを考えました。選択されたWord = Den、Tool Tip Text = "ライブラリ; Nest; Hideaway" Denの全同義語(頭の上から外れる)その連結文字列は、Function TranslatedWord(Word)によって返される文字列です。これはコード化するのが比較的簡単です。また、もし翻訳が文脈によって異なっているのであれば、あなたが示唆するようにあなたはどうしますか?上記のメソッドは、適切なIDを取得するために、どのコンテキストを使用するかをどのように知っていますか? – XIVSolutions

+0

翻訳を忘れて、Idのようなツールチップの各単語、単語の一部またはその他の情報を表示する必要があるとします。 – ARZ

関連する問題