- PR -

レジストリへの保存方法

投稿者投稿内容
Nakata
常連さん
会議室デビュー日: 2004/03/30
投稿数: 41
投稿日時: 2004-05-08 09:41
Dim y As Single = Val(Me.TextBox1.Text)
Dim m As Single = Val(Me.TextBox2.Text)
Dim d As Single = Val(Me.TextBox3.Text)
Dim Interval As Single

なんでレジストリで読み込んだ値が↑のコードに反映しないかわからないです×
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-05-08 10:27
諸農です。

引用:

Nakataさんの書き込み (2004-05-08 09:41) より:
Dim y As Single = Val(Me.TextBox1.Text)
Dim m As Single = Val(Me.TextBox2.Text)
Dim d As Single = Val(Me.TextBox3.Text)
Dim Interval As Single

なんでレジストリで読み込んだ値が↑のコードに反映しないかわからないです×



あのですね。。。
もー、同じ話の堂々巡りじゃないですか。

引用:

'レジストリから読み込む
Dim key As Microsoft.Win32.RegistryKey=Microsoft.Win32.Registry.CurrentUser
key = key.OpenSubKey( _
"software/VB and VBA Program Settings/VBTips")

TextBox1.Text = key.GetValue("TextBox1.name")
TextBox2.Text = key.GetValue("TextBox2.name")
TextBox3.Text = key.GetValue("TextBox3.name")
TextBox4.Text = key.GetValue("TextBox4.name")



