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*