2011-08-04 3 views
2

일부 코드를 수정할 수 있도록 이해하려고합니다. 나는 꽤 vbscript에 새로운 어떤 도움을 주셔서 감사합니다.스크립팅 사전 -VBScript를 사용하여 복잡한 구조 만들기

키에 의해 제어되는 다른 행을 가진 테이블처럼 작동하는 것처럼 보이는 사전 개체를보고 있습니다. 무슨 일이 일어나고 있는지 잘 모르겠습니다. list.addlist.count+1, ListElement과 같은 명령은 현재 내 리그를 약간 넘습니다. 코드는 내가 내가 그것을 어떤 변경을하는 것이 작동하는 방법을 잘 모르겠습니다 간단한 문장

Sub DumpList (list) 
' This function dumps all the people in the office and their information 
' in the application window. The list is usually sorted by Name. 

Dim e, le 

For Each e In list ' output listelements... 
    Set le = list(e) 

    LogOutput 0, "line: " & (le.num, 3) & " : " & le.Name _ 
       & " " & le.PHNumber1 & " " & le.PHNumber2 _ 
       & " " & le.Email1 & " " & le.Email2 _ 
       & " " & le.DeskNo.1 & " " & le.OFficeCode _ 
       & " " & le.wirecolour & " " & le.wirecross 
Next 
End Sub 

1 개 사용하기 위해 데이터를 출력 할 수 있습니다. 가변 listScripting.Dictionary 보유 이때 다시

+0

