- PR -

レジストリへの保存方法

投稿者投稿内容
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-05-07 00:22
引用:

yoshiさんの書き込み (2004-05-06 23:44) より:

key.SetValue("abc", TextBox1.Text)
key.SetValue("abc", TextBox2.Text)
key.SetValue("abc", TextBox3.Text)
key.SetValue("abc", TextBox4.Text)

key.Close()

MSDNライブラリRegistryKey.SetValue メソッド を参考にさせてもらい、こういう風に書いてみましたが動作しませんでした。


ええと、動作しなかったってのはどう動作しなかったんでしょう?
読み込み部分はどうなっていますか?

ちなみに"abc"を指定している部分は保存する値の名称です。同じ名称で書き込んだら前の値は上書きされてなくなりますので、TextBox4の値しか残りません。
引用:

Public Sub SetValue( _ ByVal name As String, _ ByVal value As Object _)
このコードだとkeyなんて宣言しなくてもいいのですか?

Public Sub SetValue( _ ByVal abc As String, _ ByVal textbox.1 As Object _)

end sub

↑のような感じのコードに直せばいいのですか?(識別子が必要ですと出ますが…)
なんか無茶苦茶な質問ですいません×


ちょっと書かれてる事の意味が分からんです…
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-05-07 01:37
諸農です。

引用:

yoshiさんの書き込み (2004-05-06 23:44) より:
'レジストリへ書き出す
コード:
        Dim key As Microsoft.Win32.RegistryKey
        key = Microsoft.Win32.Registry.CurrentUser




RegistryKey型とRegistry型は違うと思うのですが、
コンパイルそのものはエラー無しだったのでしょうか?

引用:

Public Sub SetValue( _ ByVal name As String, _ ByVal value As Object _)
このコードだとkeyなんて宣言しなくてもいいのですか?



え??
ここで示されているSetValueメソッドはRegistryKey型のメソッドですか?
それとも何か別のメソッドですか?

引用:

Public Sub SetValue( _ ByVal abc As String, _ ByVal textbox.1 As Object _)

end sub

↑のような感じのコードに直せばいいのですか?(識別子が必要ですと出ますが…)
なんか無茶苦茶な質問ですいません×



