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』?
が表れていますが、これらが具体的にどこに配置されていて、今回記述されているコードから
参照可能なようになっているのかが不明です。参照可能になっているのなら
今までの回答に出ている内容を考慮してもらえればやりたいことは実現出来そうな気がするのですが
何が実現できないのでしょうか?