Prolbem mit Formular schließen - Zugriffsverletzung und Abstrakter Fehler - Wieso?
-
Ich möchte das Formular ja nicht nur deaktivieren. Es soll komplett gelöscht werden wenn es jemand schließt. Wo müsste ich das delete denn dann setzen?
-
Warum willst du das Formular löschen?
Wenn es denn unbedingt sein muss gibt es noch die Möglichkeit in OnClose des Formulars Action = caFree zu setzen. Dann löscht sich das Formular selbst.
-
Die Anzahl der Komponenten auf dem Formular richten sich nach einer bestimmten Anzahl an Einträgen in einer DB. Auf dem ersten Formular kann man noch zwishcen drei verschiedenen DBs wechseln. Daher muss das Formular nach dem schließen gelöscht werden damit, wenn sich die DB ändert, die Komponenten anhand der gewechselten DB erstellt werden. Hoffe, das was jetzt verständlich.
-
EPMS schrieb:
Ich möchte das Formular ja nicht nur deaktivieren. Es soll komplett gelöscht werden wenn es jemand schließt. Wo müsste ich das delete denn dann setzen?
Na hinter ShowModal()...
ShowModal kommt erst zurück, wenn das Formular geschlossen wurde, solange bleibt das Hauptmodul da stehen!
-
Hi,
die Fehlermeldungen werden sicher geworfen, weil beim Löschen des neuen
Formulars einige (aufgrund der DB-Einträge erstellten) Komponenten nicht
gelöscht worden sind.Poste uns mal den Destruktor des neuen Formulares (oder das OnClose/OnDestroy-Event)
und die Routine zum Erstellen der Kompos.mfg
kpeter
-
Also mit dem caFree scheint es zu funktionieren. Wenn ich das im OnClose statt dem delete einsetze kommt keine Fehlermeldung mehr.
@kpeter
Woll ich das von dir erwähnte trotzdem nochmal posten?
-
Hi,
wenn kein Problem/Fehler mehr vorhanden ist, musst du uns nix posten.
Aber schaden könnte es nicht, wir erfreuen uns immer an Quelltext.
Wie du willst...mfg
kpeter
-
@kpeter: Hehe, das Posten von Quelltext soll doch nicht Deiner persönlichen Ergötzung dienen...
Aber schaden kann das nicht, je nachdem, wie Du die Formulare erzeugst, kann es sinnvoll sein, im gleichen Kontext auch die Formulare wieder zu löschen.
-
Joe_M. schrieb:
Aber schaden kann das nicht, je nachdem, wie Du die Formulare erzeugst, kann es sinnvoll sein, im gleichen Kontext auch die Formulare wieder zu löschen.
Genau.
Selbst wenn das Programm ohne Fehler erzeugt wird, heisst das nicht,
dass beim Beenden des Programmes kein Speicherleck da ist, weil eben bestimmte
Elemente nicht korrekt gelöscht wurden.mfg
kpeter
-
Ok, dann fange ich mal an. Erzeugen tue ich das Formular folgendermaßen
bool gefunden=false; for (int i = Screen->FormCount - 1; i >= 0; i--) { if ((AnsiString)Screen->Forms[i]->ClassName() == "Tneue_bestellung") { Screen->Forms[i]->Show(); gefunden=true; } } if (!gefunden) {//Artikel anlegen neue_bestellung = new Tneue_bestellung(Application); neue_bestellung->Show(); }
Im OnClose habe ich folgendes stehen
Action = caFree;
Die Komponenten werden unter anderem so erzeugt
TCheckBox* CheckBox = dynamic_cast<TCheckBox*>(neue_bestellung->FindComponent("CBhs" + DataModule1->sql_artikel->FieldByName("artikel_nr")->AsString.SubString(4,3))); if(!CheckBox) { TCheckBox *CheckBox_DVDBoxen = new TCheckBox(neue_bestellung); CheckBox_DVDBoxen->Name = "CBhs" + DataModule1->sql_artikel->FieldByName("artikel_nr")->AsString.SubString(4,3); CheckBox_DVDBoxen->Parent = parent; CheckBox_DVDBoxen->Left = 312; CheckBox_DVDBoxen->Width = 137; CheckBox_DVDBoxen->Top = 108; CheckBox_DVDBoxen->Caption = "Adelheid - Alle Staffeln"; CheckBox_DVDBoxen->OnClick = neue_bestellung->ArtikelClick; CheckBox_DVDBoxen->Show(); }
Wobei das erstellen der Komponenten in einer for-Schleife steht und je nach Anzahl von Artikeln in einer MySQL-DB wird dann eine Anzahl von CheckBoxen erstellt. Außerdem erstelle ich eine gleiche Anzahl von TEdit und TImage.
Hoffe, das ist nicht komplett falsch.
-
Hi,
in meinen Projekten delete ich stets alle dynamisch erstellten Elemente.
Scheint mir die sauberste Aufräumung des Speichers...mfg
kpeter