うむむ。
プログラミング以前のレベルの様な雰囲気ですね。。。(^^;

メソッドをoverrideしているのでもなさそうですし、
だいたい、メソッドの引数に改行もされていないのに
「_」が入っていたり、「textbox.1」という妙な変数
が宣言されていたりしているので、変だと思いますよ。

上記のメソッドって、VBを使わない私から見てもまるっ
きり無茶苦茶なコーディングに見えますが。。
過去にVBによるプログラミングを経験されていたとい
う事ですので、コーディングの方法程度の知識はお持ち
だと思うのですが。

あと、質問の内容に対してコメントしたくても、
今回の投稿内容と過去の投稿内容のレスポンス(コードを
見ただけでクラス間連携の意味がわかった等)との
レベルの違いから、何をどうコメントしていいのか、
どのレベルのコメントをしたらいいのか、判断に苦しみます。

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

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Nakata
常連さん
会議室デビュー日: 2004/03/30
投稿数: 41
投稿日時: 2004-05-07 04:33
現在はこのようなコードを書いております。

'レジストリへ書き出す
Dim key As Microsoft.Win32.RegistryKey


key = Microsoft.Win32.Registry.CurrentUser
key = key.CreateSubKey( _
"software\VB and VBA Program Settings\VBTips")


key.SetValue("abc1", TextBox1.Text)
key.SetValue("abc2", TextBox2.Text)
key.SetValue("abc3", TextBox3.Text)
key.SetValue("abc4", TextBox4.Text)

key.Close()


'レジストリから読み込む

key = Microsoft.Win32.Registry.CurrentUser
key = key.OpenSubKey( _
"software\VB and VBA Program Settings\VBTips")

key.GetValue("abc1", TextBox1.Text)
key.GetValue("abc2", TextBox1.Text)
key.GetValue("abc3", TextBox1.Text)
key.GetValue("abc4", TextBox1.Text)

key.Close()

まだうまくいきませんが…。

>なちゃさん
>ええと、動作しなかったってのはどう動作しなかったんでしょう?
>読み込み部分はどうなっていますか?
各TextBoxに値が反映(書き出し・読み出し)されなかったと言う事です。

>ちょっと書かれてる事の意味が分からんです…
jittaさんに紹介してもらったRegistryKey.SetValue メソッドを見ると

[Visual Basic]
Overloads Public Function GetValue( _
ByVal index As Integer _
) As Object

と書いていたので、それを参考にコードを書いたらおかしくなってしまいました。
(_この記号は続くと言う意味なのかな?)



>Jubeiさん
>過去にVBによるプログラミングを経験されていたという事ですので
これは多分6.0から.netになって難しくなったと本で見てショックだったって
発言した事ですよね?
プログラミングは全然初心者ですよ。どんな言語を選んだらいいかわからなくて
とりあえず店頭で売っているVB.netを買いました。それで本を読んで上記に発言した
様な事が入門書に書いてあり、オークションでもいいから6.0を買っておけばよかったかなぁ?…ってな事です。
入門書ですら四苦八苦している初心者小僧なんです。
私のレベルおわかり頂けましたでしょうか?(レベル下の下って事です×)
全然関係の無い話を長々と申し訳ありません。




[ メッセージ編集済み 編集者: Nakata 編集日時 2004-05-07 04:34 ]

[ メッセージ編集済み 編集者: Nakata 編集日時 2004-05-07 06:36 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-07 08:29
引用:

Nakataさんの書き込み (2004-05-07 04:33) より:

key.GetValue("abc1", TextBox1.Text)
key.GetValue("abc2", TextBox1.Text)
key.GetValue("abc3", TextBox1.Text)
key.GetValue("abc4", TextBox1.Text)


 うにゃぁ〜?「RegistryKey.GetValue メソッド」に、使用例も載っているのですが…?


引用:

コード:
[Visual Basic]
Overloads Public Function GetValue( _
   ByVal index As Integer _
) As Object


と書いていたので、それを参考にコードを書いたらおかしくなってしまいました。
(_この記号は続くと言う意味なのかな?)


 う〜ん、宣言の読み方からご存じではない、ということでしょうか?
 「 _」(スペースと、アンダースコアと、改行の3点セット)で、「次行に続く」です。C言語系の言語と違って、BASIC系は1行1命令が原則ですので(原則=例外あり)、複数行にまたがる場合は、VB(6.0以前含む)では「 _」で次の行に続くことを示しています。
 また、この宣言より、GetValueが受け取る引数が1つであること、Objectクラスを返すことがわかります。つまり、GetValueのところの書き方が完全に間違っているのですが、そうすると赤(青?)の波下線が引かれているはずなのですが・・・(しかも、TextBox1に全部入れようとしているし)
-----
っと、ここまで書いてからGetValueを見直すと、これは「名前が見つからない場合のデフォルト値指定」ですね。つまり、指定したレジストリディレクトリに名前が見つからないと、TextBox1.Textの値で代替します、ということです。しかし、戻り値を受けていないので捨てられています。

 これを見ていると、質問より何より、まず文法を勉強してください、というところなのでしょうか。。。
Nakata
常連さん
会議室デビュー日: 2004/03/30
投稿数: 41
投稿日時: 2004-05-07 08:54
abcとTextbox1.text等を使用して説明はして頂けないでしょうか?
(答えになってしまいそうですが私の能力ではその方がわかりやすいかと…。)

引用:
--------------------------------------------------------------------------------


key1.SetValue(TextBox1.Text, TextBox2.Text)
key2.SetValue(TextBox3.Text, TextBox4.Text)
・・・
key1.GetValue(TextBox1.Text,textBox2.Text)
key2.GetValue(TextBox3.Text,TextBox4.Text)

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


とされていますが、これをトレースしてみましょう。

・TextBox1 ← 123
・TextBox2 ← 456
・TextBox3 ← 789
・TextBox4 ← 012


この説明を見てコードを書いて見たのですが…。
軽くパニックになっています(ToT)
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-05-07 09:41
諸農です。

引用:

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


上記の投稿で参考にされていたコードを元に解説を試みます。
コーディング規約(?)についてはJittaさんのコメントを参考にしてくださいませ。
--編集--
「コーディング規約」ではなく「文法に従った記述方法」ですね(^^;

コード:

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'上記はボタンがクリックされた際に呼び出されるイベントプロシージャの宣言です。
'この後の「End Sub」までがプロシージャ(メソッド)の範囲になります。

'レジストリから読み込む
Dim key As Microsoft.Win32.RegistryKey
'上記では「Microsoft.Win32.RegistryKey」型の「key」という変数を宣言しています。
'この時点ではまだkeyという変数には、「Microsoft.Win32.RegistryKey」型の
'インスタンスは格納されていません。インスタンスを格納する箱(入れ物)が用意されただけです

key = Microsoft.Win32.Registry.CurrentUser
'上記では「Microsoft.Win32.Registry」型のクラスのShared(static)なフィールド
'から「Microsoft.Win32.RegistryKey」型のインスタンスを取得して「key」の変数に
'格納しています。
'静的なメソッド、フィールドとは、クラスのインスタンスを作らなくても、クラスその
'ものを参照して利用できるクラスメンバのことです。対して静的でないものは、クラス
'のインスタンスを何らかの手法(例えばNewする、または上記「Registry」のように
'静的なメンバを利用して)で取得したうえで、インスタンスを利用してメソッドを呼び
'出したりします。

key = key.OpenSubKey( _
"softwareVB and VBA Program SettingsVBTips")
'上記は「key」という変数に格納された「RegistryKey」型のインスタンスを利用して、
'OpenSubKey()というメソッドを呼び出しています。
'元のコードでは2行にまたがって書かれていますが、1行で書くと「_」が無くなります。

key = key.OpenSubKey("softwareVB and VBA Program SettingsVBTips")
'ここでは、keyという変数、つまり「Microsoft.Win32.Registry.CurrentUser」の
'内容から取得したインスタンスを使って「"softwareVB and VBA Program SettingsVBTips"」
'を開くように「key」に対して指示をしています。そして、開いた結果を、再度「key」
'という変数に格納しています。
'このコードは次のようにも書く事が出来ます。

key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("softwareVB and VBA Program SettingsVBTips")
'これは「Microsoft.Win32.Registry.CurrentUser」部分で取得できた「RegistryKey」の
'インスタンスを変数に格納することなく直接利用して「.」に続く「OpenSubKey()」メ
'ソッドを呼び出しています。

Dim strVal As String = CType(key.GetValue("VB"), String)
'上記の「key.GetValue("VB")」は、RegistryKey型のインスタンスが格納されている
'key変数を利用して「RegistryKey」クラスの「GetValue()」メソッドを呼び出しています。
'GetValue()メソッドは次のように定義されています。
'「Overloads Public Function GetValue(String) As Object」
'最初の「Overloads」は「RegistryKey」クラスに「GetValue()」という名前の
'メソッドが複数定義されている事を示しています。同じ名前のメソッドでも、引数
'のパターンが個々に違います。言い換えれば同じ引数パラメータを持つ同名のメソ
'ッドを同じクラスには定義できないという事です。
'「GetValue(String) As Object」は「文字列」型を引数にして「Object」型を
'返すという事を意味しています。
'「RegistryKey.GetValue」は引数の文字列に「値の名前」を指定される事を
'想定しています。そしてその名前に対応したレジストリエントリの「値」を
'「Object」型として返却します。「Object」型は.NETの基本の型(基底のクラス)です。
'GetValue()メソッドで取得予定の値が「文字列」型や「数値」型、Boolean型などであれば、
'そのタイプに「Object」型から変更する必要があります。それが「CType(〜,タイプ)」の
'構文になります。

key.Close()
'利用したレジストリ変数は最後に閉じます。

MessageBox.Show("レジストリ:" + strVal, "実行結果")
'取得した値を表示しています。

End Sub
'Button1_Clickサブプロシージャの終わりです。





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

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

引用:

Nakataさんの書き込み (2004-05-07 08:54) より:
abcとTextbox1.text等を使用して説明はして頂けないでしょうか?
(答えになってしまいそうですが私の能力ではその方がわかりやすいかと…。)



このように答えが欲しいと言ってしまうと、
レスポンスしてくれる人が激減すると思いますよ。

プログラミングは最終的には個人の能力で解決するべきです。
他力をするのであれば、外注するのがベストだと思います。

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

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-07 10:00
引用:

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

・TextBox1 ← 123
・TextBox2 ← 456
・TextBox3 ← 789
・TextBox4 ← 012

この説明を見てコードを書いて見たのですが…。
軽くパニックになっています(ToT)


 これは、名称は忘れましたが、「母国語で文を書いてプログラムを表す」という、仕様記述言語です。「←」は、「代入」を表します。正しくは「TextBox1.Text ← 123」(命令にの区切り文字が要ったかも)とすべきでしたが...

コード:
'レジストリへ書き出す ところはOk
Dim key As Microsoft.Win32.RegistryKey  = Microsoft.Win32.Registry.CurrentUser
key = key.CreateSubKey( _ 
"software/VB and VBA Program Settings/VBTips") ' 円マークをスラッシュに置換

key.SetValue("abc1", TextBox1.Text)
key.SetValue("abc2", TextBox2.Text) 
key.SetValue("abc3", TextBox3.Text) 
key.SetValue("abc4", TextBox4.Text) 

key.Close() 


'レジストリから読み込む 

Dim key As Microsoft.Win32.RegistryKey  = Microsoft.Win32.Registry.CurrentUser
key = key.OpenSubKey( _ 
"software/VB and VBA Program Settings/VBTips") 

TextBox1.Text = key.GetValue("abc1") 
TextBox2.Text = key.GetValue("abc2") 
TextBox3.Text = key.GetValue("abc3") 
TextBox4.Text = key.GetValue("abc4") 

key.Close()


ただし、"abc1"などは、TextBox1.Nameなどとする方がよいでしょう。
#あと、レジストリはいつまでサポートされるかわかりません…

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