Eintrag aus Dynamischen Array und ListBox löschen
Hey, und wieder hab ich ein Problem.
Ich habe eine ListBox mit Einträgen. Nun möchte ich den ausgewählten Eintrag löschen, dies funktioniert aber nur wenn ich den letzten Eintrag makieren, mitten in der Liste bekomm ich ein Fehler (Zugriffsverletzung blablabla):
Code:
unit Busanzeige1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TBusEintrag = record Linie: string; Ziel: string; Ankunft: TDateTime; Abfahrt: TDateTime; Verspätung: TDateTime; end; PBusEintrag = ^TBusEintrag; type TForm1 = class(TForm) ListBox1: TListBox; TLabel1: TLabel; TLabel2: TLabel; TLabel3: TLabel; TLabel4: TLabel; TLabel5: TLabel; Hinzufügen: TButton; alleLinien: TButton; Linie: TEdit; Ziel: TEdit; Ankunft: TEdit; Abfahrt: TEdit; Verspätung: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; bearbeiten: TButton; löschen: TButton; zehnAnzeigen: TButton; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Beenden: TBitBtn; procedure HinzufügenClick(Sender: TObject); procedure BeendenClick(Sender: TObject); procedure alleLinienClick(Sender: TObject); procedure löschenClick(Sender: TObject); procedure zehnAnzeigenClick(Sender: TObject); procedure bearbeitenClick(Sender: TObject); private Liste : Array of PBusEintrag; procedure Add; procedure Delete; procedure Output(LängeListe:integer); procedure Quicksort(var Liste : Array of PBusEintrag; erstes,letztes:integer); procedure WertTauschen(var Liste : Array of PBusEintrag; StelleA, StelleB: Integer); end; Var Form1 : TForm; implementation {$R *.dfm}
Code:
procedure TForm1.Delete;
var MakierteStelle,i: integer; rec_p: PBusEintrag; begin MakierteStelle:= 0; //Makierte Stelle wird gesucht for i := 0 to ListBox1.Count - 1 do if ListBox1.Selected[i] then begin MakierteStelle:=i; end; //Makierte Stelle kommt an das Ende des Arrays while MakierteStelle<high(Liste) do begin Liste[MakierteStelle]:=Liste[MakierteStelle+1]; MakierteStelle:=MakierteStelle+1; end; rec_p:=Liste[high(Liste)]; Dispose(rec_p); //Array wird um 1 verringert setLength(Liste,Length(Liste)-1); //Makierter Eintrag wird aus ListBox entfernt ListBox1.DeleteSelected; end; |
AW: Eintrag aus Dynamischen Array und ListBox löschen
Und in welcher Zeile genau knallt es? Bist Du absolut sicher, dass Deine ListBox und Dein Array immer genau dieselbe Anzahl an Elementen enthalten?
|
AW: Eintrag aus Dynamischen Array und ListBox löschen
Also Delphi meldet keinen Fehler. Aber wenn ich das Programm ausführe klappt es nicht.
|
AW: Eintrag aus Dynamischen Array und ListBox löschen
Ich hab es jetzt umgestellt, dennoch kommt der Fehler. Aber nur wenn ich den Eintrag löschen will, welcher der letzte vorhandene ist.
Code:
procedure TForm1.Delete;
var MakierteStelle,i: integer; rec_p: PBusEintrag; begin rec_p:=Liste[ListBox1.ItemIndex]; Dispose(rec_p); MakierteStelle:= ListbOx1.ItemIndex; //Makierte Stelle kommt an das Ende des Arrays while MakierteStelle<high(Liste) do begin Liste[MakierteStelle]:=Liste[MakierteStelle+1]; MakierteStelle:=MakierteStelle+1; end; //Array wird um 1 verringert setLength(Liste,Length(Liste)-1); //Makierter Eintrag wird aus ListBox entfernt ListBox1.DeleteSelected; end; |
AW: Eintrag aus Dynamischen Array und ListBox löschen
Erstmal:
- Merkierte Stelle bei MultiSelekt=False entspricht ListBox.ItemIndex. - Ist nichts markiert, wird dennoch das Erste gelöscht, wegen deinem MakierteStelle:=0; - du überschreibst den Zeiger des zu löschenden Eintrags und gibst stattdessen immer den lentzen Eintrag frei (welcher abwer immernoch verlinkt ist) - ... |
AW: Eintrag aus Dynamischen Array und ListBox löschen
leider immer noch Fehler..hab ich etwas falsch berichtigt??
|
AW: Eintrag aus Dynamischen Array und ListBox löschen
Der perfekte Zeitpunkt, um mal den Debugger zu fragen.
PS: Wenn man statt dem array eine TList oder TList<> nimmt, dann kann man deren Einträge genauso verwalten, wie die der ListBox und notfalls könnte man auch gleich auf diese Liste verzichten, da die TListBox selber schon eine Liste enthält, wo man auch jeweils ein Objekt an die Einträge dranhängen kann. ListBox1.AddItem / ListBox1.Items.AddObject / ListBox1.Items.Objects |
AW: Eintrag aus Dynamischen Array und ListBox löschen
Warum
Liste : Array of PBusEintrag; und nicht Liste : Array of TBusEintrag; wo liegen die Daten die Du mit Dispose freigist ... |
AW: Eintrag aus Dynamischen Array und ListBox löschen
ich bin völlig verzweifelt :?
Ich versteh nur noch Bahnhof :?: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 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