Visual Basic 中学校 掲示板
投稿内容
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
>
投稿一覧
>
履歴表示
タグの編集...
投稿者
素人PG
 (社会人)   投稿日時
2016/9/9 15:23:44
初心者です 教えてください
履歴を残す方法がわかりません
例
Textbox1.textに表示された文字をTextbox10.textに表示し残す
またTextbox1.textに表示された文字をTextbox11.textに表示し残す
テキスト1は一つだけの表示で
他は何個かあり、履歴を残してく感じです
現在、ソケット通信で送られてきた文字列を
text1に表示その文字を履歴Boxに残すということ動作をしたいんですが
text1は表示されますが
他の表示はされません
よろしくお願い致します。
投稿者
魔界の仮面弁士
 (社会人)   投稿日時
2016/9/9 16:21:29
> 履歴を残す方法がわかりません
特定の何かの履歴というわけではなく、
アンドゥ操作のための一般的な話、で良いでしょうか。
だとすると「Memento パターン」による実装がよく使われます。
http://naoko.wankuma.com/designpatterns/designpatterns_0018_memento.html
http://hccweb1.bai.ne.jp/tsune-1/VisualBasic/memento.html
> Textbox1.textに表示された文字をTextbox10.textに表示し残す
> Textbox1.textに表示された文字をTextbox11.textに表示し残す
どのタイミングで履歴として残すのでしょうか?
(1) コードから TextBox1 を操作したときに、履歴ボックスにも残す
(2) ユーザーが履歴保存ボタンを押すたびに残す
(3) ユーザーが TextBox1.Text に一文字ずつ打つたびに残す
(4) ユーザー入力後、フォーカスが外れたタイミングで残す
(5) その他
もしも(1) なら、
TextBox1.Text = "新しい文字列"
TextBox11.Text = "新しい文字列"
のように、同じデータを複数の TextBox に渡せば良いだけかと。
毎回複数回記述するのが面倒なら、両方にセットするための
メソッドを自作するなどして対処できます。
また、(2)だとしたら、そのボタン操作において、
TextBox10.Text = TextBox1.Text
のようにコピーするだけで良いでしょう。
もちろん、どの TextBox に残すのかという管理は別途必要ですが。
(3) の場合、上記の処理を TextChange イベントに書くことができます。
ただし、一文字打つごとに反応するので注意が必要ですね。
この方法は、コードから TextBox1.Text を変更した場合にも反応します。
(4) の場合はたとえば、Leave イベントにて
If TextBox1.Modified Then
TextBox1.Modified = False
TextBox10.Text = TextBox1.Text
End If
のようにします。Modified はユーザー入力時には True となり、
コードから Text をセットした時は False になるプロパティであり、
上記では、履歴転送後に再転送されることを防ぐために使っています。
> 現在、ソケット通信で送られてきた文字列を
ソケットは非同期通信でしょうか。それとも同期的なのでしょうか。
> text1に表示その文字を履歴Boxに残すということ動作をしたいんですが
どのような実装になっているかにもよりますが、コード設計においては、
画面上の「入力・表示」と、それを保持する「データ」は分けて考えます。
たとえば、入力されたデータは履歴管理用の変数に別に記録しておき、
履歴表示用テキストボックスは、その変数の内容を表示するようにします。
こうすることで、履歴表示機能が「TextBox10 と TextBox11 の 2 つ」から
「20 個の TextBox」になったり、「ListBox に履歴を表示する」などの
画面修正が行われても、履歴管理機能そのものには手を加えずに済みます。
> text1は表示されますが
> 他の表示はされません
表示させないのなら、わざわざ TextBox で管理する必要は無いかと。
String 配列やコレクションで管理しておくだけで十分だと思いますよ。
投稿者
素人PG
 (社会人)   投稿日時
2016/9/9 16:49:25
魔界の仮面弁士様
ありがとうございます
説明不足でわかりづらくすいません。
ソケット通信にて別のPCもしくわ無線機から文字列を送り
ソケット受信で
送信された文字列を,Textbox1に表示させています
そのあとにコマンドボタンを押すと
別の小さいなTextbox2に最初に来た文字を残す
また新たな文字列が送信されたら
textbox1に表示されて
今度は別の小さなTextbox3に次に来た文字を残す
と 4.56・・・と続きます
表示は1つ あとはひとつ前の文字列が残るみたいなものです
1回目の表示を残すのは簡単ですが
2回目からがよくわからず。。
わかりづらくてすいません。
投稿者
shu
 (社会人)   投稿日時
