Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Eintrag aus Dynamischen Array und ListBox löschen (https://www.delphipraxis.net/162498-eintrag-aus-dynamischen-array-und-listbox-loeschen.html)

Marcel2906 25. Aug 2011 11:46

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;

DeddyH 25. Aug 2011 11:56

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?

Marcel2906 25. Aug 2011 12:46

AW: Eintrag aus Dynamischen Array und ListBox löschen
 
Also Delphi meldet keinen Fehler. Aber wenn ich das Programm ausführe klappt es nicht.

Marcel2906 25. Aug 2011 12:52

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;

himitsu 25. Aug 2011 12:55

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)
- ...

Marcel2906 25. Aug 2011 13:06

AW: Eintrag aus Dynamischen Array und ListBox löschen
 
leider immer noch Fehler..hab ich etwas falsch berichtigt??

himitsu 25. Aug 2011 13:41

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

Bummi 25. Aug 2011 13:44

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 ...

Marcel2906 25. Aug 2011 13:56

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