TextBoxの行と列の取得 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 (--;;  (その他) 投稿日時 2010/6/22 10:36:35
> 僕はてっきりメモ帳はVBだと思ってました。
VBの場合、実行のために、(昔なら)ランタイムをインストールしなければならないし、VB.NETの場合、.NetFrameworkをインストールしなきゃならん。
Windows2000以前で、.NetFrameworkもVBランタイムも入っていないデフォルトのWindowsで、普通にメモ帳が実行できていたことを考えると、VBで出来ていると考えるのは違うと思う。

>>現在、"HomePageEditor"というソフトを作っています。どんなソフトかは・・・、名前のとおりです。
>なら魔界の仮面弁士さんもおっしゃってますが、やっぱり
>>TextBox の代わりに RichTextBox
>でしょ。 
一票。
投稿者 流れ者  (社会人) 投稿日時 2010/6/21 23:23:09
こんばんは。

XPMAX2008さん

>>現在、"HomePageEditor"というソフトを作っています。どんなソフトかは・・・、名前のとおりです。
>なら魔界の仮面弁士さんもおっしゃってますが、やっぱり
>>TextBox の代わりに RichTextBox
>でしょ。 
私も同意見です。確かに既存のコントロールの機能を組み合わせて自分の要求を実現することは、プログラマにとって必要なスキルですが、もっと便利な機能を利用するという、良い意味で”手を抜く”技術も必要です。
私見ですが「行と列の表示」は、貴方が作ろうとしているソフトの機能としては、重要度の低い機能と思われます。そういった機能にPCのメモリやCPUの力を割くのではなく、もっと重要度の高い機能を充実させるべきだと思います。
投稿者 neptune  (社会人) 投稿日時 2010/6/21 17:01:37
>現在、"HomePageEditor"というソフトを作っています。どんなソフトかは・・・、名前のとおりです。
なら魔界の仮面弁士さんもおっしゃってますが、やっぱり
>TextBox の代わりに RichTextBox
でしょ。
投稿者 XPMAX2008   (社会人) 投稿日時 2010/6/21 15:41:54
僕はてっきりメモ帳はVBだと思ってました。
(メモ帳がC言語なら他のソフトもそうだと思います。)
皆さん、資料ありがとうございます。

>間隔は100ミリ秒くらいの方が…。
>あまり短くするとCPU喰いますよ。 
50ミリ秒が、一番スムーズでした。

>その方法でも取得できますが、API を使わずとも標準機能だけで取得できますよ。
TextBoxでタイマーを使ってできました。
現在、"HomePageEditor"というソフトを作っています。どんなソフトかは・・・、名前のとおりです。
それに使ってみます。

ありがとうございました。
投稿者 neptune  (社会人) 投稿日時 2010/6/21 15:06:48
>Me.Text = String.Format("{0}行{1}列", row + 1, col + 1)
おっ、そうですね。この方法がありますね。思いつきませんでした。
そりゃこちらの方が楽チンです。こちらにすべきですね。

失礼しました。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/6/21 09:45:26
> で、本題ですが、EM_GETSELってのを調べてみてください。
> これでいけるならsendmessage API関数も必要ですね。 

その方法でも取得できますが、API を使わずとも標準機能だけで取得できますよ。

Dim pos As Integer = TextBox1.SelectionStart
Dim row As Integer = TextBox1.GetLineFromCharIndex(pos)
Dim col As Integer = pos - TextBox1.GetFirstCharIndexOfCurrentLine()

Me.Text = String.Format("{0}行{1}列", row + 1, col + 1)


なお、TextBox の代わりに RichTextBox を使うようにすれば、Timer も不要となります。
(Timer の Tick イベントではなく、RichTextBox の SelectionChanged イベントに記述する)
投稿者 (削除されました)  () 投稿日時 2010/6/21 09:37:02
(削除されました)
投稿者 neptune  (社会人) 投稿日時 2010/6/20 23:01:09
メモ帳ってC言語で書かれているんですよね。昔、VS6のころにはサンプルソースが付属してました。

で、本題ですが、EM_GETSELってのを調べてみてください。
多分ですが、これでいけるような気がします。
あっこれでいけるならsendmessage API関数も必要ですね。
投稿者 トマト  (中学生) 投稿日時 2010/6/20 19:32:28
間隔は100ミリ秒くらいの方が…。
あまり短くするとCPU喰いますよ。
投稿者 あにす  (社会人) 投稿日時 2010/6/20 18:32:01
System.Windows.Forms.TextBoxで検索して下さい。
投稿者 XPMAX2008  (中学生) 投稿日時 2010/6/20 17:26:53
で、メモ帳のようなソフトを作っています。
メモ帳では、ステータスバーの右側に、「  X 行、Y 列」とありますが、
取得するには、どうすればよいですか?

<オブジェクト(ステータスバー)>
オブジェクト:StatusBar
オブジェクト名:StatusBar1

メモ帳みたいにするため、メニューは、MenuStripではなくMainMenu。
ステータスバーは、StatusStripでなく、StatusBarにしています。

Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load
        Me.Timer1.Start()
    End Sub

Private Sub Timer1_Tick(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Timer1.Tick
        StatusBarPanel3.Text = (TextBox1.Focus) & " 行、" & (TextBox1.SelectionLength) & " 列"
    End Sub



上記の通り、Timerを使っています。間隔は、1ミリ秒です。

これを実行した結果、
(TextBox.1Text = "ABC")
BC間にカーソル
 _______________________________________________________________
|                                                               |
| AB|C                                                          |
|                                                               |
|_______________________________________________________________|
|                                       |  2行、0列            |
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

なぜか、"何文字目?"という結果になってしまいます。
どうすればよいですか?

あと、絵が見づらくてすみません。