このコードの key = key.OpenSubKey( の部分にブレークポイントを
仕掛けて、ステップ実行しながら
1.key変数がnull参照になっていないか。
2.TextBox1.Textに期待した値が格納されているか。
3.TextBox2.Textに期待した値が格納されているか。
4.TextBox3.Textに期待した値が格納されているか。
 ※Regeditで対象のサブキーにある名前に対応する値を確認して比較してください
  サブキー:"software\VB and VBA Program Settings\VBTips"
  名前:TextBox1.name、TextBox2.name、TextBox3.name

このスレッドを続けられたいとお考えなのでしたら、
是非、上記作業の結果を回答ください。



以下、再質問です。
是非、お答えください。

引用:

Q. ご自分でデバッグされましたか?
A.はい



デバッグには、ステップ実行での値の確認、
トレースログによる値の確認、実行経路の確認などありますが、
Nakataさんはどのようなデバッグ手法を取られていますか?

引用:

Q. 引数が "" で括られていますが、それはそれでいいのですか?
A.keyの名前なのでいいんじゃないですか?わからないです。



Regeditで確認すると""で括られた名前があるのですか?
「〜でいんじゃないですか」とはどう意味ですか?
「わからない」とはどういう意味ですか?
この状況でデバッグしていると言えますか?
この回答は、正直、「ふざけている」としか思えない。

引用:

Q. 特定の日付から現在日付を引き算していますが、それでいいのですか?
  ※この関数の仕様が、差を絶対値で返すのでしたら問題なさそうですね。
A.これは多分いいと思います。


「多分いい」とはどういう意味ですか?
「多分」といった感覚でプログラムコードが思った通りには動作しない、
という話は、これまでのやりとりの中でたくさん指摘されています。
あまりおふざけにならないようにしていただけませんか。

引用:

Q. (DateDiff関数、またはその他の箇所で)ArgumentExceptionが発生していないですか?
A.「System.InvalidCastException' のハンドルされていない例外が microsoft.visualbasic.dll で発生しました。」はレジストリキーを削除するとでます。(""になってしまうからと思います。)
追加情報 : 文字列 "" から型 'Long' へのキャストが有効ではありません。


「レジストリキーを削除する」の意味はなんでしょうか?
実際にレジストリから削除する?
レジストリ読み込みのコードをプログラム上から削除する?

引用:

Q. Textbox2の数値を手作業で変更したのと、
  読み込みで表示されているものとの違いは何ですか?
  読み込みだと「1〜12」の範囲内で、手作業で変更したのが30とかでしょうか?
A.いえ日付の範囲内で入力しています。範囲外だとエラーがでます。


ですので、「Label1には処理された数値が出てきました」「出なかった」という時の
1.手作業で入力した値を教えてください。
2.読み込みで表示されている値を教えてください。

ちなみに、
引用:

Dim y As Single = Val(Me.TextBox1.Text)
Dim m As Single = Val(Me.TextBox2.Text)
Dim d As Single = Val(Me.TextBox3.Text)



なぜSingle型を使っているのでしょうか?
DateTimeのコンストラクタ引数は、System.Int32型または
System.Int64型を取るようですけど。

よろしくご回答をお願いします。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Nakata
常連さん
会議室デビュー日: 2004/03/30
投稿数: 41
投稿日時: 2004-05-08 11:12
ブレークポイントを仕掛けた所、各値は""と出てきました。

>デバッグには、ステップ実行での値の確認、
>トレースログによる値の確認、実行経路の確認などありますが、
>Nakataさんはどのようなデバッグ手法を取られていますか?
F5で実行できるデバッグです。初心者なのでトレースログによる値の確認、実行経路の確認の仕方等はわかりませんし、そこから何を得ればいいのかもわかりません。

>Regeditで確認すると""で括られた名前があるのですか?
>「〜でいんじゃないですか」とはどう意味ですか?
書き出しも("TextBox1.name") ですし、何よりこのスレッドで書き方を聞いたのですが…。

>Q. 特定の日付から現在日付を引き算していますが、それでいいのですか?
現在日付からTextboxに入力された値を引いています。

>「レジストリキーを削除する」の意味はなんでしょうか?
>実際にレジストリから削除する?
>レジストリ読み込みのコードをプログラム上から削除する?
http://dobon.net/vb/dotnet/system/registrykey.html
↑これです。

>ちなみに、
引用:
--------------------------------------------------------------------------------


Dim y As Single = Val(Me.TextBox1.Text)
Dim m As Single = Val(Me.TextBox2.Text)
Dim d As Single = Val(Me.TextBox3.Text)

--------------------------------------------------------------------------------



なぜSingle型を使っているのでしょうか?
DateTimeのコンストラクタ引数は、System.Int32型または
System.Int64型を取るようですけど。

いや、そこはレジストリの読み込みを入れなければ動作していましたので。







[ メッセージ編集済み 編集者: Nakata 編集日時 2004-05-08 11:17 ]
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-05-08 12:47
諸農です。

新規でプロジェクトを作成してください。
フォームにTextBoxコントロールを3つ配置してください。
フォームにLabelコントロールを1つ配置してください。
フォームにButtonコントロールを2つ配置してください。

アプリケーションでレジストリのCurrentUserハイブに
次のサブキーを作成することにします。
「SoftWare\Nakta\VBRegTest」
このサブキーに、日付情報を格納するための
Year,Month,Dayという名前のエントリも作成します。
Year,Month,Dayの値は、フォーム上のTextBox1〜TextBox3に
入力された値を利用します。
それぞれ、TextBox1が年に、TextBox2が月に、TextBox3が日に対応します。

フォーム上のButton1コントロールをダブルクリックして、
イベントハンドラスケルトンを作成して次のコードを書きます。

コード:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim y As Integer = Int32.Parse(TextBox1.Text)
Dim m As Integer = Int32.Parse(TextBox2.Text)
Dim d As Integer = Int32.Parse(TextBox3.Text)
Dim dt As DateTime = New DateTime(y, m, d, 23, 59, 59)
If dt >= DateTime.Now Then Throw New Exception("本日以降の入力は不可です")

Dim key As Microsoft.Win32.RegistryKey
key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("SoftWare\Nakta\VBRegTest\")
Try
key.SetValue("Year", y)
key.SetValue("Month", m)
key.SetValue("Day", d)
Finally
key.Close()
End Try
End Sub



次に、レジストリに書き込まれた値を読み出して、現在日付との差を求める処理を作成します。
レジストリから読み込み対象の名前が見つからなかった場合は、デフォルト値として現在日付値を利用します。

フォーム上のButton2コントロールをダブルクリックして、
イベントハンドラスケルトンを作成して次のコードを書きます。

コード:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""

Dim dt As DateTime = DateTime.Now
Dim y As Integer = dt.Year
Dim m As Integer = dt.Month
Dim d As Integer = dt.Day

Dim yy As Integer
Dim mm As Integer
Dim dd As Integer
Dim key As Microsoft.Win32.RegistryKey
key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SoftWare\Nakta\VBRegTest\")
Try
yy = key.GetValue("Year", y)
mm = key.GetValue("Month", m)
dd = key.GetValue("Day", d)
Finally
key.Close()
End Try

Dim ddtt As DateTime = New DateTime(yy, mm, dd)
Dim ts As TimeSpan = dt.Subtract(ddtt)
Label1.Text = dt.ToString("yyyy/MM/dd") + "から" + ddtt.ToString("yyyy/MM/dd") _
+ "までの日数は" + ts.Days.ToString() + "日間です"
End Sub



上記のButton1、Button2のクリックイベントハンドラを書き終えたらアプリケーションを実行します。
フォームが表示されたら、最初にフォーム上のTextBox1〜3に順に「年」「月」「日」を入力します。
「年」「月」「日」の入力が完了したら、Button1をクリックします。
Regedtを起動して「CurrentUser」ハイブ配下に「SoftWare\Nakta\VBRegTest」の
サブキーが作成されて、エントリに「Year」「Month」「Day」が作られており、
それぞれの値が、TextBox1〜3で入力した値になっているか確認します。
確認ができたら、Button2をクリックします。
Label1コントロールに日付計算結果のメッセージが表示されればOKです。

以上で、このスレッドで話題になった疑問のすべてが解決できたと思います。
今後、これ以上は何も期待できないと思います。
では、休日をお楽しみください。


_________________
諸農和岳
Powered by Borland Delphi/C++Builder & Microsoft VS.NET

[ メッセージ編集済み 編集者: Jubei 編集日時 2004-05-08 12:50 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-10 09:53
なんか、休みを挟んでえらいことになっていますが。

 まず、私のコメントが混乱の一つになっているようです。すみません。

-----
> ただし、"abc1"などは、TextBox1.Nameなどとする方がよいでしょう。

これは、
key.GetValue("TextBox1.name")
を意味せず、
key.GetValue(TextBox1.Name)
を意味します。これがどういう違いを引き起こすか、理解されていないようですね。困りました。

「理解していない」と判断した理由: 2004-05-08 09:13より、
> Q. 引数が "" で括られていますが、それはそれでいいのですか?
> A.keyの名前なのでいいんじゃないですか?わからないです。

 keyの名前なのですが、"TextBox1.name"とすると、キーの名前が「TextBox1.name」になります。が、ダブルクォーテーションをつけずにTextBox1.Nameとすると、キーの名前はTextBox1につけたキーの名前になります。
 なぜこうした方がよいと書いたかというと、レジストリエディタでレジストリを見たときに、キーの名称がテキストボッスに付けた名称と同じになり、
見やすいだろうと思ったからです。


-----
 それから「初心者だから」というのは言い訳であって、わからない理由にはなりません。わからなければ理解できるようになってください。理解する為には何をすればいいか、考えてください。何らかのプログラムを作って、それをメンテナンスするのはあなたですから、あなたがわかっていなければ、ダメなんです。
 ここで回答している人たちが、いつまでもここにいるわけではありません。しかし、あなたが作ったプログラムは、いつまでもあなたのそばにあります。メンテできるのはあなただけです。

 「初心者だから、こうすることがわからなかった」というのは、かまいません。が、それがいつまでも続けられるとは思わないでください。今は初心者かもしれませんが、いつまでも初心者ではないはずですから。


 あと、諸農さん、あまり熱くなりすぎないように。
#私は子供にうつされた風邪で、熱が上がりましたが。。。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-10 10:26
引用:

Nakataさんの書き込み (2004-05-08 11:12) より:

F5で実行できるデバッグです。初心者なのでトレースログによる値の確認、実行経路の確認の仕方等はわかりませんし、そこから何を得ればいいのかもわかりません。


書き足しました。
デバッグのしかた
習得してください。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-05-10 12:00
諸農です。

Jittaさん、いつもフォローありがとうございますm(__)m

引用:

 あと、諸農さん、あまり熱くなりすぎないように。



えへへ(^^;
結局、あのやりとりの中で感じた事は
「何も考えずにコピペだけで動作してくれるコードが欲しい」
のだろうなぁと思いまして。。

引用:

#私は子供にうつされた風邪で、熱が上がりましたが。。。



ウチはさっきからひきつけを起こしたように泣き叫んでいます。。(x_x)

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Nakata
常連さん
会議室デビュー日: 2004/03/30
投稿数: 41
投稿日時: 2004-05-11 06:19
色々ご迷惑をお掛けしまして本当に申し訳ありません。
ただコピペしただけで動くコードが欲しかったんじゃなく、
コードの決まった書き方を教えて欲しかっただけです。

次回からは、スレッドのファイルが燃えないように頑張る次第です。
みなさんは、どうやってVBを覚えたのでしょうか?
(Try〜Finallyなんて初めて見たもので(^^; )
よろしければ効率の良い学習方法等を教えてもらえると嬉しいです。

スキルアップ/キャリアアップ(JOB@IT)