AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit TObjectList

Ein Thema von cyrano1960 · begonnen am 8. Jul 2009 · letzter Beitrag vom 8. Jul 2009
Antwort Antwort
cyrano1960

Registriert seit: 8. Jul 2009
5 Beiträge
 
Delphi 6 Professional
 
#1

Probleme mit TObjectList

  Alt 8. Jul 2009, 14:09
Hallo, ich arbeite mit Delphi 6 Professional und würde mich eher als Gelegenheitsprogrammierer bezeichnen 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*
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Probleme mit TObjectList

  Alt 8. Jul 2009, 14:15
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Probleme mit TObjectList

  Alt 8. Jul 2009, 14:19
.. 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
Klaus
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Probleme mit TObjectList

  Alt 8. Jul 2009, 14:22
Genau das verursacht den Fehler: Du darfst VCL-Objekte nie in einem Event-Handler dieser Komponente freigeben.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
cyrano1960

Registriert seit: 8. Jul 2009
5 Beiträge
 
Delphi 6 Professional
 
#5

Re: Probleme mit TObjectList

  Alt 8. Jul 2009, 14:30
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
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: Probleme mit TObjectList

  Alt 8. Jul 2009, 14:36
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.
Jens
  Mit Zitat antworten Zitat
cyrano1960

Registriert seit: 8. Jul 2009
5 Beiträge
 
Delphi 6 Professional
 
#7

Re: Probleme mit TObjectList

  Alt 8. Jul 2009, 14:47
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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Probleme mit TObjectList

  Alt 8. Jul 2009, 16:53
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
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz