merkwürdiger Fehler bei TEdit::OnExit???
-
Hallo Gemeinde,
habe bei TEdit::OnExit gerade einen Fehler, bei dem ich nicht weiterkomme.
Und zwar: in ein Edit wird eine Zahl eingegeben. Wenn dann das Edit den Focus verliert, werden in einer ScrollBox Labels und Edits erstellt, jeweils soviele wie in dem Edit angegeben. Vor dem Erstellen werden ( evtl. ) vorhandene Labels + Edits gelöscht( mit ComponentCount ). Soweit funktioniert alles wunderbar.Wenn der neue Wert im Edit kleiner ist als der vorherige Wert, knallts mit der Meldung:
Erste Gelegenheit für Exception bei $7C812A5B. Exception-Klasse EInvalidOperation mit Meldung 'Element '' hat kein übergeordnetes Fenster'. Prozess pl.exe (1744)
Wenn der neue Wert höher ist, ist alles bestens.
Ich steh grad echt auf dem Schlauch
grüssle
-
Zeig mal ein bißchen Code.
-
Hallo
Vor dem Erstellen werden ( evtl. ) vorhandene Labels + Edits gelöscht( mit ComponentCount ). Soweit funktioniert alles wunderbar.
Eben nicht. Der Fehler wird nicht vom verlassenden TEdit selber verursacht. Sondern kommt wenn spezielle Aktionen mit Komponenten gemacht werden sollen die aber kein Parent haben. Wird also sicher von deiner eigenen Löschen-Routine verursacht.
Benutzt den Debugger oder hör auf Joe und poste den entsprechenden Code.
bis bald
akari
-
Joe_M. schrieb:
Zeig mal ein bißchen Code.
Nö, keinen Bock :p
Es sei denn, du sagst mir welchen Code du sehen willst. Erstellen und löschen funktioniert, wie oben beschrieben.
Wenn der neue Wert im Edit kleiner ist als der vorherige Wert, knallts ...
wenn ich nach dieser Message auf 'Fortsetzen' klicke, stimmt auch wieder alles, also korrekte neue Anzahl von Labels und Edits
void __fastcall TSDIAppForm::ResetSBControls() { int i; for( i = 0; i < ScrollBox1->ComponentCount; i++ ) { delete ScrollBox1->Components[i]; i--; } } //--------------------------------------------------------------------------- void __fastcall TSDIAppForm::Edit2Exit(TObject *Sender) { int elTop = 5; AnsiString elText, elName, eName; ResetSBControls(); for( int i = 0; i < Edit2->Text.ToInt(); i++ ) { eLab = new TEbeneLabel( ScrollBox1 ); eLab->Parent = ScrollBox1; eLab->Left = 10; eLab->Top = elTop; elName.sprintf( "EbeneLb%i", i ); eLab->Name = elName; elText.sprintf( "Ebene %i", i+1 ); eLab->Caption = elText; eEdt = new TEdit( ScrollBox1 ); eEdt->Parent = ScrollBox1; eEdt->Left = 100; eEdt->Width = 50; eEdt->Top = elTop; eEdt->Text = "0"; eName.sprintf( "eEdit_%i", i ); eEdt->Name = eName; elTop += 26; } ResizeEFStruct( Edit2->Text.ToInt() ); = temp struct in einem std::vector. Ändert nix, wenn auskommentiert }
-
So direkt sehe ich hier keinen Fehler. Welche Zeile wird Dir denn vom Debugger angezeigt, wenn der Fehler auftritt?
Zeig doch bitte auch mal den Code aus der ResetSBControls()
-
Joe_M. schrieb:
So direkt sehe ich hier keinen Fehler. Welche Zeile wird Dir denn vom Debugger angezeigt, wenn der Fehler auftritt?
void __fastcall TSDIAppForm::Edit2Exit(TObject *Sender) { int elTop = 5; AnsiString elText, elName, eName; ResetSBControls(); for( int i = 0; i < Edit2->Text.ToInt(); i++ ) { ... } ResizeEFStruct( Edit2->Text.ToInt() ); }
ResizeEFStruct wird noch ausgeführt, danach knallts
Joe_M. schrieb:
Zeig doch bitte auch mal den Code aus der ResetSBControls()
void __fastcall TSDIAppForm::ResetSBControls() { int i; for( i = 0; i < ScrollBox1->ComponentCount; i++ ) { delete ScrollBox1->Components[i]; i--; } }
haste wohl übersehen?
Thx schonmal
-
BTW. Wieso vereinfachst Du den Code nicht?
void __fastcall TSDIAppForm::ResetSBControls() { while( ScrollBox1->ComponentCount > 0 ) { delete ScrollBox1->Components[0]; } }
Die rücken doch nach oder?
-
Müsste nicht auch
ScrollBox1->DestroyComponents()
gehen?
In der Hilfe steht zwar, dass man diese Funktion nicht aufrufen sollte, aber sie macht doch eigentlich das gewünschte, oder?
-
Braunstein schrieb:
Müsste nicht auch
ScrollBox1->DestroyComponents()
gehen?
In der Hilfe steht zwar, dass man diese Funktion nicht aufrufen sollte, aber sie macht doch eigentlich das gewünschte, oder?Sie macht sogar noch mehr! Sie hat auch noch den Fehler gekillt.
THX
grüssle
-
Smitty schrieb:
Sie macht sogar noch mehr! Sie hat auch noch den Fehler gekillt.
Also ist jetzt das Ende vom Lied der Zugriff auf delete ScrollBox1->Components[-1]; ??