テキストボックスを下から入力するようにするにはどうしたらよいのでしょうか?
ご質問の意味が分からないです (^^;; 。
どういう動作をさせたいのかもう少し具体的に説明していただけませんか。
# 複数のテキストボックスが縦に並べてあって、下にあるテキストボックスから
# 先に入力したいとか、複数行入力可能なテキストボックスを下の行から入力し
# たいとか。
あ、あと OS と VB のバージョンも一緒にお願いしますね。
すんません。
こっちの方です。
>複数行入力可能なテキストボックスを下の行から入力し
# たいとか。
一つのテキストボックスの時です。
OSはXPです。
開発環境.NET2003
通常テキストボックスは左から右、上から下へ入力していきますよね。
それを
入力方向は左から右でいいのですが、ある地点から(下)から上へ
文字を代入して生きたいのです。
プロパティで設定する方法か、
コードでそういったコードはありますか?
要するに、リターンしたら上の行に一行追加して、
そこから書き始めるということですかね。
もちろん
>プロパティで設定する方法か、
>コードでそういったコードはありますか?
は有りません、自分でコードを書くだけです。
当方VB6.0ですが、考え方は同じだと思うので
通常、Text1.Text = Text1.Text + "文字列"とするはずですが
Text1.Text = "文字列" + Text1.Textとしたらできるのではないかと
※.NetだとTextBox1.Textになるのかな
スンマソ
質問内容を物凄く勘違いしてますたorz
いや、通ってみたさんのいうとおり
"文字列" + Text1.Textとしたら下から上と文字列が代入する
ようにりました、しかし、このやり方だとスタート位置が
通常の上の段からスタートして前のデータの前に次のデータが代入
する形になってしまいます。
スタート位置をテキストボックスの最下段からスタートして
上記のように出来ないものでしょうか?
最初の投稿:
> 下から上と文字列が代入する
9/12の投稿:
> 下から入力する
違いがごちゃまぜになっているのが原因かな…
> スタート位置をテキストボックスの最下段からスタートして
> 上記のように出来ないものでしょうか?
もっと綿密な仕様を考えてみましょう。
現状では次の場合が未定義です。
・一行の終端を示すイベント
・行の、既に入力されている文字列の途中で、
一行の終端を示すイベントが発生した場合
とか…他にもあるし。
それはおいといて、
> スタート位置をテキストボックスの最下段からスタート
というのなら、テキストボックスのプロパティを全部眺めると…SelStartとかない?
SelStart
NET2003ですけど、ないですよ。
これに変わるプロパティはないものですかねぇ
>SelStart
SelectionStart
魔界の弁護士さんありがとうございます。
ちなみにSelectionStartをつかって
最下段に入力位置を設定するにはどうしたらよいのでしょう?
> 魔界の弁護士さん
……誰? (泣)
http://yaplog.jp/orator/archive/20
> ちなみにSelectionStartをつかって
> 最下段に入力位置を設定するにはどうしたらよいのでしょう?
最下段までの文字数を取得して、それを設定すれば良いかと。
(ガッさんが書かれたように、事前に細かい仕様を決めておく必要はありますが)
>……誰? (泣)
いやだなぁ、弁護士はネタですよネタ!w
>最下段までの文字数を取得して、それを設定すれば良いかと。
>(ガッさんが書かれたように、事前に細かい仕様を決めておく必要はありま >すが)
もうちょっと噛み砕いて説明してもらわないと僕みたいな
頭の悪い子ちゃんにはわけワカメっすよ〜w
> もうちょっと噛み砕いて説明してもらわないと僕みたいな
> 頭の悪い子ちゃんにはわけワカメっすよ〜w
当然ググったりMSDN引っ張ったり、リアルの身近な人に聞いたりした結果ですよね?
というわけで、貴方がすでに調べた結果をここに書き下してください。
そうすれば活路も見えてくるでしょう。
説明つきコードをください。
頭の悪い子ちゃんなんでMSDNでしらべても意味わかんないっす♪
> いやだなぁ、
嫌ですよ。そういう冗談はホントに。(T_T)
> わけワカメ
# おぉっ。goo辞書に載ってるのか……。(滝汗
# http://dictionary.goo.ne.jp/search.php?id=%A4%EF149111640000000000&kind=jn&mode=5
> もうちょっと噛み砕いて説明してもらわないと僕みたいな
その前に、そちらの状況を噛み砕いてもらっても良いですかね? (^_^;)
正直なところ、細かい仕様などが曖昧な上に、どういう場面で、
どのような用途で使われるのかすら、まったく想像できないので、
こちらとしても、どのように回答(≠解答)すべきか悩んでいます……。
テキストの下揃え表示、というのとも違うみたいですし。
# 質問内容から、私が勝手に想像したのは……たとえば、計測器等から
# 得られる情報が、ログとして随時、TextBoxに追記されていくような
# 状況が思い浮かんだのですが——多分、違うのでしょうね。
------------
> ある地点から(下)から上へ
> 文字を代入して生きたいのです。
『ある地点から』とありますが、この部分の意味が理解できませんでした。
もう少し具体的に教えてください。
1. 『ある地点』「から」は下から上に代入されていくとして——。
その『ある地点」「よりも前の部分」は、通常通り、上から下に
代入されていく、という事で良いでしょうか?
その場合、「下から上」と「上から下」の境界部付近では、
テキストがどのように表示されるのでしょうか?
(すみません、具体的な画面イメージが想像できません……)
2. その『ある地点』とは、具体的には何を元に決定されるのでしょうか。
具体的な例を挙げていただけると、仕様を想像しやすいです。
たとえば、テキスト中に特定のデータがあって、それが「ある地点」に
なっているとか……あるいは、データの行数や、画面上の座標によって、
「ある地点」を決めている、とか。
3. (LabelやListBox等ではなく)TextBoxを使おうとしているという事は、
表示だけではなく、ユーザーからの入力もあるのだと思います。
となると、ユーザーからのキーボード入力が行われた場合、その
「ある地点」よりも前に入力されているのか、後ろに入力されて
いるのかという判断は、入力するキャレット位置(SelectionStartの値)が
分かれば、判定可能ですか?
>>説明つきコードをください。
どこかで見たセリフだけど・・・
ここまで説明してもらっても理解しようとせずに、人の名前で「ネタ」なんて言って余裕カマしてるヒマがあったら、その命令文の意味を調べた方がナンボか有意義だよ
※また逆ギレされるオチなんだろうけど
すいません、状況説明がたりなくて。
別にテキストボックスで無くていいです。
ご察しの通り情報がテキストないしラベルやリッチテキストなどに
入ってくる感じです。リードオンリーで入力する必要はないです
イメージとしては・・
Aデータ名Bデータ名Cデータ名
↑
↑
・
・
・
(方向)
1613 1163 1356 ←ちなみにデータ名の下に綺麗に並べたいです。
1853 513 1530 ←上にデータが次々に乗ります(2番目)
11254 1635 16463 ←最下段 次々と情報代入(最初のデータ)
データの桁が変わりますので上のデータ名の列からはみ出さない
ように数字の一桁を揃えるにはどうしたら良いでしょう?
基本的に最下段というのは文字が入力できる最後の行
のことです。
>その命令文の意味を調べた方がナンボか有意義だよ
これでも馬鹿は馬鹿なりに自分で調べてるっすよ♪
> 別にテキストボックスで無くていいです。
おっと。最初の質問では、前提条件が「テキストボックス」だったのに、
ここで方向性が、ガラッと変わってしまいましたね。(汗
> リードオンリーで入力する必要はないです
> イメージとしては・・
このように、目的も含めた「具体的」な話があると、回答しやすいです。(^-^
# なぜその手段を採用したのか、という「目的」が重要な場合もありますので。
> 1613 1163 1356 ←ちなみにデータ名の下に綺麗に並べたいです。
> 1853 513 1530 ←上にデータが次々に乗ります(2番目)
> 11254 1635 16463 ←最下段 次々と情報代入(最初のデータ)
あぁ、何となく見えてきたかも。
説明するのが難しいので、コード例で書いてみます。
フォームに、「ListBox」と「Button」と「MultiLine=TrueなTextBox」を
貼って、下記を実行してみてください。
'-----------------------------------
'元データが、2次元配列で存在していたと仮定
Private Table(,) As Integer = { _
{11254, 1853, 1613}, _
{1853, 513, 1530}, _
{101, 201, 301}, _
{102, 202, 302}, _
{103, 203, 303}, _
{104, 204, 304}, _
{105, 205, 305}, _
{106, 206, 306}, _
{107, 207, 307}, _
{108, 208, 308} _
}
Private RowIndex As Integer = 0 '行番号
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
'プロポーショナルフォント(MS Pゴシック等)ではなく、
'固定ピッチフォント(MS ゴシック等)を設定しておく事
'(コードではなく、デザイン段階で設定しておいてもOK)
Dim F As Font = New Font("MS ゴシック", 12)
ListBox1.Font = F
TextBox1.Font = F
TextBox1.Clear()
TextBox1.ReadOnly = True
End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
'各列、8桁で右寄せ表示した文字列に整形する
Const TextFormat As String = "{0,8} {1,8} {2,8}"
Dim Row As String
Row = String.Format(TextFormat, _
Table(RowIndex, 0), _
Table(RowIndex, 1), _
Table(RowIndex, 2))
'Selection系プロパティを用いて、TextBoxの先頭に挿入
TextBox1.SelectionStart = 0
TextBox1.SelectedText = Row & vbCrLf
'Insertメソッドを用いて、ListBoxの先頭に挿入
ListBox1.Items.Insert(0, Row)
RowIndex += 1
If Table.GetUpperBound(0) < RowIndex Then
'データを表示しきったら、ボタンを使用不可に
Button1.Enabled = False
End If
End Sub
'-----------------------------------
で、上記では ListBox や TextBox を使い、文字位置を空白で揃えて
代入していますが、もっと細かい位置調整が必要だったり、列ごとに
右揃え/左揃え/中央揃えを指定したい場合は、ListViewやDataGridなどの
コントロールを使う方法や、自前で「描画」するという手法もあります。
> これでも馬鹿は馬鹿なりに自分で調べてるっすよ♪
ならば、調べた結果を、もっと見える形で相手に伝えましょう。
せめて、もらった回答や忠告に対して、どこまで調べたのか/あるいは、
回答の何がわからないのかを『具体的』に示さないと、コミュニケーションが
成り立たなくなってしまいます。(T_T)
調べた結果を示さずに、いきなり「説明つきコードをください。」とか
「もうちょっと噛み砕いて説明してもらわないと」と『だけ』書かれて
しまえば、自分の回答を一蹴された/無視された気分になりますので、
それ以降、その人に/その質問に回答する気がゴッソリ失せてしまいます…。
魔界の仮面弁士さん、一応やって確かめましたが
まだ僕がいっている意味が残念ながらが十分伝わってないようです。
情報はwebから一応拾ってくるのでテキストボックスは必要ないように
おもうのですが?
これは何のためにあるのですか?
それと一番分かってほしいところが違うのです。
なんどもいうように最下段のデータをlistbox1の最後の行からスタート
させて上にデータが乗っかっていくようにしたいのです。
魔界の仮面弁士さんのつくったコードは
最下段のデータがlistbox1の一番上の行からスタートしてその上にデータが乗っかっていく感じなっています。
伝わりませんかね?この違い?僕の言い方が悪いですかね?
通常プログラムコードは上から実行していきますよね、それを逆から実行していくといえばいいのでしょうか?
申し訳ないですがこれ以上いいようがないです。
どうかご理解のほど宜しくお願いします。
Aデータ名Bデータ名Cデータ名 |←このデータ名は任意の場所に固定
↑ ||←表示できない箇所はスクロールバーを
↑ || 使う。
・ |
・ |
・ |
(方向) |
1613 1163 1356 |
1853 513 1530 |←上にデータが乗っかる
11254 1635 16463 |←リストボックスの枠listboxの最後の行
-----------------------------
こんな感じなんですがわかりますか?
あ!ごめんなさい!なんかテキストに書いたときと表示される
ときとではリストボックスの枠がずれますね。
縦線がまっすぐ並んでると解釈してください。
> まだ僕がいっている意味が残念ながらが十分伝わってないようです。
なかなか伝わらないのは、動作仕様が最初から充分に書かれておらず、
情報が小出しにされているからだと思いますよ……。
ユーザーからの入力がない(リードオンリー)というのも、随分後になってからの
情報提示でしたたし、データ量が多かった場合にスクロールバーを使うという
話についても、今回初めて明かされた情報ですよね。
> なんどもいうように最下段のデータをlistbox1の最後の行からスタート
> させて上にデータが乗っかっていくようにしたいのです。
少なくとも、データが『コントロールの高さ分の件数に達した後』の
追加動作に関しては、提示されたコードで充分だと思うのですが、如何でしょう?
それとも、件数が多くなってきた後の動作についても、まだ違いがありますでしょうか。
> 最下段のデータがlistbox1の一番上の行からスタートしてその上にデータが乗っかっていく感じなっています。
見て欲しいのはそこではなく、むしろ、SelectionStart等の使用方法だったりします。
あのサンプルでは、SelectionStartプロパティ や Insert メソッドに、
『0』という位置情報を渡すことで、TextBox や ListBox の「先頭行」に
データを追加していますが、その点には気付かれましたでしょうか。
で、「0」だと常に先頭になってしまいますが、この値を調整すれば、
先頭以外の部分(たとえば、「前回追加した行の一つ前の行位置」とか)に
登録する事も可能になる……というわけです。
なので後は、その「挿入すべき位置」を割り出す方法を調べていただければ
OK だと思いますよ。挿入するデータ件数などをカウントしていれば、
何行目に追加すれば良いのかも、おのずと算出できますよね。
ヒントを書くと——件数が少ない時には、コントロールに最初から
「空行」を含めておき、随時、その空行項目の置き換えをすると良いでしょう。
たとえば ListBox の場合には、
ListBox1.Items(行位置) = "新しいデータ"
のようにすると、特定行のデータを入れ替えることができますので、
これを使うことができるでしょうね。
一方、TextBox の場合は、先のサンプルにも少し書きましたように、
Selection系プロパティを組みあわせる事で、特定位置の文字列を
差替える事ができます。
ツイート | ![]() |