[Dictionary 개체에 대한 설명서] (http://msdn.microsoft.com/en-us/library/x4k5wbx4%28v=VS.85%29.aspx)를 보았습니까? –

답변

0

감사합니다.

당신은 사전에 각 Scripting.Dictionary에 VBScript를 For Each 구조를 사용

이 반환됩니다. 따라서이 경우 For Each은 각 반복마다 변수 e에 각 키를 배치합니다.

라인 -

Set le = list(e) 

이제 키와 관련된 사전에 조회 값이 루프의 키를 사용한다. 이 경우 값은 속성이있는 객체입니다.

따라서 사전을 사용하여 "테이블"의 "행"을 해당 키를 사용하여 신속하고 직접 조회 할 수 있습니다. 또한 게시 한 코드에서 보여 주듯이 각 키를 열거하고 각 값을 조회하여 전체 "테이블"을 검색 할 수 있습니다.

+0

나는 이해한다. 비록 내가 아직도이 사건에서 하나의 열쇠로 "e"가 (phnumber, email ...) 같은 모든 다른 항목을 발견한다는 사실에 대해 나는 내 머리를 감쌀 수 없다하더라도 이 모든 항목은 1 개의 키를 사용하여 조회됩니다. 설정은 하나의 키와 연결된 여러 행을 가진 테이블처럼 보입니다. 스크립팅 사전은 키와 항목과 1 대 1의 관계가 있다고 생각했습니다. – sanwar

+0

@sanwar : 거기에 하나의 키 "e"가 없습니다. __is__ __variable__은 'e'라고 불리며, 'for each'가 키를 열거하면서 차례대로 사전의 각 키를 저장하는 데 사용됩니다. – AnthonyWJones

1

작업 : 명부 유지. 솔루션에서

첫 번째 시도 : 이 sanwar으로 dic.Count

에 따라 숫자 인덱스의 = 키와 사전을 사용은 사전에 저장 키 - 값 쌍을 지적했다. 사전에 명을 추가하려면 (사람 정보) 사람/인스턴스를 만들어 여러 정보 요소를 저장할 수있는 사람 클래스가 필요합니다. Person 클래스에 대한

최소/POC 코드 :

Dim g_nPersonId : g_nPersonId = -1 
Class cPerson 
    Private m_nId 
    Private m_sName 
    Private m_dtBirth 
    Private m_dWage 
    Public Function init(sName, dtBirth, dWage) 
    Set init = Me 
    g_nPersonId = g_nPersonId + 1 
    m_nId  = g_nPersonId 
    Name  = sName 
    Birth  = dtBirth 
    Wage  = dWage 
    End Function 
    Public Property Let Name( sName ) : m_sName = sName  : End Property 
    Public Property Let Birth(dtBirth) : m_dtBirth = dtBirth : End Property 
    Public Property Let Wage( dWage ) : m_dWage = dWage  : End Property 
    Public Property Get Id()    : Id  = m_nId  : End Property 
    Public Property Get Name()   : Name  = m_sName : End Property 
    Public Property Get Birth()   : m_dtBirth = m_dtBirth : End Property 
    Public Property Get Wage()   : m_dWage = m_dWage : End Property 
    Public Function Data() 
    Data = Array(m_nId, m_sName, m_dtBirth, m_dWage) 
    End Function 
End Class ' cPerson 

[클래스 cPerson이 정의/청사진의 사람들은, 각각은 ID, 이름, 생년월일을 가진, 그리고 급여. 이름 함수, doc 함수, 임금 함수에 적합한 값 을 전달하여 init 함수를 호출하여 사람을 만듭니다. ID는 자동으로 추가됩니다 (가능한 OO 언어에서 가능한 한 적절한 클래스 수준 데이터 대신 글로벌 카운터 사용).]

우리가 만들고 사람을 표시 할 수 있습니다 증명하는 데모 스크립트 :

Dim oAdam : Set oAdam = New cPerson.init("Adam", #1/5/2001#, 1234.56) 
    Dim oEve : Set oEve = New cPerson.init("Eve" , #1/6/2001#, 6543.21) 
    Dim oPerson 
    For Each oPerson In Array(oAdam, oEve) 
     WScript.Echo Join(oPerson.Data(), " - ") 
    Next  

출력 :

이제
0 - Adam - 1/5/2001 - 1234.56 
1 - Eve - 1/6/2001 - 6543.21 

는 숫자 키와 사전에 넣어 수 있습니다 (VBScript를 특별 기능을 다른 언어에는 .Count 속성을 기반으로 한 문자열 키 전용 사전이 있습니다. 빈 사전의 .Count 속성은 첫 번째 요소 (우리가 필요로하는 모든 정보를 보유하고있는 사람 객체)를 사전에 추가하여 빈 사전의 .Count 속성이 0이됩니다. 당신은 쉽게 .Add .Count + 1 시간/노력의 낭비 볼 수 있습니다

Dim dicPersons : Set dicPersons = CreateObject("Scripting.Dictionary") 
    Dim aPersons : aPersons  = Array(_ 
     Array("Adam", #1/5/2001#, 1234.56) _ 
     , Array("Eve" , #1/6/2001#, 6543.21) _ 
) 
    Dim aPerson 
    For Each aPerson In aPersons 
     dicPersons.Add dicPersons.Count, New cPerson.init(aPerson(0), aPerson(1), aPerson(2)) 
    Next 
    Dim nPerson 
    WScript.Echo "Adam & Eve" 
    For Each nPerson In dicPersons 
     WScript.Echo nPerson, ":", Join(dicPersons(nPerson).Data(), " - ") 
    Next  
    dicPersons.Remove 0 ' how do we know the key of Adam? 
    WScript.Echo "Adam zaped" 
    For Each nPerson In dicPersons 
     WScript.Echo nPerson, ":", Join(dicPersons(nPerson).Data(), " - ") 
    Next  
    WScript.Echo "Trying to add Caine" 
On Error Resume Next 
    dicPersons.Add dicPersons.Count, New cPerson.init("Caine", Date(), 0.33) 
    WScript.Echo Err.Description 
On Error GoTo 0 

.Count에 따라 숫자 인덱스와 사전이 해결책없는 이유

Adam & Eve 
0 : 0 - Adam - 1/5/2001 - 1234.56 
1 : 1 - Eve - 1/6/2001 - 6543.21 
Adam zaped 
1 : 1 - Eve - 1/6/2001 - 6543.21 
Trying to add Caine 
This key is already associated with an element of this collection 

보여줍니다 출력을 작업 : 인원의 유지 관리.