lempy Geschrieben 26. März 2014 Geschrieben 26. März 2014 Hallo Leute Stehe mal wieder vor einem Problem!! Ich habe eine C++/CLI Forms - Anwendung, mit der ich die Einträge in der Registry auslesen möchte. In der linken Listbox sind die Unterschlüssel des Hauptschlüssels HKEY_CURRENT_USER fest vorgegeben. In der mittleren Listbox werden die Unterschlüssel angezeigt, die sich hinter den ausgewählten Unterschlüssel der linken Listbox befinden. Soweit ist alles OK. In der letzten rechten Lisbox allerdings möchte ich gerne erreichen, dass die Unterschlüssel und deren Unterschlüssel angezeigt werden und dann die Einträge. Hier ein Screen, der noch nicht so funktioniert aber schon fas in die Richtung geht. Wie man sieht werden keine Unterschlüssel aufgelistet und die Werte sind alle leer. Das heißt die Werte werden nicht angezeigt. Hier der Code, der die Anzeige in der letzten Listbox ausgibt. private: System::Void listBox2_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) { listBox3->Items->Clear(); RegistryKey ^SchluesselListe = Registry::CurrentUser; array <String^> ^EintragListe; EintragListe = SchluesselListe->OpenSubKey(listBox1->SelectedItem->ToString()) ->OpenSubKey(listBox2->SelectedItem->ToString())->GetSubKeyNames(); /*EintragListe = SchluesselListe->GetValueNames();*/ for each (String ^eintrag in EintragListe) listBox3->Items->Add(eintrag); /* EintragListe = SchluesselListe->OpenSubKey(listBox1->SelectedItem->ToString()) ->OpenSubKey(listBox2->SelectedItem->ToString())->GetSubKeyNames();*/ /*array <String^> ^WertNamen;*/ /*for each (String ^eintrag in EintragListe) listBox3->Items->Add(eintrag);*/ for each (String ^eintrag in EintragListe) listBox3->Items->Add(eintrag + "Wert" + " = " + Convert::ToString(SchluesselListe->GetValue(eintrag))); /*for each (String ^eintrag in EintragListe) listBox3->Items->Add("Wert: " + eintrag + " (" + SchluesselListe->GetValueKind(eintrag)::Convert::ToString + ")");*/ //GetValueKind ließt den Typ des Werts aus /*for each (String^ eintrag in WertNamen) listBox3->Items->Add("Wert: " + eintrag + " (" + SchluesselListe->GetValueKind(eintrag).ToString () + ")");*/ } Freue mich über jeden Hinweis und jede Hilfe Lieben Dank lempy Zitieren
Klotzkopp Geschrieben 26. März 2014 Geschrieben 26. März 2014 Was genau würdest du denn in der dritten Listbox gern sehen? Zitieren
lempy Geschrieben 26. März 2014 Autor Geschrieben 26. März 2014 Hallo Klotzkopp Die Unterschlüssel und dann die Einträge. Quasi eine Baumstruktur wie im Explorer währe schöne, wenn machbar. Gruß lempy Zitieren
Klotzkopp Geschrieben 26. März 2014 Geschrieben 26. März 2014 Wenn du eine Baumstruktur willst, warum benutzt du dann kein TreeControl? Zitieren
lempy Geschrieben 27. März 2014 Autor Geschrieben 27. März 2014 Hallo Klotzkopp Gibt es denn so was? Mag für Dich das einfachste der Welt zu sein, aber ich bisher nur das schreiben in die Registry, löschen und das Anzeigen mit einem bekannten Pfad gefunden. Die Library auf der MSN Seite ist auch nicht wirklich hilfreich für einen Anfänger und Bücher geben eben nur "OpenSubKey", "CreatSubKey" und so her. Richtig tief, das auch Anfänger damit etwas anfangen können geht das alles nicht. Hatte schon beim in der Registry schreiben ein ungutes Gefühl, aber es hat Gott sei Dank ohne Probleme geklappt. Vielleicht kannst Du mir sagen wie diese Methode für das Erstellen eines Baumes für die Registry heißt oder worauf diese TreeControl zurück geht? Lieben Dank lemyp Zitieren
Klotzkopp Geschrieben 27. März 2014 Geschrieben 27. März 2014 Doku: TreeView Class (System.Windows.Forms) Beschreibung: TreeView Control (Windows Forms) Das ist aber "nur" ein Steuerelement, wie ListBox, nur eben für Daten in Form einer Baumstruktur. Was du darin darstellst, oder wie du auf Benutzeraktionen reagierst, bleibt dir überlassen. Zitieren
lempy Geschrieben 6. April 2014 Autor Geschrieben 6. April 2014 Hallo Klotzkopp ich noch mal. Habe das ganze mal mit "TreeView" und "listView" versucht, aber leider nicht den gewünschten Erfolg erzielt. Sind die beiden neu eingefügten "Listboxen". Wie man sieht, werden die Werte nicht angezeigt und auch die "Unterordner" vielmehr Unterschlüssel auch nicht. Denke ich zumindest. Habe von der Registry in dem Sinne null Ahnung. Ich weiß nur, dass schon der erste Eintrag in meinem Beispiel schon mehrere Unterschlüssel hat. Aber auch nur deshalb, weil ich mir das ganze mal in der "regedit.exe" angesehen habe. In den Übungsaufgaben haben wir in den Registrierungsschlüssel HKEY-Current-USER zwar eigene Einträge gemacht und ausgelesen, aber da haben wir den Pfad explizit angegeben. Jetzt sollen wir einen Schlüssel des Hauptschlüssel bis auf die "Wurzel" auslesen. Von oben angefangen sämtliche Unterschlüssel anzeigen und zum Schluss die eingetragenen Werte. Z. B. Farbe = gün oder so. Wir haben dazu auch keinen weiteren Key-Methoden erhalten außer den Hinweis auf die MSDN Library im Netz, die einem Anfänger wie mir nun wirklich nicht hilfreich ist sondern eher noch mehr verwirrt. Lieben Dank für Eure Hilfe lempy Zitieren
Klotzkopp Geschrieben 7. April 2014 Geschrieben 7. April 2014 Wie man sieht, werden die Werte nicht angezeigt und auch die "Unterordner" vielmehr Unterschlüssel auch nicht.Dann befüllst du die Steuerlemente wohl nicht richtig. Wenn du nicht den Code dazu zeigst, ist eine genauere Diagnose kaum möglich. Wir haben dazu auch keinen weiteren Key-Methoden erhalten außer den Hinweis auf die MSDN Library im Netz, die einem Anfänger wie mir nun wirklich nicht hilfreich ist sondern eher noch mehr verwirrt.Die MSDN Library gehört zu den besten Dokumentationen, auch für Anfänger. Man darf eben nicht erwarten, dass man darin Schritt-für-Schritt-Anleitungen findet. Eine Dokumentation ist kein Tutorial. Zitieren
lempy Geschrieben 8. April 2014 Autor Geschrieben 8. April 2014 Hallo Klotzkopp Hier noch einmal mein ganzer Code. Wie schon vorher erwähnt, habe ich noch die letzten beiden "Listboxen" dazu erstellt, um zu sehen welches das bessere Ergebnis bringt. #pragma once namespace Registrytest2 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace Microsoft::Win32; /// <summary> /// Zusammenfassung für Form1 /// /// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch /// die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern, /// das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt. /// Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen /// arbeiten, die diesem Formular zugewiesen sind. /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::ListBox^ listBox1; protected: private: System::Windows::Forms::ListBox^ listBox2; private: System::Windows::Forms::TreeView^ treeView1; private: System::Windows::Forms::Button^ buttonEinlesen; private: System::Windows::Forms::ListView^ listView1; private: System::Windows::Forms::ListBox^ listBox3; private: /// <summary> /// Erforderliche Designervariable. /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> void InitializeComponent(void) { this->listBox1 = (gcnew System::Windows::Forms::ListBox()); this->listBox2 = (gcnew System::Windows::Forms::ListBox()); this->treeView1 = (gcnew System::Windows::Forms::TreeView()); this->buttonEinlesen = (gcnew System::Windows::Forms::Button()); this->listView1 = (gcnew System::Windows::Forms::ListView()); this->listBox3 = (gcnew System::Windows::Forms::ListBox()); this->SuspendLayout(); // // listBox1 // this->listBox1->FormattingEnabled = true; this->listBox1->Location = System::Drawing::Point(12, 7); this->listBox1->Name = L"listBox1"; this->listBox1->Size = System::Drawing::Size(138, 329); this->listBox1->TabIndex = 0; this->listBox1->SelectedIndexChanged += gcnew System::EventHandler(this, &Form1::listBox1_SelectedIndexChanged); // // listBox2 // this->listBox2->FormattingEnabled = true; this->listBox2->Location = System::Drawing::Point(156, 7); this->listBox2->Name = L"listBox2"; this->listBox2->Size = System::Drawing::Size(195, 329); this->listBox2->TabIndex = 1; this->listBox2->SelectedIndexChanged += gcnew System::EventHandler(this, &Form1::listBox2_SelectedIndexChanged); // // treeView1 // this->treeView1->Location = System::Drawing::Point(576, 7); this->treeView1->Name = L"treeView1"; this->treeView1->Size = System::Drawing::Size(208, 329); this->treeView1->TabIndex = 2; // // buttonEinlesen // this->buttonEinlesen->Location = System::Drawing::Point(322, 386); this->buttonEinlesen->Name = L"buttonEinlesen"; this->buttonEinlesen->Size = System::Drawing::Size(75, 23); this->buttonEinlesen->TabIndex = 3; this->buttonEinlesen->Text = L"Einlesen"; this->buttonEinlesen->UseVisualStyleBackColor = true; this->buttonEinlesen->Click += gcnew System::EventHandler(this, &Form1::buttonEinlesen_Click); // // listView1 // this->listView1->Location = System::Drawing::Point(790, 7); this->listView1->Name = L"listView1"; this->listView1->Size = System::Drawing::Size(292, 329); this->listView1->TabIndex = 4; this->listView1->UseCompatibleStateImageBehavior = false; // // listBox3 // this->listBox3->FormattingEnabled = true; this->listBox3->Location = System::Drawing::Point(357, 7); this->listBox3->Name = L"listBox3"; this->listBox3->Size = System::Drawing::Size(213, 329); this->listBox3->TabIndex = 5; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(1110, 434); this->Controls->Add(this->listBox3); this->Controls->Add(this->listView1); this->Controls->Add(this->buttonEinlesen); this->Controls->Add(this->treeView1); this->Controls->Add(this->listBox2); this->Controls->Add(this->listBox1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); } #pragma endregion private: System::Void buttonEinlesen_Click(System::Object^ sender, System::EventArgs^ e) { // ein Array mit Zeichenketten für die Schlüssel array <String^> ^regSchluesselListe; // ein Array mit Zeichenketten für die Einträge /* array <String^> ^regEintragListe;*/ // einen Handle für die Klasse RegistryKey /*RegistryKey ^regSchluessel;*/ // den Inhalt der drei Listenfelder löschen listBox1->Items->Clear(); listBox2->Items->Clear(); /*listBox3->Items->Clear();*/ // die Schlüssel aus HKEY_CURRENT_USER holen // bitte in einer Zeile eingeben regSchluesselListe = Registry::CurrentUser->GetSubKeyNames(); // und in das erse Listenfeld eintragen for each (String ^eintrag in regSchluesselListe) listBox1->Items->Add(eintrag); // den Schlüssel Software öffnen // bitte in einer Zeile eingeben /*regSchluessel = Registry::CurrentUser->OpenSubKey("Software");*/ /*regSchluesselListe = regSchluessel->OpenSubKey(listBox1->SelectedItem->ToString())->GetSubKeyNames();*/ if(listBox1->SelectedIndex == -1) { listBox1->SelectedIndex = 0; } /*if(listBox1->SelectedIndex != 0) {*/ // und jetzt alle Unterschlüssel für Software lesen /*regSchluesselListe = regSchluessel->OpenSubKey(listBox1->SelectedItem->ToString())->GetSubKeyNames();*/ // in das zweite Listenfeld eintragen /*for each (String ^eintrag in regSchluesselListe) listBox2->Items->Add(eintrag);*/ /* }*/ /*}*/ // den Schlüssel \ Software \ Microsoft \ VCExpress \ 10.0 öffnen /* regSchluessel = Registry::CurrentUser->OpenSubKey("Software\\Microsoft\\VCExpress\\10.0");*/ // und nun die eigentlichen Einträge lesen /* regEintragListe = regSchluessel->GetValueNames();*/ // die Namen und die Werte in das dritte Listenfeld eintragen //for each (String ^eintrag in regEintragListe) // // bitte in einer Zeile eingeben // listBox3->Items->Add(eintrag + " = " + Convert::ToString(regSchluessel->GetValue(eintrag))); } private: System::Void listBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) { listBox2->Items->Clear(); RegistryKey ^SchluesselListe = Registry::CurrentUser; array <String^> ^UnterListe; UnterListe = SchluesselListe->OpenSubKey(listBox1->SelectedItem->ToString())->GetSubKeyNames(); for each (String ^eintrag in UnterListe) listBox2->Items->Add(eintrag); } private: System::Void listBox2_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) { treeView1->Nodes->Clear(); listView1->Items->Clear(); RegistryKey ^SchluesselListe = Registry::CurrentUser; array <String^> ^EintragListe; EintragListe = SchluesselListe->OpenSubKey(listBox1->SelectedItem->ToString()) ->OpenSubKey(listBox2->SelectedItem->ToString())->GetSubKeyNames(); /*EintragListe = SchluesselListe->OpenSubTree(listBox2->SelectedItem->ToString())->GetSubKeyNames();*/ /*EintragListe = SchluesselListe->GetValueNames();*/ /*for(Int32 i = 0; i < SchluesselListe->Lenght; i++) {*/ /* for each (String ^eintrag in EintragListe) listBox3->Items->Add(eintrag);*/ /*for each (String ^eintrag in EintragListe) listBox3->Items->Add(eintrag + "Wert" + " = " + Convert::ToString(SchluesselListe->GetValue(eintrag)));*/ for each (String ^eintrag in EintragListe) listBox3->Items->Add(eintrag + "Wert" + " = " + Convert::ToString(SchluesselListe->GetSubKeyNames())); /*SchluesselListe = Registry::CurrentUser->GetSubKeyNames();*/ /*EintragListe = SchluesselListe->GetSubKeyNames();*/ /*for each (String ^eintrag in EintragListe) treeView1->Nodes->Add(eintrag);*/ for each (String ^eintrag in EintragListe) treeView1->Nodes->Add(eintrag + "Wert" + " = " + Convert::ToString(SchluesselListe->GetSubKeyNames())); /*for each (String ^eintrag in EintragListe) treeView1->Nodes->Add(eintrag + "Wert" + " = " + Convert::ToString(SchluesselListe->GetSubKeyNames()));*/ /*}*/ /*for each (String ^eintrag in EintragListe) listView1->Items->Add(eintrag);*/ /*for each (String ^eintrag in EintragListe) listView1->Items->Add(eintrag);*/ for each (String ^eintrag in EintragListe) listView1->Items->Add(eintrag + "Wert" + " = " + Convert::ToString(SchluesselListe->GetValue(eintrag))); } }; } Lieber Gruß lempy Zitieren
Klotzkopp Geschrieben 9. April 2014 Geschrieben 9. April 2014 for each (String ^eintrag in EintragListe) treeView1->Nodes->Add(eintrag + "Wert" + " = " + Convert::ToString(SchluesselListe->GetSubKeyNames()));[/code] Damit ist es natürlich nicht getan. Das ist dasselbe, was du mit den Listboxen machst. Weißt du, wie man eigene Funktionen schreibt? Weißt du, was Rekursion ist? Falls nicht, ist die Aufgabe, so wie du sie darstellst, ein paar Nummern zu groß für dich. Möglicherweise hast du sie falsch verstanden. Zitieren
lempy Geschrieben 9. April 2014 Autor Geschrieben 9. April 2014 (bearbeitet) Hallo Kloztkopp Salopp aus dem Gedächtnis heraus sage ich jetzt mal dieses: Rekursion = Der "immer wieder kehrende eigene Aufruf" der Funktion/Methode? Entschuldige das Fragezeichen, aber ich bin ein wenig unsicher ob das so richtig ist. Funktionen/Methoden haben wir schon erstellt, doch jetzt im Bezug auf die Registry bin sehr verunsichert, weil man sich dieses wichtige "Windowstool?" schnell zerschießen kann und dann nichts mehr läuft. Nach Deinem Tipp müsste ich mir eine Funktion basteln in der es Rekursion gibt und diese dann im "Hauptprogramm" ausgeben? Diese Funktion/Methode müsste dann aber auch mit den "Schlüsseln" arbeiten. Oder nicht? Da fällt mir die Anweisung "GetValueKind" ein. Das was ich bisher darüber weiß ist, dass die Anweisung im Grunde die Unterschlüssel auflisten müsste, weil ich denke das diese Unterschlüssel "Kinder" des darüber liegenden Schlüssels sind. Oder habe ich das falsch Interpretiert? In meinen Heften finde ich nichts darüber! Ist es wichtig für die Ausgabe der Werte anzugeben ob es binäre oder strings sind? Gibt es eventuell eine Seite, auf der man diese ganzen "Bearbeitungsschlüssel" wie SetSubKey unw. etwas einfacher aufgelistet findet und wo die Erklärungen eher für Anfänger verständlich sind? Mit dem "GetValueKind" kommt am Ende bei des Auswahl in der Zeiten Box ein "Systemabsturz" Werde mich inzwischen noch mal mit Funktionen/Methoden und der Rekursion beschäftigen und schauen ob ich das mit der Registry umsetzen kann. Lieben Dank lempy Bearbeitet 9. April 2014 von lempy Was vergessen Zitieren
Klotzkopp Geschrieben 9. April 2014 Geschrieben 9. April 2014 Funktionen/Methoden haben wir schon erstellt, doch jetzt im Bezug auf die Registry bin sehr verunsichert, weil man sich dieses wichtige "Windowstool?" schnell zerschießen kann und dann nichts mehr läuft.Solange du nur lesend auf die Registry zugreifst, kann nichts passieren. Nach Deinem Tipp müsste ich mir eine Funktion basteln in der es Rekursion gibt und diese dann im "Hauptprogramm" ausgeben? Diese Funktion/Methode müsste dann aber auch mit den "Schlüsseln" arbeiten. Oder nicht?Es sollte kein Tipp sein. Ich wollte wirklich nur wissen, ob du weißt, was Rekursion ist. Rekursion ist der einfachste Weg, das TreeView zu befüllen. Da fällt mir die Anweisung "GetValueKind" ein. Das was ich bisher darüber weiß ist, dass die Anweisung im Grunde die Unterschlüssel auflisten müsste, weil ich denke das diese Unterschlüssel "Kinder" des darüber liegenden Schlüssels sind."Kind" bedeutet Art oder Typ, nicht wie der deutsche Begriff Kind. GetValueKind liefert dir die Information, ob ein Wert ein DWORD oder String oder was auch immer ist. Ist es wichtig für die Ausgabe der Werte anzugeben ob es binäre oder strings sind? Kommt darauf an, welche Anforderungen an die Ausgabe in der Aufgabenstellung stehen. Gibt es eventuell eine Seite, auf der man diese ganzen "Bearbeitungsschlüssel" wie SetSubKey unw. etwas einfacher aufgelistet findet und wo die Erklärungen eher für Anfänger verständlich sind? Warum willst du die Registry bearbeiten? Du sollst doch nur lesen. Kannst du bitte mal den genauen Wortlaut der Aufgabenstellung hier posten? Ich glaube, du verrennst dich gerade total. Zitieren
lempy Geschrieben 9. April 2014 Autor Geschrieben 9. April 2014 Hallo Klotzkopp Lieben Dank erst mal für Deine schnelle Antwort. Wird einen kleinen Moment dauern, den im Grunde habe ich in diesem Heft drei Aufgaben zu bewältigen. Aber zu erst die ERSTE: Ändern Sie die Listenanzeige für die Registrierung aus dem Studienheft so, dass der Anwender selbst auswählen kann, welche Schlüssel bzw. Einträge im zweiten und dritten Listenfeld angezeigt werden. Im ersten Listenfeld sollen immer fest die Einträge aus dem Schlüssel HKEY_URRENT_USER angezeigt werden. Achten Sie darauf, dass die Einträge im zweiten bzw. dritten Listenfeld nur dann angezeigt werden sollen, wenn im ersten bzw. zweiten Listenfeld ein Eintrag markiert ist. Damit die Lösung nicht zu aufwendig wird, sollen im zweiten Listenfeld immer nur die untergeordneten Schlüssel angezeigt werden. Im dritten Listenfeld dagegen sollen sowohl eventuell vorhandene Unterschlüssel als auch die Einträge angezeigt werden. Hinweis: Bitte beachten Sie Für einige Unterschlüssel im Schlüssel HKEY_CURRENT_USER - wie z.B. Console - gibt es nicht in jedem Fall weitere untergeordnete Schlüssel. Hier befinden sich auf der zweiten Ebene bereits Einträge. Es kann also durchaus sein, dass bei dem einen oder anderen Schlüssel das zweite Listenfeld leer bleibt. Das ist die Aufgabe für die praktische Übung. Die theoretische Ausarbeitung kann ja erst dann wirklich erfolgen, wenn man weis Wieso, Weshalb und Warum. Hat man das verstanden, dann ist die Theorie nur ein Klacks. Vorschau auf die zweite Aufgabe: Es sollen die Methoden schreibeEintstellungen() und leseEinstellungen in meinem Pong-Spiel so geändert werden, dass die Einstellungen der Schwierigkeit und der Spielfeldgröße in die Registry geschrieben (abgelegt) werden. Aufgabe drei bezieht sich auf XML Dateien. Ich hoffe das hat Dir ein wenig mehr geholfen, damit Due mir helfen kannst. Kann gut sein, dass ich wieder den Wals vor lauter Bäume nicht sehen. Ich selber weiß, dass ich oft zu kompliziert denke. Lieben, lieben Dank lempy Zitieren
Klotzkopp Geschrieben 9. April 2014 Geschrieben 9. April 2014 Du willst also gar keine Baumstruktur. Du willst einfach nur in der dritten Listbox sowohl die Sub-Schlüssel als auch die Werte des in der zweiten Listbox ausgewählten Schlüssels sehen. Das hätten wir auch einfacher haben können. private: System::Void listBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) { listBox2->Items->Clear(); RegistryKey^ subkey = Registry::CurrentUser->OpenSubKey(listBox1->SelectedItem->ToString()); for each (String ^eintrag in subkey->GetSubKeyNames()) listBox2->Items->Add(eintrag); } private: System::Void listBox2_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) { listBox3->Items->Clear(); RegistryKey^ subkey = Registry::CurrentUser->OpenSubKey(listBox1->SelectedItem->ToString()); RegistryKey^ subkey2 = subkey->OpenSubKey(listBox2->SelectedItem->ToString()); for each (String ^eintrag in subkey2->GetSubKeyNames()) listBox3->Items->Add(eintrag); for each (String ^eintrag in subkey2->GetValueNames()) listBox3->Items->Add(eintrag + " = " + Convert::ToString(subkey2->GetValue(eintrag))); } [/code] Ganz sauber ist das auch nicht. Man sollte die RegistryKey-Objekte direkt als Nutzdaten an die Listbox-Items hängen, anstatt immer zwischen RegistryKey und String zu wechseln. Aber so geht's wenigstens. Zitieren
lempy Geschrieben 22. April 2014 Autor Geschrieben 22. April 2014 Hallo Klotzkopp Danke Dir erst mal für Deine Hilfe. Habe mir Deine Version mal in einen Test kopiert und getestet. Habe da noch ein paar Fragen, doch erst muss ich da wieder reinkommen. Die letzten Tage waren bei mir Stress pur. Sohn samt Familie wieder vorübergehend bei uns eingezogen, die bessere Hälfte nach einer Routine OP fas über den Jordan gegangen usw. Muss mich erst noch sortieren. 1. Warum funktioniert die Ausgabe in der zweiten Listbox mit einem Array? private: System::Void listBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) { listBox2->Items->Clear(); RegistryKey ^SchluesselListe = Registry::CurrentUser; array <String^> ^UnterListe; UnterListe = SchluesselListe->OpenSubKey(listBox1->SelectedItem->ToString())->GetSubKeyNames(); for each (String ^eintrag in UnterListe) listBox2->Items->Add(eintrag); } 2. Warum meckert der Compiler dabei bei der dritten Listbox? Sinn gemäß kann er den SubKeyNames() nicht in Array öffnen. 3. Wie gestalte ich einen Rekursiven Aufruf, wenn ich die Anzahl nicht kenne? " for (i = ?; i > 0; i++) " Die "Rekursion zählt oder ruft sich solange auf, bis das Ergebnis 0 ist. Um die Aufgabe richtig zu lösen muss ich auch die "Unterordner" oder vielmehr die "Unterschlüssel" anzeigen und dann erst die Werte der Unterschlüssel. Wie in einem Dateibaum. Das ganze müsste ja, wenn ich richtig denke zur Laufzeit also dynamisch passieren. Auslesen der vorhandenen, mir nicht bekannten Unterschlüssel, ausgeben dieser Unterschlüssel und dann die jeweiligen Werte. Lieben Dank für Diene Hilfe lempy Zitieren
Klotzkopp Geschrieben 22. April 2014 Geschrieben 22. April 2014 1. Warum funktioniert die Ausgabe in der zweiten Listbox mit einem Array?Warum sollte sie nicht funktionieren? 2. Warum meckert der Compiler dabei bei der dritten Listbox? Sinn gemäß kann er den SubKeyNames() nicht in Array öffnen.Da musst du schon den Code dazu zeigen. Und die exakte Fehlermeldung. Nicht "sinngemäß". Um die Aufgabe richtig zu lösen muss ich auch die "Unterordner" oder vielmehr die "Unterschlüssel" anzeigen und dann erst die Werte der Unterschlüssel.Ich verstehe die Aufgabe so, dass du die Unterschlüssel und Werte des Schlüssels in der 2. Liste anzeigen sollst. Nicht die Werte der Schlüssel in der dritten Liste. Würde auch keinen Sinn ergeben, weil du nicht erkennen könntest, welcher Wert zu welchem Schlüssel gehört. Zitieren
lempy Geschrieben 24. April 2014 Autor Geschrieben 24. April 2014 (bearbeitet) Hallo Klotzkopp Im dritten Listenfeld dagegen sollen sowohl eventuell vorhandene Unterschlüssel als auch die Einträge angezeigt werden. Ich verstehe diesen Satz so: Im dritten Listenfeld sollen alle Unterschlüssel und alle Einträge angezeigt werden. Also Sowohl als auch. Ich denke da an einen rekursiven Aufruf der Ausgabeanweisung, aber bin im Moment noch am grübeln wie diese aussehen muss. Die Ausgabe müsste sich solange aufrufen, bis es wirklich keinen Unterschlüssel (Unterordner) mehr gibt sondern nur noch die Einträge. Da ich nicht weiß, aus wie vielen Unterschlüsseln ein Unterschlüssel besteht, bis er zu den Einträgen gelangt ist ja eine Anzahl von X Aufrufen. Ich weiß also nicht, wie ich diese Bedingung in einer FOR oder WHILE-Schleife formulieren muss. Hier mal ein gedanklicher Versuch mit while: while(SchluessleListe2 != nulljptr) { for each (String ^eintrag in SchluesselListe2->GetSubKeyNames()) listBox3->Items->Add(eintrag); /*for each (String ^eintrag in SchluesselListe3->GetSubKeyNames()) listBox3->Items->Add(eintrag);*/ for each (String ^eintrag in SchluesselListe2->GetValueNames()) listBox3->Items->Add(eintrag + " = " + Convert::ToString(SchluesselListe-> GetValue(eintrag))); } Dies scheint jedoch eher eine Endlosschleife zu sein. Vielleicht kannst Du mir dabei noch ein paar Hinweise geben. Lieben Dank lempy Bearbeitet 24. April 2014 von lempy Code zu durcheinander Zitieren
Klotzkopp Geschrieben 24. April 2014 Geschrieben 24. April 2014 Ich verstehe diesen Satz so: Im dritten Listenfeld sollen alle Unterschlüssel und alle Einträge angezeigt werden. Also Sowohl als auch.Ja, aber nur die des in der 2. Listbox ausgewählten Schlüssels. Keine Rekursion. Deine Interpretation der Aufgabe würde den Schwierigkeitsgrad massiv erhöhen ("Damit die Lösung nicht zu aufwendig wird..."). Zudem ist es totaler Blödsinn, so etwas mit Listboxen zu machen. Und selbst wenn das beabsichtigt wäre, wäre es Unsinn, in der dritten Listbox eine rekursive Datenstruktur zu visualisieren. Das könnte man auch mit einer einzelnen Listbox machen. Ich glaube, du verrennst dich total. Aber bitte, wenn du willst: Ist dir klar, dass du für die Rekursion eine eigene Funktion/Methode brauchst? Du kannst das nicht direkt in deine SelectedIndexChanged-Eventhandler einbauen. Zitieren
lempy Geschrieben 24. April 2014 Autor Geschrieben 24. April 2014 Hallo :upps Ich denke mal wieder viel zu kompliziert. Ist aber auch eine Herausforderung das ding so hin zu bekommen. Ok, mir fällt jetzt nur ein: Übung macht den Meister. Auf einen oder mehrere Versuche kommt es an. Habe ja im Moment Zeit dafür, denn ich werde erst wieder die Aufgaben einsenden, wenn ich 1. die Knete dazu habe und 2. auch erst dann, wenn die restlichen Hefte durch sind, damit es nicht ganz so teuer wird. Kommt also auf ein oder zwei Monate nicht an. Es kann ja immer noch was anderes dazwischen kommen. Ist dir klar, dass du für die Rekursion eine eigene Funktion/Methode brauchst? War mir nicht wirklich klar. Hatte zwar kurz daran Gedacht, aber wieder verworfen. Die Methode müsse ja dann die Anweisungen für die Ausgabe im dritten Listenfeld haben. Denke ich zu mindesten. Also die ganze Anweisung aus private: System::Void listBox2_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) muss in eine eigene Methode geschrieben werden, die dann in "System::Void listBox2_SelectetIndesChanged()" aufgerufen wird. In dieser Methode bräuchte ich dann ein Handle, in dem ich die Ergebnisse für die Unterschlüssel speichere und einen Handle in dem die Einträge gespeichert werden. Das ist jetzt mal so mein erster Gedanke dazu. Bin mir aber nicht sicher, ob ich mit den bis jetzt verwendeten Anweisungen zum Auslesen der Registry auskomme. Versuchen wir einen neuen Test "Auslesen der Registry" oder so. Wird ein wenig dauern, bis ich dazu das erste Ergebnis einstelle, muss die Gedanken erst mal sortieren. Vielleicht hast Du noch einen Tipp Lieben Dank für Deinen Rat und Deine Tat. Gruß lempy Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.