Autor Beitrag
Erivium
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 22.02.10 19:00 
Hallo zusammen,

ich habe ein kleines Problem mit der ListBox Komponente und hoffe ihr könnt mir da vielleicht helfen.
Ich möchte einen markierten Eintrag in der ListBox löschen. Mit Delphi 7 beispielsweise funktioniert das bei mir perfekt mit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.ButtonClick(Sender: TObject);
var i:integer;
begin
for i := 0 to ListBox1.Items.Count - 1 do
  begin
    if ListBox1.Selected[i]=true then
ListBox1.DeleteSelected;
  end;
end;

Unter Delphi 3 allerdings wird mir die Fehlermeldung "undefinierter Bezeichner 'DeleteSelected'" angezeigt.

Habt ihr da eventl. einen alternativen Lösungsvorschlag auf Lager?

Vielen Dank schonmal. :)


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 22.02.2010 um 18:07
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 22.02.10 19:10 
Moin!

user profile iconErivium hat folgendes geschrieben Zum zitierten Posting springen:
Unter Delphi 3 allerdings wird mir die Fehlermeldung "undefinierter Bezeichner 'DeleteSelected'" angezeigt.

Habt ihr da eventl. einen alternativen Lösungsvorschlag auf Lager?
Nicht D3 benutzern? :?

Ansonsten vielleicht so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.ButtonClick(Sender: TObject);
  var
    i: Integer;
begin
  for i := ListBox1.Items.Count -1 downto 0 do // beim Löschen immer Rückwärts laufen!
    if ListBox1.Selected[i] then // Booleans nicht auf =True vergleichen!
      ListBox1.Items.Delete(i);
end;
cu
Narses

//EDIT: Code korrigiert: ListBox1.Items.Delete(i);

_________________
There are 10 types of people - those who understand binary and those who don´t.


Zuletzt bearbeitet von Narses am Di 23.02.10 11:31, insgesamt 1-mal bearbeitet
Niko S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: Mo 22.02.10 19:10 
wie wärs mit
ausblenden Delphi-Quelltext
1:
Listbox1.delete(ListBox1.ItemIndex);					

//Edit: Mist, zu langsam.
Erivium Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 22.02.10 19:35 
Vielen Dank für die bisherigen Antworten.

Würde ich auch gerne nicht mit Delphi 3 programmieren, aber das Problem ist, dass es leider Voraussetzung ist für die Hausarbeit ist. Nur zum probieren habe ich mal mit D7 herumgespielt.

Habe nun auch mal ListBox1.delete(i) ausprobiert und da gibt es leider nach wie vor dieselbe Fehlermeldung. Gibt es noch andere Varianten wie man auf das ListBox Element zugreifen kann?
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mo 22.02.10 19:43 
Kommt dir bei der Schleife keine Fehlermeldung das du auf nichtvorhandene Elemente zugreifst? Denn sobald du ein Element aus der Listbox löscht, greifst du zum schluss auf Elemente zu die nicht vorhanden sind. wäre da eine downTo-Schleife nicht deswegen ratsam?

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mo 22.02.10 19:45 
user profile iconNarses hat doch im obigen Code eine downto Schleife. ;)

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mo 22.02.10 19:46 
Narses schon ;) ich bezog mich bei meiner antwort auf den ersten Post in diesem Topic.

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 22.02.10 20:03 
Moin!

user profile iconErivium hat folgendes geschrieben Zum zitierten Posting springen:
Habe nun auch mal ListBox1.delete(i) ausprobiert und da gibt es leider nach wie vor dieselbe Fehlermeldung.
user profile iconErivium hat folgendes geschrieben Zum zitierten Posting springen:
Unter Delphi 3 allerdings wird mir die Fehlermeldung "undefinierter Bezeichner 'DeleteSelected'" angezeigt.
Du verwendest einen anderen Befehl und es wird die gleiche Fehlermeldung angezeigt? :shock: Kann nicht sein. :| Was stimmt also nicht? :gruebel: Deine Beschreibung oder dein Code?

user profile iconErivium hat folgendes geschrieben Zum zitierten Posting springen:
Gibt es noch andere Varianten wie man auf das ListBox Element zugreifen kann?
Hast du denn mal meinen Code ausprobiert? :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Erivium Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 22.02.10 20:39 
Hi,

also mein Code sieht jetzt folgendermaßen aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.MarkierteNotizloeschen1Click(Sender: TObject);
var i, j, geloeschtes, letztes:integer;
begin
for i := LbNotiz.Items.Count -1 downto 0 do
  begin
    if LbNotiz.Selected[i] then
