2016-03-23 20 views
2

VBSで辞書の辞書を作成しようとしています。しかし、それは私のサブレベルの辞書は、値ではなく参照によってアクセスされているようです?辞書の辞書を作成する方法vbscript

私はこれを試してみました:

Dim s, fso, f, ts, str, fRead, line, i, dictElements, dictionary, screenItem 
Set s = CreateObject("System.Text.StringBuilder") 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set dictElements = CreateObject("Scripting.Dictionary") 
Set dictionary = CreateObject("Scripting.Dictionary") 

'add elements to dictionary 
dictElements.Add "Name", "MyName" 
dictElements.Add "Setpoint", 100.0 
dictElements.Add "Process Value", 80.6 

'Create Data Structure 
dictionary.Add "DigitalInputOne", dictElements 
dictionary.Add "DigitalInputTwo", dictElements 

'test dictionary 
dictionary("DigitalInputTwo")("Name")= "Hello" 
dictionary("DigitalInputTwo")("Setpoint")= 40.123 
HmiRuntime.Screens("Home").ScreenItems("Text field_1").Text = dictionary ("DigitalInputOne")("Name") 
HmiRuntime.Screens("Home").ScreenItems("Text field_2").Text = dictionary("DigitalInputOne")("Setpoint") 
HmiRuntime.Screens("Home").ScreenItems("Text field_3").Text = dictionary("DigitalInputOne")("Process Value") 

HmiRuntime.Screens("Home").ScreenItems("Text field_4").Text = dictionary("DigitalInputTwo")("Name") 
HmiRuntime.Screens("Home").ScreenItems("Text field_5").Text = dictionary("DigitalInputTwo")("Setpoint") 
HmiRuntime.Screens("Home").ScreenItems("Text field_6").Text = dictionary("DigitalInputTwo")("Process Value") 

私はそれは私が私の要素の辞書が参照によってであると思わせるこれは、すべての値を変更する値のいずれかを変更した場合。これを価値によって実現させる方法はありますか?私はそれぞれのサブ辞書を違うものにしたい。

答えて

2

あなたが唯一のサブディクショナリを作成しているので、あなたは一度だけ

Set dictElements = CreateObject("Scripting.Dictionary") 

を持っている - と、その1つのサブディクショナリを指すように2つのキーを設定しています。代わりに、次の操作を実行します。

Set dictElements = CreateObject("Scripting.Dictionary") 'create first sub-dict 
dictionary.Add "DigitalInputOne", dictElements 
Set dictElements = CreateObject("Scripting.Dictionary") 'create second sub-dict 
dictionary.Add "DigitalInputTwo", dictElements 

VBScriptには参照カウントベースのガベージコレクションがあります。最初の辞書を最上位の辞書に追加すると、トップレベルの辞書はその辞書への参照を保持するようになりました。したがって、dictElementsを2番目の辞書と同じに設定すると、元の辞書は最上位の辞書によって維持されるため、ガベージコレクションされません。

+0

テンプレートを作成することができますか、それを行うにはより良い方法がありますか?私のサブディクショナリのほとんどは、異なる値でのみ同じになります。 – FighterHayabusa

+0

私は、辞書を渡すと特定の方法でそれを初期化するサブを書くでしょう。次に、3段階のプロセスに従います.1)辞書を作成する、2)初期化サブを実行する、3)トップレベル辞書に割り当てる。 –

+1

私は基本的にデータ型のようにdictElementsを使いたいと思っていました。 (DigitalInputTwo)= CreateObject( "Scripting.Dictionary") 各項目の辞書には (それぞれの項目について) '辞書を設定する(" DigitalInputOne ")= CreateObject(" Scripting.Dictionary ") 辞書dictElementsの各要素について 辞書(項目).Add要素、dictElements(要素) 次 次は 'それはとても良いとは思わない。私はWinCCでこれをやっているので、クラスを使用することはできません。 – FighterHayabusa

関連する問題