Adressproblem auf TCheckBox-Objekt
-
Hallo,
benötige dringend Hilfe.
Ich möchte über ein Array von Objektadressen auf TCheckBox-Objekte zugreifen um deren Eigenscahften zu Ändern.Daher bilde ich ein Array vom Typ TCheckBox* (Zeiger).
TCheckBox * CB_Parameters[] = { &CB_Parameter1, &CB_Parameter2, &CB_Parameter3, &CB_Parameter4, &CB_Parameter5, &CB_Parameter6, &CB_Parameter7, &CB_Parameter8, &CB_Parameter9, &CB_Parameter10, &CB_Parameter11, &CB_Parameter12 };
Das scheint aber nicht zu gehen, obwohl ich dem Array bei der Initialisierung eine Referenz auf die Objekte übergebe.
Ich erhalte die Meldung:
...
[BCC32 Fehler] FormMain.cpp(2014): E2034 Konvertierung von 'TCheckBox * *' nach 'TCheckBox *' nicht möglich
...Was kann ich tun? Wie kann ich ein Array von Adressen auf die Objekte schaffen um auf sie über ein Index zuzugreifen?
Bitte um eine kurze Erläuterung.
Danke
-
Habe nun folgendes gemacht:
TCheckBox * CB_Parameters[] = { (TCheckBox*)CB_Parameter1, (TCheckBox*)CB_Parameter2, (TCheckBox*)CB_Parameter3, (TCheckBox*)CB_Parameter4, (TCheckBox*)CB_Parameter5, (TCheckBox*)CB_Parameter6, (TCheckBox*)CB_Parameter7, (TCheckBox*)CB_Parameter8, (TCheckBox*)CB_Parameter9, (TCheckBox*)CB_Parameter10, (TCheckBox*)CB_Parameter11, (TCheckBox*)CB_Parameter12 };
Es stellte sich heraus, dass es sporalisch bei dem
Zugriff auf ein TCheckBox-Objekt wiefor (i = 0; i < 12 ; i++) { CB_Parameters[i]->Enabled = false; CB_Parameters[i]->Visible = false; }
zu Adressierungsproblemen kommt. Es wird dann folgende Exception angezeigt:
Zugriffsverletzung bei Adresse BLABLA in Modul BLABLA. Lesen von Adresse 0000000
Bitte um Hilfe!
-
Fehler tritt hier auf:
CB_Parameters[i]->Checked = StrToBool(asParameterValue) ;
-
Sind diese CB_Parameter1 nicht bereits vom Typ TCheckBox*? Hast Du sie vllt nicht initialisiert weshalb noch ein zweiter Fehler auftaucht?
-
Hallo
Deiner Fehlermeldung aus dem ersten Post zufolge kannst du sowohl Adressoperator als auch Cast weglassen
TCheckBox * CB_Parameters[] = { CB_Parameter1, CB_Parameter2, CB_Parameter3, CB_Parameter4, CB_Parameter5, CB_Parameter6, CB_Parameter7, CB_Parameter8, CB_Parameter9, CB_Parameter10, CB_Parameter11, CB_Parameter12 };
Der Zugriffsfehler kommt von ungültigen Adressen. Warum genau wird aber aus dem gezeigten Code nicht klar. Benutzt den Debugger um den konkreten Auslöser zu finden und verfolge dann die Werte der wichtigen Variablen.
/Edit : Die Felddeklaration deutet darauf hin das es global deklariert wird. Das ist schonmal eine beliebte Fehlerquelle, insbesondere wenn die CB_Para... zum Zeitpunkt der Arrayinitialisierung selber noch gar nicht initialisiert wurden.
bis bald
akari
-
Erstmal Danke für eure, und speziell deine Hile akari.
Ich hae den Debugger mal durchlaufen lassen. Es passiert bei z.B. bei dem dritten Arrayverweis.
void __fastcall TForm_Main::FillComboBoxPannelCheckBoxList( PARAMETER_TREE* pNodeData) { // Funktionsvariablen char** cNodeValue; int i; int j; int iParameter; unsigned int uiIndex; unsigned int uiIndexArray; unsigned int uiIndexPosition; AnsiString asParameterValue; // Datenstruktur aus Knoten separieren cNodeValue = (char**)pNodeData->Data; // Zeigerarray für Adressen der Checkbox-Elemente TCheckBox * CB_Parameters[] = { (TCheckBox*)CB_Parameter1, (TCheckBox*)CB_Parameter2, (TCheckBox*)CB_Parameter3, (TCheckBox*)CB_Parameter4, (TCheckBox*)CB_Parameter5, (TCheckBox*)CB_Parameter6, (TCheckBox*)CB_Parameter7, (TCheckBox*)CB_Parameter8, (TCheckBox*)CB_Parameter9, (TCheckBox*)CB_Parameter10, (TCheckBox*)CB_Parameter11, (TCheckBox*)CB_Parameter12 }; // Prüfung ob der Knoten aktiv ist if (!pNodeData->bActiv || !bEditMode) { // Sollte der Knoten nicht aktive sein, werden die Checkbox-Elemenete // deaktiviert for (i = 0; i < 12 ; i++) { CB_Parameters[i]->Enabled = false; CB_Parameters[i]->Visible = false; } } else { // Sollte dar Knotan aktiv sein wird das Eingabefeld aktiviert for (i = 0; i < 12 ; i++) { CB_Parameters[i]->Enabled = true; CB_Parameters[i]->Visible = false; } } // Rücksetzen der Laufvariablen i = 0; j = 0; // Sollte keine Adresse oder kein Wert in der Datenstruktur des Knotens // entahlten sein, kann kein Wert eingetragen werden if (cNodeValue != NULL && *cNodeValue != NULL) { while (*cNodeValue != NULL) { // Sollte Eintrag eine Parameternummer sein... if (TryStrToInt(*cNodeValue, iParameter)) { // Berechnung der Positionen des Bits in der Datenstruktur CalculateBitPosition(&uiIndex, &uiIndexArray, &uiIndexPosition, *cNodeValue); // Filtern des Parameterwerts asParameterValue = (AnsiString)GetBitInWordArray(uiIndexPosition, &DataSet.FSCDataIntel.BOOLDataArr[uiIndexArray]); // Bei der nachfolgenden Zeile Tritt der Fehler auf!!!!!!!!!!!!!!!!!! // Darstellung des Parameterswerts CB_Parameters[i]->Checked = StrToBool(asParameterValue) ; // Paramterdarstellung sichtbar machen CB_Parameters[i]->Visible = true; // Indexvariable erhöhen i++; } else { // Sollte Eintrag ein Parameterwert verkörper... // Beschriften des Checkbox-Elements CB_Parameters[j]->Caption = ValueText.getXMLValue( "ParameterValue", *cNodeValue, *cNodeValue); // Indexvariable erhöhen j++; } // Zeiger auf Dateneintrag erhöhen cNodeValue++; } } }
Im Qulltext habe ich einen Kommentar bei der Zeile hinterlegt.
Die Methoed ist ein Teil einer Klasse des Hauptformulars im Programm.
Normalerweise, sollte das Array mit den Adressverweisen (Zeiger) nur eine Gültigkeit in der Methode haben und danach nicht interessieren. Die Instanzierung der CheckBox-Objekte im Formular wird schon bei dem Programmstart durchgeührt. Ja, es timmt, dass die Objkte selber bei der Instanzierung durch einen Zeiger des Typs dargestellt werden.
Dennoch verstehe ich noch nicht, warum der Fehler auftritt?
Akari, kannst du mir helfen? Oder hat sonst noch jemand einen Vorschlag?Ich wäre euch sehr dankbar. Vielleicht gibt es ja auch eine andere Möglichkeit für die Realisierung der Aufgabenstellung der Methode.