2024年9月4日水曜日

C#で、テキストボックスの最初に、指定した文字が来るようにスクロールするメソッド

 ChatGPTで、コードをつくってもらったけれど、なかなかうまくいかなかった。Windowsメッセージ等のOSに近い部分は、ChatGPTに助けてもらったけど、コードの論理に関してはまだ、自分のような凡人プログラマにも及ばない感じがした。

 結局、自分でしばらく試行錯誤しながら、解決することになった。ChatGPTは、現実世界で試行錯誤は、できないわけなので、そこは、人間よりハンディがあるんだろうと思った。今日、NVIDIA株も急落した。AIに期待が大きすぎたか。。

  private const int WM_VSCROLL = 0x0115;
  private const int SB_LINEDOWN = 1;
  private const int SB_LINEUP = 0;
  [DllImport("user32.dll")]
  private static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
  public static void ScrollLines(System.Windows.Forms.TextBox textBox, int numberOfLines)
  {
      for (int i = 0; i < Math.Abs(numberOfLines); i++)
      {
          SendMessage(textBox.Handle, WM_VSCROLL, numberOfLines > 0 ? SB_LINEDOWN : SB_LINEUP, 0);
      }
  }
   public static void MoveCursorToText(string searchText,System.Windows.Forms.TextBox textBox)
  {
      // テキストボックス内の最初の位置にカーソルを移動
      textBox.SelectionStart = 0;
      textBox.SelectionLength = 0;
      textBox.ScrollToCaret(); // カーソルの位置にスクロール
      int index = textBox.Text.IndexOf(searchText, StringComparison.OrdinalIgnoreCase);
      if (index != -1)
      {               
          textBox.Focus();
          textBox.SelectionStart = index;
          textBox.SelectionLength = searchText.Length;          
          textBox.ScrollToCaret();        
          int lineIndex = textBox.GetLineFromCharIndex(index);
          int visibleLines = textBox.Height / textBox.Font.Height;

          if (lineIndex > visibleLines)
          {
              ScrollLines(textBox, visibleLines-1);
          }
          else
          {
              ScrollLines(textBox, lineIndex);
          }           
      }
      else
      {
          MessageBox.Show("Text not found.");
      }
  }     

0 件のコメント:

コメントを投稿