2016/9/9 21:32:54
受信毎にTextBoxの中身がどのように変わっていくのか考えてみると
よいかと思います。たとえば
textBox1 textBox2 textBox3 textBox4 textBox5
1 a
2 b a
3 c b a
4 d c b a
5 e d c b a
6 f e d c b
7 g f e d c
のような感じとか動きを想定してみて
それに合うようにコーディングしてみるとよいかと思います。
投稿者
素人PG
 (社会人)   投稿日時
2016/9/14 11:56:51
shu様
ありがとうございます。
'ソケットによる通信
Textbox1.text = "表示" '指示
'受信
Textbox1.text (テキストに表示)
'履歴表示1
Textbox1.text = Textbox2.text
ソケットによる通信
Textbox1.text = "表示②"
'受信
Textbox1.text (テキストに表示)
'履歴表示2
Textbox1.text = Textbox3.text
これだとただ、表示された文字が
2.3に表示されるのと
1が変わるため、履歴にもならないですよね・・?
投稿者
魔界の仮面弁士
 (社会人)   投稿日時
2016/9/14 12:40:40
やりたい事がまだ明確に理解しきれていないのですが、
もしも shu さんの書かれた
(a → b → c → d → e → f → g と受信)
textBox1 textBox2 textBox3 textBox4 textBox5
1回目 a
2回目 b a
3回目 c b a
4回目 d c b a
5回目 e d c b a
6回目 f e d c b
7回目 g f e d c
のイメージで良いなら、従来、
TextBox1.Text =
"新しい受信データ"
としていたところを、
UpdateText(
"新しい受信データ"
)
に置き換えることで解決できる気がします。
ここでいう UpdateText の実装はこんな感じです。
Public
Sub
UpdateText(
ByVal
newReceivedText
As
String
)
TextBox5.Text = TextBox4.Text
TextBox4.Text = TextBox3.Text
TextBox3.Text = TextBox2.Text
TextBox2.Text = TextBox1.Text
TextBox1.Text = newReceivedText
End
Sub
そうではなく、
(a → b → c → d → e → f → g と受信)
textBox1 textBox2 textBox3 textBox4 textBox5
1回目 a
2回目 ab a
3回目 abc ab a
4回目 abcd abc ab a
5回目 abcde abcd abc ab a
6回目 abcdef abcde abcd abc ab
7回目 abcdefg abcdef abcde abcd abc
のイメージなら、上記の UpdateText の最後の行を
TextBox1.Text &= newReceivedText
に置き換えれば OK です。
(a → b → c → d → e → f → g と受信)
textBox1 textBox2 textBox3 textBox4 textBox5
1回目 a
2回目 ba a
3回目 cba ba a
4回目 dcba cba ba a
5回目 edcba dcba cba ba a
6回目 fedcba edcba dcba cba ba
7回目 gfedcba fedcba edcba dcba cba
だとしたら、
TextBox1.Text = newReceivedText & TextBox1.Text
です。
投稿者
素人PG
 (社会人)   投稿日時
2016/9/14 14:52:50
魔界の仮面弁士様
a → b → c → d → e → f → g と受信)
textBox1 textBox2 textBox3 textBox4 textBox5
1回目 a
2回目 b a
3回目 c b a
4回目 d c b a
5回目 e d c b a
6回目 f e d c b
7回目 g f e d c
これがやりたいんです!!
Public Sub UpdateText(ByVal newReceivedText As String)
TextBox5.Text = TextBox4.Text
TextBox4.Text = TextBox3.Text
TextBox3.Text = TextBox2.Text
TextBox2.Text = TextBox1.Text
TextBox1.Text = newReceivedText
End Sub
UpdateTextを Textbox1.text関係を置き換えるということですか
全然理解できてなくてすいません。
投稿者
魔界の仮面弁士
 (社会人)   投稿日時
