2016/04/13(Wed) 21:19:21 編集(投稿者)
> ハンドルネームで誰だかの特定をする必要があるのでしたら以降改めます。
「誰かを特定する」という意味では、必要ありません。
私たちは、仕事をするときに、守秘義務を負います。
あることについて尋ね、解決しました。次のことについて尋ね、解決しました。
これを繰り返していくと、何を作っているのか、わかることがあります。
(もちろん、最初の質問だけでもわかることがあります。)
そうすると、守秘義務に反するかもしれません。
ですから、ある質問と、次の質問で、ハンドルを変えるのは「あり」です。
ただし、次の質問では、「ある質問」をしなかったとして、最初から解説しなければなりません。
よって、これが仕事に関係することなら、「こういう場所で、この内容で質問したい」と、上司に許可を求めておく方が安全です。
会社が隠したいものをあなたが知っている(「判断できる」ではない)、というなら、かまいませんが。
> 何分、初心者ゆえの悲しさ
> 判るようには書いた積もりなのですが申し訳ないです。
それはおかしいです。
確かに、「プログラムを作ること」については、初心者かもしれません。
しかし、「質問すること/尋ねること/学ぶこと」については、初心者ではないはずです。
プログラムとは、なんでしょうか。
音楽会や運動会の前に、「その会で何を、どの様な順番でするか」を書いたものをもらうのではないでしょうか。
その「することを順番を書いたもの」を「プログラム」といわないでしょうか。
我々が作るのは、「コンピュータに実現して欲しいことを、それが実現できる順番に、コンピュータにわかる言語で書いたもの」です。
そうすると、プログラムを作ること、すなわち「何かをするために、どんなことを、どんな順番にしなければならないかを考えること」も、初心者ではないはずです。
もっとも、人間は、その他の情報をつなぎ合わせて、語られなかったことを推測します。
コンピュータは、推測しません。
そのため、「これくらいでわかるだろう」「察してくれるだろう」が通用しません。
この、「察してくれるだろう」を排除することについては、初心者だと言えるでしょう。
そして、「語られなかったことを推測できない」のは、こういうネットの向こうの人に質問するときも同じです。
人間が推測するのは、情報があるからです。
周りにあるもの、表情、イントネーションといった情報から、何が重要かを推測します。
ということは、プログラムを作ることで悩むことと、ネットの向こうに質問しても「思う様な回答が得られない」は、ほぼ同じと言えます。
つまり、プログラム作りに悩んだからといって、プログラムを作るのと同じくらい難しいネットの向こうの人に尋ねるということをしているのは、私はおかしいと思います。
> 例えば、Form1の動作1をクリックすればForm2のLabel1に日時の表示がされます。
> そこで次にForm1の動作2をクリックです。
> さすれば新しくForm2が開きますが、そうではなく最初に開いたForm2をそのまま使いたいのです。
> 即ち、そのForm2には最初のLabel1と共にLabel2にも日時が表示がされることになります。
> もちろんLabel1の時計は一度も止まらずに。
* Form1 に、"動作1" と "動作2" というメニューがある。
* "動作1" は、Form2 を表示し、Form2 上の Label1 に、現在日時を表示する。
* "動作2" は、Form2 を表示し、Form2 上の Label2 に、現在日時を表示する。
("動作1" と "動作2" の違いは、現在日時の表示先である。)
* "動作1" 選択後に "動作2" を選択した、あるいはその逆の場合、Form2 の表示は1つのみとする。
* 現在日時は、リアルタイムで更新する。
「どうしたら、どうする」の様に、短文で並べる方が伝わりやすいです。
結局、コンピュータが理解できるのはこういう短文です。
我々は小学校からずっと、「作文」をさせられてきました。
いかに言葉を修飾して、美しい文章を書くかを習ってきました。
これは、コンピュータ向けのプログラム コードを書くということとは、真反対のことであると言えるでしょう。
しかし、ビジネス文書、特に仕様や報告では、このような短文が好まれます。
しかし、なんで、VB 使うかなぁ。
ソフトウェア開発者にとって、ソフトウェア開発者以外のプログラムを作らなければならない人向けに設計された VB って、使いにくいと思うんだけどなぁ。
Public Class Form1
Private f2 As Form2
Private Sub 動作1ToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles 動作1ToolStripMenuItem.Click
Dim flag As Integer = CTypeDynamic(Of Integer)(Me.f2.Tag)
flag = (flag Or 1)
Me.f2.Tag = flag
Me.f2.Show()
End Sub
Private Sub 動作2ToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles 動作2ToolStripMenuItem.Click
Dim flag As Integer = CTypeDynamic(Of Integer)(Me.f2.Tag)
flag = (flag Or 2)
Me.f2.Tag = flag
Me.f2.Show()
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Me.f2 = New Form2
Me.f2.Tag = 0
End Sub
End Class
Public Class Form2
Private Sub Form2_Shown(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown
Me.Timer1.Start()
End Sub
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
Dim flag As Integer = CTypeDynamic(Of Integer)(Me.Tag)
Dim now As String = DateTime.Now.ToString
If ((flag And 1) > 0) Then Label1.Text = String.Format("現在時刻1:{0}", now)
If ((flag And 2) > 0) Then Label2.Text = String.Format("現在時刻2:{0}", now)
End Sub
Private Sub Form2_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
e.Cancel = True
Me.Tag = 0
Me.Label1.Text = String.Empty
Me.Label2.Text = String.Empty
Me.Hide()
End Sub
End Class
通常、ON/OFF の状態を表すことを、フラグといいます。
フラグは、Boolean 型で True / False として表現することが多いです。
しかし、ON を 1、OFF を 0 として、数値型で表現することもできます。
解決策1:
今回、"動作1" と "動作2" という2つの状態を表すので、Form2 に Public な Boolean 型の2つのフラグを作れば良いでしょう。
解決策2:
1 or 0 なので、1ビットの幅があれば事足ります。
ですから、Int32 型を使うなら、1つの変数で32個の状態を表現することができます。
上記コードでは Tag に Integer 型を設定します。
最上位を1ビット目として、1は32ビット目、2は31ビット目ですから、ビットごとに別々の意味を持たせたフラグを設定したことになります。
解決策3:
解決策2では、1や2という数字の意味を、人が覚えておかなければなりません。
それは、結構しんどいことです。
そこで、列挙体に FlagsAttribute を付けてフラグとして扱います。