geloeschtes:=i;
letztes:=LbNotiz.Items.Count;
   end ;
LbNotiz.Delete(i);   
for j:= geloeschtes to letztes do
 begin
Anzahl[j]:=Anzahl[j+1];
letztes:=letztes-1;


Die andere Schleife soll nur die nachfolgenden Listenelemente dann theoretisch aufrücken lassen.
Delphi meckert hier bei der Zeile LbNotiz.delete[i].

lg
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 22.02.10 22:15 
Moin!

user profile iconErivium hat folgendes geschrieben Zum zitierten Posting springen:
Delphi meckert hier bei der Zeile LbNotiz.delete[i].
Und was genau "meckert" Delphi da?

user profile iconErivium hat folgendes geschrieben Zum zitierten Posting springen:
Die andere Schleife soll nur die nachfolgenden Listenelemente dann theoretisch aufrücken lassen.
Was ist denn Anzahl[]?

Weiterhin schätze ich, du hast da ein begin-end vergessen. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Erivium Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 23.02.10 11:14 
Danke für die Antwort. :) Ich hoffe jetzt habe ich alle begin-ends. :S
Anzahl ist als Array von der Unit TNotiz abgespeichert. Das gelöschte soll dann mit dem nachfolgenden in der Liste überschrieben werden.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.MarkierteNotizlschen1Click(Sender: TObject);
var i, j, geloeschtes, letztes:integer;
begin

for i := LbNotiz.Items.Count -1 downto 0 do
  begin
    if LbNotiz.Selected[i]{=true} then
       begin
          geloeschtes:=i;
          letztes:=LbNotiz.Items.Count;
          LbNotiz.Delete(i);  
       end;
 for j:= geloeschtes to letztes do
   begin
     Anzahl[j]:=Anzahl[j+1];
     letztes:=letztes-1;
   end;        

end;
end;


Die Fehlermeldung bei LbNotiz ist: "Undefinierter Bezeichner: 'Delete'"
SvenAbeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Di 23.02.10 11:28 
Versuch mal:

ausblenden Delphi-Quelltext
1:
LbNotiz.Items.Delete(i);					
Erivium Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 23.02.10 11:45 
user profile iconSvenAbeln hat folgendes geschrieben Zum zitierten Posting springen:
Versuch mal:

ausblenden Delphi-Quelltext
1:
LbNotiz.Items.Delete(i);					


Danke! Der Befehl funktionierte.
Vielen Dank euch allen für die Hilfe. Hätte ich ohne euch nicht rausbekommen. :)

lg
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 23.02.10 11:53 
Moin!

user profile iconErivium hat folgendes geschrieben Zum zitierten Posting springen:
Die Fehlermeldung bei LbNotiz ist: "Undefinierter Bezeichner: 'Delete'"
user profile iconSvenAbeln hat folgendes geschrieben Zum zitierten Posting springen:
Versuch mal:
ausblenden Delphi-Quelltext
1:
LbNotiz.Items.Delete(i);					
Das ist richtig, ich habe die Eigenschaft .Items vergessen, man kann die Methode .Delete() nicht direkt aufrufen.

Den Code würde ich aber mal etwas besser formatieren, so kann man schnell den Überblick verlieren: :idea:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.MarkierteNotizlschen1Click(Sender: TObject);
  var
    i, geloeschtes, letztes: Integer;
begin
  for i := LbNotiz.Items.Count -1 downto 0 do begin
    if LbNotiz.Selected[i] then begin
      geloeschtes := i;
      letztes := LbNotiz.Items.Count;
      LbNotiz.Items.Delete(i); // .Items ergänzt
  end;
  for i := geloeschtes to letztes do begin // was passiert denn, wenn du mehr als ein Element löscht? ;)
    Anzahl[i] := Anzahl[i +1];
    letztes := letztes -1// es ist kein guter Stil bei einer for-Schleife die Grenzen innerhalb der Schleife zu ändern!
  end;        
end;
IMO hast du einen Bug in deinem Konzept: wenn du mehr als ein Element löscht, dann klappt das Aufrücken nicht mehr. Probier das mal so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.MarkierteNotizlschen1Click(Sender: TObject);
  var
    i, j: Integer;
begin
  for i := LbNotiz.Items.Count -1 downto 0 do begin
    if LbNotiz.Selected[i] then begin
      LbNotiz.Items.Delete(i);
      for j := i to LbNotiz.Count -2 do
        Anzahl[j] := Anzahl[j +1];
  end;
end;
cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Erivium Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 23.02.10 15:25 
Habe alles entsprechend geändert. Vielen Dank für die Hilfe! :)