2016/9/14 15:21:21
済みません。どういう処理を想定されているのか、
未だに良く分からないです。
望む結果になるかどうかは、御自身で確認して見てください。
> これがやりたいんです!!
この場合、各TextBox には 1 文字ずつしか入っていませんね。
しかし、最初の質問では
>> 現在、ソケット通信で送られてきた文字列を
と書かれていたたと思います。
送られてくるデータは、「文字」ではなく『文字列』なのですよね?
でも、TextBox に表示するのは「文字」単位なのでしょうか。
たとえば、"4.56" という 4 文字の『文字列』を受け取った時に、
それを "4" と "." と "5" と "6" という 4 つの「文字」に分割して
それぞれの TextBox に表示したいという話なのでしょうか?
しかし、それだと履歴とは別の話になってしまいますよね…。
> UpdateTextを Textbox1.text関係を置き換えるということですか
基本的にはそういうつもりだったのですが、そもそも
ソケット通信の結果をどのように TextBox1 に
表示させていたのかという部分さえも確証が持てないので、
それで望む結果になるのかどうかは保証できません。
(ソケット通信が同期的なのか非同期的なのか、
別スレッドでの受信なのかなどで、必要な手続きも変わりますし)
> 全然理解できてなくてすいません。
こちらも質問内容を理解できていないので、お互いの会話が
噛み合っているのかすれ違っているのか不安なところです。
もし、ソケット通信というか、既存の TextBox 操作に
手を加えたくないのであれば、TextChanged イベントを
使ってみるという手もあるかもしれません。
下記のコードを仕込んでおくと、TextBox1.Text へと
入力処理を行うたびに、それ以前の入力データが
他の TextBox へと移動していきます。
(コードから書き換えた場合だけでなく、手で入力した場合も移動されます)
Private
Sub
TextBox1_TextChanged(sender
As
Object
, e
As
EventArgs)
Handles
TextBox1.TextChanged
TextBox2.Text =
CStr
(TextBox1.Tag)
TextBox1.Tag = TextBox1.Text
End
Sub
Private
Sub
TextBox2_TextChanged(sender
As
Object
, e
As
EventArgs)
Handles
TextBox2.TextChanged
TextBox3.Text =
CStr
(TextBox2.Tag)
TextBox2.Tag = TextBox2.Text
End
Sub
Private
Sub
TextBox3_TextChanged(sender
As
Object
, e
As
EventArgs)
Handles
TextBox3.TextChanged
TextBox4.Text =
CStr
(TextBox3.Tag)
TextBox3.Tag = TextBox3.Text
End
Sub
Private
Sub
TextBox4_TextChanged(sender
As
Object
, e
As
EventArgs)
Handles
TextBox4.TextChanged
TextBox5.Text =
CStr
(TextBox4.Tag)
TextBox4.Tag = TextBox4.Text
End
Sub
Private
Sub
TextBox5_TextChanged(sender
As
Object
, e
As
EventArgs)
Handles
TextBox5.TextChanged
'末尾なので何もしない
End
Sub
投稿者
素人PG
 (社会人)   投稿日時
2016/9/14 16:43:27
魔界の仮面弁士様
初心者ゆえに説明不足のため、わかりにくくて申し分けないです
ソケット通信自体は、別の方が作成しているためそもそもわかってない自分が
教えてくれ!てのことなのでさっぱりのため
勉強しないとだめですねw
送られてくるデータは
1,5555,44,
とか送られてきて
2番目の
Dim strTemp() As String = Split(TextBoxRcvData.Text, ",")
Textbox11.Text = strTemp(1)
で文字を受け取るといってました
5555を別のテキストに受信し
text1を メイン表示画面にtext2に表示
text2に表示されたのを
またtext3,4,5と履歴表示
多分、元がtext1になると思います。
投稿者
shu
 (社会人)   投稿日時
2016/9/15 15:09:46
> ・・・
> ・・・
> Dim strTemp() As String = Split(TextBoxRcvData.Text, ",")
>
> Textbox11.Text = strTemp(1)
>
> で文字を受け取るといってました
ここまではいいとするとソケット通信がという部分は考えなくてもよいですね。
> 5555を別のテキストに受信し
>
> text1を メイン表示画面にtext2に表示
>
> text2に表示されたのを
>
> またtext3,4,5と履歴表示
ここに『別のテキスト』、『text1』、『メイン表示画面』、『text2』、『text3』、『text4』?、『text5』?
が表れていますが、これらが具体的にどこに配置されていて、今回記述されているコードから
参照可能なようになっているのかが不明です。参照可能になっているのなら
今までの回答に出ている内容を考慮してもらえればやりたいことは実現出来そうな気がするのですが
何が実現できないのでしょうか?