AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Eintrag aus Dynamischen Array und ListBox löschen

Eintrag aus Dynamischen Array und ListBox löschen

Ein Thema von Marcel2906 · begonnen am 25. Aug 2011 · letzter Beitrag vom 25. Aug 2011
Antwort Antwort
Marcel2906

Registriert seit: 17. Aug 2011
Ort: Warendorf
112 Beiträge
 
Delphi 2010 Professional
 
#1

Eintrag aus Dynamischen Array und ListBox löschen

  Alt 25. Aug 2011, 11:46
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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Eintrag aus Dynamischen Array und ListBox löschen

  Alt 25. Aug 2011, 11:56
Und in welcher Zeile genau knallt es? Bist Du absolut sicher, dass Deine ListBox und Dein Array immer genau dieselbe Anzahl an Elementen enthalten?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Marcel2906

Registriert seit: 17. Aug 2011
Ort: Warendorf
112 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Eintrag aus Dynamischen Array und ListBox löschen

  Alt 25. Aug 2011, 12:46
Also Delphi meldet keinen Fehler. Aber wenn ich das Programm ausführe klappt es nicht.
  Mit Zitat antworten Zitat
Marcel2906

Registriert seit: 17. Aug 2011
Ort: Warendorf
112 Beiträge
 
Delphi 2010 Professional
 
#4

AW: Eintrag aus Dynamischen Array und ListBox löschen

  Alt 25. Aug 2011, 12:52
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;

Geändert von Marcel2906 (25. Aug 2011 um 13:01 Uhr) Grund: Code nochmals bearbeitet (ListBox.ItemIndex)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#5

AW: Eintrag aus Dynamischen Array und ListBox löschen

  Alt 25. Aug 2011, 12:55
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)
- ...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Marcel2906

Registriert seit: 17. Aug 2011
Ort: Warendorf
112 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Eintrag aus Dynamischen Array und ListBox löschen

  Alt 25. Aug 2011, 13:06
leider immer noch Fehler..hab ich etwas falsch berichtigt??
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#7

AW: Eintrag aus Dynamischen Array und ListBox löschen

  Alt 25. Aug 2011, 13:41
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Aug 2011 um 14:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#8

AW: Eintrag aus Dynamischen Array und ListBox löschen

  Alt 25. Aug 2011, 13:44
Warum

Liste : Array of PBusEintrag;
und nicht
Liste : Array of TBusEintrag;

wo liegen die Daten die Du mit Dispose freigist ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Marcel2906

Registriert seit: 17. Aug 2011
Ort: Warendorf
112 Beiträge
 
Delphi 2010 Professional
 
#9

AW: Eintrag aus Dynamischen Array und ListBox löschen

  Alt 25. Aug 2011, 13:56
ich bin völlig verzweifelt
Ich versteh nur noch Bahnhof
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:55 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