![]() |
Probleme mit TObjectList
Hallo, ich arbeite mit Delphi 6 Professional und würde mich eher als Gelegenheitsprogrammierer bezeichnen :lol: Ich möchte in einem kleinen Programm über einen Menüpunkt nacheinander mehrere Buttons erzeugen, sie beschriften und dann sollen diese halt beim Anklicken eine bestimmte Funktion erfüllen. Außerdem soll jeder Button wieder zu entfernen sein, das Form wird dann wieder neu gezeichnt.
Zuerst habe ich einfach eine Objektvariable vom Typ TButton erzeugt und mit dieser Variable dann bei jedem Klicken aufs Menü eine neue Instanz erzeugt und sofort über einen kleine Dialog einen Namen vergeben. Das Erzeugen funktionierte toll, nur das Löschen nicht. Ich erhielt laufend einen EAccessViolation-Fehler. Nach einiger Suche fand ich dann heraus, dass sich in diesem Fall wohl eine TObjectList anbietet. So was in der Art kenne ich von C# auch und da läuft das Programm auch tadellos. Also habe ich folgendes gemacht: Im "var-Teil":
Delphi-Quellcode:
In der FormCreate-Methode des Formulars:
olEreignisliste: TObjectList;
my_Button: TButton
Delphi-Quellcode:
In der Menüroutine für das Erzeugen der Buttons:
olEreignisliste := TObjectList.Create(TRUE);
olEreignisliste.OwnsObjects := TRUE;
Delphi-Quellcode:
Nun wollte ich zunächst einfach nur einmal ausprobieren, ob ich den Button auch wieder löschen kann, und habe in But_Event_Handler nur den folgenden Code:
//Es wird ein Button hinzugefügt
my_Button := TButton.Create(Self); //Der Button wird zunächst versteckt my_Button.Hide; //Der Button wird dem Formular zugeordnet my_Button.Parent := Self; //Es wird der Name "Projekt" + der laufenden Nr. vergeben my_Button.Name := 'Projekt_'+ IntToStr(iIndex); //Ein Input-Box wird geöffnet, die eine Beschreibung abfragt my_Button.Caption := InputBox('Ereignisbeschreibung', 'Geben Sie eine Bezeichnung an:', 'Beschreibung'); //Für den Button werden die Abmessungen und die Position gewählt my_Button.SetBounds(10, 0+iIndex*25, 180, 25); //Für das OnClick Ereignis wird der Eventhandler "But_Event_Handler" zugewiesen my_Button.OnClick := But_Event_Handler; //Der Button wird dargestellt my_Button.Show; //Den Button der Liste hinzufügen olEreignisliste.Add(my_Button); //Der Index wird inkrementiert iIndex:=iIndex+1; //Die Größe des Hauptfensters wird angepasst Hauptfenster.ClientHeight := Hauptfenster.ClientHeight + 25
Delphi-Quellcode:
Wieder funktioniert der Teil zum Erzeugen der Button tadellos. Wenn ich nun auf einen einzelnen Button klicke funktioniert aber folgendes:
procedure THauptfenster.But_Event_Handler(Sender: TObject);
var iIndex2 : Integer; begin iIndex2 := olEreignisliste.IndexOf(Sender); olEreignisliste.Delete(iIndex2); end; In den meisten Fällen wird der 1. Button, den ich anklicke sauber gelöscht, machmal auch noch der 2. (egal wie viele ich erzeugt habe), spätestens beim 3. bekomme ich jedoch wieder einen EAccessVioloation-Fehler oder aber auch (allerdings ganz selten) einen abstrakten Fehler. Ich wäre sehr dankbar, wenn jemand eine Idee hat, wo mein Fehler liegen könnte. Herzlichen Dank schon mal vorab. #cyr* |
Re: Probleme mit TObjectList
Hallo,
also dein Problem direkt beheben kann ich nicht, aber ich habe einige Dinge, die nicht gerade hübsch sind ;) Zum einem ist der Aufruf ".Hide" überflüssig, wenn du etwas später ".Show" aufrufst, da in der Zwischenzeit die Anwendung eigentlich nichts machen dürfte. Auch ist ein ".OwnObjects" auf "True" setzen obsolet, da gerade der Create-Parameter dies definiert. Und zum Schluss: Um ein Objekt aus der Liste zu entfernen benutzt man am besten einfach "Remove" ;) Ich vermute den Fehler auch wo anders. Was passiert den wenn du bei "Delete" die Schritte einfach durchdebuggst und mal guckst, was er den noch alles macht? MfG xZise |
Re: Probleme mit TObjectList
.. was mir beim Lesen etwas Bachschmerzen bereitet ist,
dass Du die Instanz löscht wenn Du dich noch in einer Methode der Instanz befindest. Grüße Klaus |
Re: Probleme mit TObjectList
Genau das verursacht den Fehler: Du darfst VCL-Objekte nie in einem Event-Handler dieser Komponente freigeben.
|
Re: Probleme mit TObjectList
Hallo, das ging ja schnell..
zunächst einmal bezüglich dem .hide und .show. Das hat einen kosmetischen Grund. Während ich die Bezeichnung über den Dialog abfrage, wird der Button schon gezeichnet, aber in der oberen linken Ecke über dem schon vorhandenen. Deshalb verstecke ich ihn einfach so lange, bis ich die Beschreibung eingegeben habe... Mit "OwnsObjects" auf True setzen stimmt natürlich, das war eine reine Verzweiflungstat und hätte ja auch nichts mit dem Fehler zu tun. Mit dem Löschen einer Instanz durch einen Ereignishandler der Instanz das leuchtet natürlich ein!!!! Ich werde es mal so probieren, dass ich zum Löschen einfach einen Menüpunkt verwende und den Index abfrage, oder? Besten Dank für Eure superschnelle Hilfe und SORRY für die Bauchschmerzen @Klaus01 |
Re: Probleme mit TObjectList
Ich würde die Eingabe der Caption lieber abtrennen, nach dem guten alten EVA-Prinzip.
Lass die Caption eingeben und speicher sie in einem String zwischen. Dann prüfen, ob der User wirklich eine Caption eingeben hat und nicht vielleicht auf Abbrechen geklickt hat. Dann erstelle den Button und ganz zum Schluss anzeigen. |
Re: Probleme mit TObjectList
Ich hab jetzt das Löschen ins Menü verlagert und es klappt einwandfrei. Das war wirklich perfekte Hilfe und für die darüber hinausgehenden Tipps bezüglich der Beschriftung der Caption noch einmal ein ganz herzliches Dankeschön. Wahrscheinlich gehe ich nicht systematisch genug vor und stricke es immer gerade da ein, wo es mir gerade auffällt, denn wie gesagt, viel Erfahrung habe ich nicht gerade.
|
Re: Probleme mit TObjectList
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz