2013-04-16 2 views
1

나는 현재 10자를 포함하고있는 변수를 가지고 있는데, 각각은 허가 키를 나타내는 1 또는 0입니다.최소한의 코드로 어떻게이 작업을 수행 할 수 있습니까?

내 프로그램에 UAC 패널이 포함되어 있으므로 해당 키를 기반으로 기능을 활성화/비활성화함으로써 누가 무엇을 할 수 있는지 제어 할 수있는 권한이 있습니다.

키의 예는 1011001101입니다.

사람의 키를 변경하는 컨트롤은 10 개의 체크 박스 목록입니다.

예. 1000000000은 UAC를 제어 할 뿐이고 UAC의 해당 확인란을 선택하고 키를 업데이트하여 다른 모든 기능을 활성화 할 수 있습니다.

다른 사용자를 선택할 때 권한 키에 따라 자동으로 확인란을 채우려면 어떻게해야합니까?

참고 : UAC 패널이 지금 찾는 방법에 대한 스크린 샷이 있습니다. 내 양식이 어떻게 구성되어 있는지 간단히 알 수 있습니다.

UAC panel

편집 : 그냥 내가 사람들에게 당신에게 내가 할 노력하고있어 명확한 예제를 제공해야한다고 생각, 그래서 내가 일하는 것이 알고 코드의 거대한 조각을 썼다지만 ' 성능 저하의 너무 많이 될 거라고 사실이 같은 내 프로그램에서 사용하는 :

If Mid(pkeys, 1, 1) = "1" Then 
      chkUAC.Checked = True 
     End If 
     If Mid(pkeys, 2, 1) = "1" Then 
      chkPInv.Checked = True 
     End If 
     If Mid(pkeys, 3, 1) = "1" Then 
      chkVInv.Checked = True 
     End If 
     If Mid(pkeys, 4, 1) = "1" Then 
      chkCheck.Checked = True 
     End If 
     If Mid(pkeys, 5, 1) = "1" Then 
      chkPMap.Checked = True 
     End If 
     If Mid(pkeys, 6, 1) = "1" Then 
      chkVMap.Checked = True 
     End If 
     If Mid(pkeys, 7, 1) = "1" Then 
      chkTele.Checked = True 
     End If 
     If Mid(pkeys, 8, 1) = "1" Then 
      chkHeal.Checked = True 
     End If 
     If Mid(pkeys, 9, 1) = "1" Then 
      chkDart.Checked = True 
     End If 
     If Mid(pkeys, 10, 1) = "1" Then 
      chkWhiteList.Checked = True 
     End If 
+1

적은 코드는 항상 최고의 코드가 아닙니다이 코드에이 코드

For x = 0 To 9 If pkeys(x) = "1" Then cbList(x).Checked = True Else cbList(x).Checked = False End If Next 

을 변경합니다. – MarcinJuraszek

+0

사실,하지만 (대부분의 경우) 적은 코드가 AppHang에 대한 CPU로드/기회가 적다는 것을 알았습니다. - 더 적은 관리가 가능합니다. – Yorrick

+0

그의 의견은 관찰이 항상 유효하지 않다는 것을 말하고 있습니다. 특히 개별 비트를 조작하는 것이 대안보다 빠르지는 않을 것입니다. –

답변

0

난 당신이 권한 키의 비트가 순서대로 각 사용 권한 확인란에 대한 참조를 보유하고 List(Of CheckBox)을 만들 것입니다.

그런 다음 OnSelectedIndexChanged 이벤트가 발생하면 선택한 사용자의 권한 키를 가져와 문자 배열로 변환합니다.

그런 다음 인덱스 값을 반복하면서 해당 문자 배열을 반복하여 cbList[index].checked을 현재 char의 부울 값과 같게 설정할 수 있습니다.


그것은이 같은 것입니다 : 당신이 그것을 초기화 할

Dim cbList = New List(Of CheckBox) 

어딘가에 : 당신은 목록을 선언 할

그런

With cbList 

    .Add(chkUAC) 
    .Add(chkPInv) 
    .Add(chkVInv) 
    .Add(chkCheck) 
    .Add(chkPMap) 
    .Add(chkVMap) 
    .Add(chkTele) 
    .Add(chkHeal) 
    .Add(chkDart) 
    .Add(chkWhiteList) 

End With 

당신 것을 반복하고 할당 된 색인에 할당 :

Protected Sub ddlUser_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ddlUser.SelectedIndexChanged 

    Dim i = 0 

    For Each c In ddlUser.SelectedValue.ToCharArray 

     cbList(i).Checked = c = "1" 
     i += 1 

    Next 

End Sub 
+0

흠, 지금까지 사용해온 모든 배열에는 각 인덱스에 대한 별도의 입력이 있습니다. 1 변수를 char 배열로 변환하는 방법은 무엇입니까? 간단히'mid (String, x, y)'로? – Yorrick

+0

도와주세요. 나는'1011001101'이 각 개별 체크 박스를 끄는 것을 나타내는 문자열이라고 생각했습니다. 그렇지 않니? –

+0

'xxxxxxxxxx' 키는 사용자가 사용할 수있는 기능을 나타내는 각 숫자를 가지고 있습니다 (예 : '1111111111 '). 즉, 해당 사용자가 가능한 모든 기능을 가지고 있음을 의미합니다. 따라서'OnSelectedIndexChanged'가 선택되었을 때 모든 체크 박스가 선택됩니다. 해고됐다. 간단히 말해서, 각 숫자가 더 큼을 나타내거나 체크 박스를 선택하지 않아야합니다. – Yorrick

2

이것은 비트 비교와 비슷하지만 정수 대신 문자열을 사용하는 것과 같습니다. 여전히 가능하다면 이진 연산자를 사용하여 검사를 수행 할 수 있도록 정수로 전환하는 것이 좋습니다.

"1011001101"대신 "717"의 정수를 사용합니다.당신이 "1000000000"(정수 512)에 대해, 당신은 간단하게이 같은 검사를 할 수 있는지 확인하고 싶었 :

' iPerm = 717, iUACMask = 512 
chkUAC.Checked = CBool(iPerm And iUACMask) 

iPerm이 iUACMask가 포함 된 경우, 표현은 사실의 결과로 0이 아닌 값으로 평가합니다. 일치하지 않으면 0을 반환합니다.

정수로 변경하는 것이 더 이상 가능하지 않다면 즉석에서 변환 할 수 있습니다. 명백히 성능은 정수를 사용할 때보 다 성능이 떨어지지 만 문제가 아닌 사용에 따라 다릅니다.

' strPerm = "1011001101", strUACMask = "1000000000" 
chkUAC.Checked = CBool(Convert.ToInt32(strPerm, 2) And Convert.ToInt32(strUACMask, 2)) 
+0

나는 비슷하게 생각하고있다.하지만이 형식의 사용 권한 키는 2 가지 형태로 많이있다. 너무 많은 코드가 나를 위해 allready에 의존한다. 생각은 아마 더 낫다, 나는 정말로 내 현재 코드의 40 %와 같은 redoing 느낌이 들지 않는다. – Yorrick

+0

['FlagAttribute']로 표시된 enum이어야한다. (http://msdn.microsoft.com/en-us/library/ system.flagsattribute.aspx). – MarcinJuraszek

+0

나는 동의한다. 플래그 열거 형이어야합니다. – dbasnett

0

단순히

For x = 0 To 9 
    cbList(x).Checked = (pkeys(x) = "1") 
Next 
관련 문제