delete mit OnKeyDown des Formulars
-
Hallo,
ich hab mal wieder ein Problem:
Ich erstelle zur Laufzeit Objekte wie z.B. Edits, Buttons und Charts.
Diese werden in einem Array angelegt.*.h TEdit* Edit[20]; TChart* Chart[20]; //uswBei diesen Elementen sind die Methoden OnMouseDown und OnDragOver implementiert.
Nun muss ich aber die Elemente zur Laufzeit wieder einzeln löschen können, und das mache ich so:*.cpp void TMaske::DeleteElement(TObject* ...) { //switch/case(Edit, Chart usw.) delete Edit[ElIndex]; for(int j=ElIndex; j<AktAnz-1; j++) Edit[j]=Edit[j+1]; AktAnz--; }Das funktioniert auch scheinbar einwandfrei und fehlerfrei entweder von einem 2. Formular aufgerufen oder aufgerufen von einem Button auf dem Formular TMaske selbst.
Problem:
Wenn ich KeyPreview des Formulars auf true setze und diese Funktion mit OnKeyDown (FormKeyDown) des Formulars z.B. mit STRG+ENTF aufrufe, dann gibts meist einen EAbstractError und sonst eine EAccesViolation. Der Debugger läuft dann durch bis an das Ende der FormKeyDown Implementierung und dann kommt der Fehler.
So auch bei Buttons.Das Eigenartige: 1. Bei Charts gibts bei der gleichen Prozedur diesen Fehler nicht.
2. Wenn ich das erste Editfeld lösche geht das.
3. Und wenn ich per Button lösche geht das auch, egal in welcher Reihenfolge. 4. Wenn ich delete auskommentiere, geht der Ablauf auch, nur wird dann nicht gelöscht.Scheinbar wird nach der FormKeyDown (->KeyPrview=true!!) noch auf das Element zugegriffen/ Ereignis ausgelöst. Aber wenn ich vor delete Enabled auf false setze, macht das auch keinen Unterschied.
Wäre über alle Tips und Lösungsalternativen dankbar, wie ich mit der Tastatur löschen kann. Vielen Dank.
-
Hallo
ich kann zwar die Struktur nicht wirklich verstehen aus so allgemeinen Veschreibung, vermutlich wird der Key-Event noch an das nicht mehr existierende Control weitergeben. Das könntest du verhindern, indem du bei verlassen des Form::OnKeyDown einfach
Key = '\0';setzt. Dann wird der Event nicht weiter verfolgt.
bis bald
akari
-
Herzlichen Dank, das wars!!