Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Probleme mit TObjectList (https://www.delphipraxis.net/136816-probleme-mit-tobjectlist.html)

cyrano1960 8. Jul 2009 14:09


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:
olEreignisliste: TObjectList;
my_Button: TButton
In der FormCreate-Methode des Formulars:

Delphi-Quellcode:
olEreignisliste := TObjectList.Create(TRUE);
olEreignisliste.OwnsObjects := TRUE;
In der Menüroutine für das Erzeugen der Buttons:

Delphi-Quellcode:
  //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
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:
Delphi-Quellcode:
procedure THauptfenster.But_Event_Handler(Sender: TObject);
var
  iIndex2 : Integer;

begin
  iIndex2 := olEreignisliste.IndexOf(Sender);
  olEreignisliste.Delete(iIndex2);
end;
Wieder funktioniert der Teil zum Erzeugen der Button tadellos. Wenn ich nun auf einen einzelnen Button klicke funktioniert aber folgendes:

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*

xZise 8. Jul 2009 14:15

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

Klaus01 8. Jul 2009 14:19

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

Apollonius 8. Jul 2009 14:22

Re: Probleme mit TObjectList
 
Genau das verursacht den Fehler: Du darfst VCL-Objekte nie in einem Event-Handler dieser Komponente freigeben.

cyrano1960 8. Jul 2009 14:30

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

Nersgatt 8. Jul 2009 14:36

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.

cyrano1960 8. Jul 2009 14:47

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.

shmia 8. Jul 2009 16:53

Re: Probleme mit TObjectList
 
Zitat:

Zitat von Apollonius
Genau das verursacht den Fehler: Du darfst VCL-Objekte nie in einem Event-Handler dieser Komponente freigeben.

Hier ist eine mögliche Lösung dazu:
http://www.delphipraxis.net/internal...ct.php?t=29732


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