Thema: Delphi Probleme mit TObjectList

Einzelnen Beitrag anzeigen

cyrano1960

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

Probleme mit TObjectList

  Alt 8. Jul 2009, 15: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