mehrere checkBox^es in einer Schleife



  • Hallo ...

    Habe mehrere checkBox Elemente in einer Form, welche nun in einer DO WHILE Schleife geändert werden sollen:

    void autostartanzeigen () /* <-- Autostarteinträge holen */
    			{
    
    			int i=1,x=1;
    			int iLastError=0;
    			HKEY hKey;
    
    			RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",&hKey);
    
    			do
    			{
    			   char cValueName[256] = "";
    			   DWORD dwValueName = 256;
    			   DWORD ValueType = 0;
    			   BYTE cValueData[256] = "\0";
    			   DWORD dwValueData = 256;
    			   iLastError = RegEnumValue(hKey,i,cValueName,&dwValueName,0,&ValueType,cValueData,&dwValueData);
    			   ++i;
    checkBox(i)->Text = "Text"; <---- [b]????[/b]
    
    			}
    
    			while(iLastError!=ERROR_NO_MORE_ITEMS);
    
    			}
    

    Wie kann ich die Elemente über eine Schleife ansprechen? So erhalte ich den Fehler Unbekannter Bezeichner ... checkBox ...



  • Benutze ein array oder noch besser eine liste (z.B. aus System::Collections::Generic, List<T>).

    Simon



  • Im Moment siehts so aus (hab nen bisschen abgeschaut 😉 ):

    int i=0,x=0; 
    			int iLastError=0;
    			HKEY hKey;
    			RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",&hKey);
    
    			IEnumerator^ myEnum1 = checkedListBox1->CheckedIndices->GetEnumerator();				
    
    				   while ( myEnum1->MoveNext() )
    				   {
    
    					 char cValueName [256] = "";
    					 DWORD dwValueName = 256;
    					 DWORD ValueType = 0;
    					 BYTE cValueData[256] = "\0";
    					 DWORD dwValueData = 256;
    
    					 Int32 indexChecked =  *safe_cast<Int32^>(myEnum1->Current);
    				     MessageBox::Show( String::Concat( "Index#: ", indexChecked, ", is checked. Checked state is: ", checkedListBox1->GetItemCheckState( indexChecked ), "." ) );
    
    					  RegEnumValue(hKey,indexChecked,cValueName,&dwValueName,0,&ValueType,cValueData,&dwValueData);
    					  RegDeleteValue (hKey,cValueName);
    
    				   }
    
    				   RegCloseKey (hKey);
    

    Hier steckt aber noch irgendwo nen Fehler. Wenn ich beim debuggen die Variable indexChecked beobachte enthält Sie immer die richtige IndexNummer des gewählten Items.

    Allerdings wird cValueName nicht der passende Schlüsselname übergeben, sodass ein anderer Schlüssel gelöscht wird. Wenn ich das selbe Item in der Liste nocheinmal markiere wird erneut einer der anderen Schlüssel gelöscht (wobei natürlich das ein oder andere mal der richtige dabei ist.) Das erkläre ich mir dann einfach so, dass der Index der markierten Items ja nach dem Löschen mit RegDeleteKey nicht mehr stimmt. Oder woran liegt das wohl sonst?

    Fakt ist, dass ich hierbei wieder einmal den Fehler nicht finde - seit nun 5 Stunden :).

    (Die Liste ist übrigens Erstellt funzt auch ganz gut.)



  • Okay ... auch das habe ich überwunden. Aber wie so oft eine weitere Sache wo ihr mir helfen könntet:

    void autostartanzeigen () /* <-- Autostarteinträge holen */
    {
    
    			int i=0,x=0,run = 0; // Ab hier für Alle benutzer
    			int iLastError=0;
    			HKEY hKey;
    
    			RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",&hKey);
    
    			do
    			{
    			   char cValueName [256] = "";
    			   DWORD dwValueName = 256;
    			   DWORD ValueType = 0;
    			   BYTE cValueData[256] = "\0";
    			   DWORD dwValueData = 256;
    
    			   iLastError = RegEnumValue (hKey,i,cValueName,&dwValueName,0,&ValueType,cValueData,&dwValueData);
    			   String ^eintrag = gcnew String(cValueName); // <-- umwandeln von char zu System::String
    			   if ( eintrag != "") 
    			   {
    			   checkedListBox1->Items->Add (eintrag);
    			   checkedListBox1->SetItemChecked (i, true); <-- erstelltes Item als Checked ????
    			   }
    
    			   ++i;
    			   run = 1;
    			}
    
    			while(iLastError!=ERROR_NO_MORE_ITEMS);			
    }
    

    Eigentlich möchte ich, dass alle hinzugefügten Elemente der CheckedListBox standardmässig ge"checkt" werden. Leider passiert das aber nur beim ersten und beim letzten Eintrag. Im Designer finde ich dazu auch nichts passendes.

    Ausserdem habe ich bei einer späteren Funktion - wo Autostarteinträge gelöscht werden sollen - das Problem, dass ich aufgrund der Bindung zum Enumerator keine Items löschen kann:

    IEnumerator^ myEnum2 = checkedListBox1->CheckedItems->GetEnumerator();
    
    							  while ( myEnum2->MoveNext() )
    									   {
    
    										  Object^ itemChecked     = safe_cast<Object^>(myEnum2->Current);
    										  System::String^ eintrag = itemChecked->ToString(); /* <-- System::Objekt umwandeln zu System::String */
    
    										  pin_ptr<const wchar_t> wch = PtrToStringChars(eintrag); // <-- System::String umwandeln zu char*
    										  size_t convertedChars = 0;
    										  size_t  sizeInBytes = ((eintrag->Length + 1) * 2);
    										  errno_t err = 0;
    										  char    *ch = (char *)malloc(sizeInBytes);
    
    										  err = wcstombs_s(&convertedChars, ch, sizeInBytes, wch, sizeInBytes);
    
    										  RegDeleteValue (hKey,ch );
    										  int index = checkedListBox1->Items->IndexOf (itemChecked);
    										  checkedListBox1->Items->RemoveAt (index);
    
    										}
    
    							  RegCloseKey (hKey);
    

Anmelden zum Antworten