Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Löschen einzelner Items einer ListBox (https://www.delphipraxis.net/202327-loeschen-einzelner-items-einer-listbox.html)

Kratos 21. Okt 2019 10:06

Delphi-Version: 10.2 Tokyo

Löschen einzelner Items einer ListBox
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo liebe Community,

*delphi-newbie*

Programmaufbau
Code:
Form5 -> ListBox5 -> Items -> Item 0, Item1, Item2, Item3, Item4, Item5
Form7 -> edt7(TEdit)
      -> btn7(TButton)
Auf
Delphi-Quellcode:
Form5
befindet sich eine
Delphi-Quellcode:
ListBox5
. In
Delphi-Quellcode:
Form5.OnCreate
ist festgelegt, dass
Delphi-Quellcode:
Item 0-5
geladen werden.
Wenn ein Doppelklick auf
Delphi-Quellcode:
ListBox5.Item5
stattfindet, soll sich
Delphi-Quellcode:
Form7
öffnen.
Der String, der in
Delphi-Quellcode:
Form7.edt7
eingegeben wird, soll als neues Item der
Delphi-Quellcode:
Form5.ListBox5
geaddet werden.
Das funktioniert bis hierhin alles.

Nun soll es aber möglich sein, dass Items, die AUSSCHLIEßLICH(!) durch
Delphi-Quellcode:
Form7.edt7
der
Delphi-Quellcode:
Form5.ListBox5
hinzugefügt worden sind, einzeln gelöscht werden können.
Meine Idee dazu war, dass ein einfaches Kreuz jeweils hinter dem hinzugefügten Item auf dessen Zeile erscheint. Durch Klick darauf, löscht es das Item. Ich hab das in einem Bild mal deutlich gemacht.

Ich habe keinen so richtigen Ansatzpunkt. Ich habe mir überlegt eine Prozedur zu schreiben, die jedes Mal einen Button dem hinzugefügten Item hinzufügt.
Aber so richtig weiß ich nicht wie das gehen soll.
Oder ist mein Ansatzpunkt falsch? Gibt es einen einfacheren Weg?
Für Denkanstöße wäre ich sehr dankbar :)

VG
Kratos

Billa 21. Okt 2019 10:18

AW: Löschen einzelner Items einer ListBox
 
Du benötigst ein Unterscheidungkriterium (manuell oder automatisch),
also beispielsweise beim Laden (Initialisieren) das Kriterium auf "0", beim Hinzufügen durch Button "1"...

Dazu könnte man entweder das Objekt des List-Items "mißbrauchen" oder besser gleich eine generische Liste der Einträge mit einer entsprechenden Property benutzen

Jasocul 21. Okt 2019 10:38

AW: Löschen einzelner Items einer ListBox
 
Falls du nicht unbedingt einen Button benötigst, kannst du dir mal TCheckListBox ansehen. Vielleicht kannst du die ja für das gewünschte Verhalten anpassen.

Kratos 21. Okt 2019 13:58

AW: Löschen einzelner Items einer ListBox
 
Also ich hab mich zuerst an der Checklistbox probiert.
Ich hab es jetzt so hinbekommen, dass sich
Delphi-Quellcode:
Items.ItemIndex < 5
nicht mehr löschen lassen. Allerdings lassen sich diese Items dennoch markieren. Wirklich zufrieden bin ich damit allerdings nicht.

@Billa
Ich programmiere noch nicht sehr lange delphi. Somit weiß ich leider nicht, was du mir sagen möchtest^^
Kannst du deine Aussage ein wenig mehr präzisieren, bitte? :)

Gruß
Kratos

KodeZwerg 21. Okt 2019 14:11

AW: Löschen einzelner Items einer ListBox
 
Hi, wenn ich mich korrekt erinner, kann man einem Item auch noch eine Eigenschaft anheften.
Wenn das noch funktioniert wäre der Aufbau so in etwa
(für die Items die man löschen kann/darf/soll/etc)
Delphi-Quellcode:
// etwas addieren
ListBox1.Items.AddObject('Ein Item', TObject(True));
// etwas löschen per abfrage so in etwa:
if Boolean(ListBox1.Items.Objects[ListBox1.ItemIndex]) then
  begin
    ListBox1.Items.Objects[ListBox1.ItemIndex].Free;
    ListBox1.Items.Delete(ListBox1.ItemIndex);
  end;
Ungetestet da ich gerade kein wunderbares Delphi vor mir habe...
Falls es nicht klappt oder Dir nicht zusagt, einfach ignorieren.

Ps: Markiert werden kann erstmal immer, soweit ich weiß.

Jasocul 21. Okt 2019 14:29

AW: Löschen einzelner Items einer ListBox
 
Wenn du verhindern willst, dass die Items nicht ausgewählt werden können, kannst du im OnSelect folgendes machen:
Delphi-Quellcode:
  if (CheckListBox1.itemindex < 5) and (CheckListBox1.Selected[CheckListBox1.itemindex]) then
  begin
    CheckListBox1.Selected[CheckListBox1.itemindex] := False;
  end;
Wenn diese nicht gechecked sein dürfen, dann im OnClickCheck:
Delphi-Quellcode:
  if (CheckListBox1.itemindex < 5) and (CheckListBox1.Checked[CheckListBox1.itemindex]) then
  begin
    CheckListBox1.Checked[CheckListBox1.itemindex] := False;
  end;
Das Konzpt, von KodeZwerg würde ich vermutlich auch nehmen, aber ich weiß nicht, ob du meinen deinen Kenntnissen schon damit klar kommst.

Kratos 21. Okt 2019 14:57

AW: Löschen einzelner Items einer ListBox
 
@Jasocul
ich habe deinen Code an meinen angepasst und es funktioniert ersteinmal. Danke dir!
OnSelect gibt es bei mir nicht. Ich hab den dafür vorgesehenen Code bei OnClick reingehauen.
Wirklich zufrieden bin ich mit der Lösung allerdings nicht. :P

In einem anderen Thread wurde ich darauf hingewiesen, dass so ein Ausdruck, den KodeZwerg verwendet, "dirty" sei und ich sowas lieber nicht verwenden sollte. Da ging es auch um einen Ausdruck mit einem Boolean vor der Klammer...

Kratos 21. Okt 2019 15:08

AW: Löschen einzelner Items einer ListBox
 
Wie wäre es mit der Idee:
Ich nehm eine ListBox mit 2 Spalten. Und mit Klick auf die zweite Spalte soll sich automatisch das jeweilige Item löschen?!
Eine ListBox mit mehreren Spalten habe ich schon einmal gebaut.^^

EDIT: Eine ListBox mit zwei Spalten fällt auch raus. Die zweite Spalte kann man leider nicht anklicken.

Jasocul 22. Okt 2019 06:13

AW: Löschen einzelner Items einer ListBox
 
Zitat:

Zitat von Kratos (Beitrag 1450026)
Wirklich zufrieden bin ich mit der Lösung allerdings nicht. :P

Wäre ich auch nicht. :wink:
Mir ging es eher um eine einfache Lösung für dein Problem.

Zitat:

Zitat von Kratos (Beitrag 1450026)
In einem anderen Thread wurde ich darauf hingewiesen, dass so ein Ausdruck, den KodeZwerg verwendet, "dirty" sei und ich sowas lieber nicht verwenden sollte. Da ging es auch um einen Ausdruck mit einem Boolean vor der Klammer...

Nein, das würde ich so auch nicht machen. Aber mir ging es nicht um diese einzelne Zeile, sondern eher um das Konzept. Ich arbeite auch oft mit zusätzlichen Objekten für die Listen-Elemente, um z.B. weitere Informationen zu hinterlegen.
Das Visualisierungsproblem behebst du damit nicht, aber damit kann man in deinem Fall hinterlegen, welche Items gelöscht werden dürfen oder zu welcher Form die Informationen gehören, etc.

Wenn du dich vom Konstrukt verabschieden kannst, dass an jeder erlaubten Zeile ein Lösch-Button ist, könntest du einen einzelnen Button (z.B. neben oder unter der Listbox) definieren, der nur Enabled ist, wenn das Löschen für den Eintrag zulässig ist.
Ich nutze in in solchen Fällen gerne TActionList mit TAction-Einträgen. Wenn so ein Entrag mit dem Button verbunden ist, kannst du beim OnUpdate des TAction-Eintrags definieren, wann der Button erlaubt ist und wann nicht.

Moombas 22. Okt 2019 08:23

AW: Löschen einzelner Items einer ListBox
 
Eine Möglichkeit wäre ein Array zu verwenden (geht nur, wenn die Listbox sich nicht sortiert, ansonsten muss das Array auch mit sortiert werden!).
Code:
var
  aArray: array of bool; //Bool ist nur eine Empfehlung
Das Array müsste (idealerweise) immer die Größe haben, wieviele Items es in der Listbox gibt.
Code:
setlength(aArray, Listbox.items.count);
So das Listboxitem 0 = aArray[0] wäre.

Beim löschen/schreiben musst du dann das Array natürlich jedesmal mit anpassen.
Hinzufügen
1. Den Eintrag in die Listbox hinzufügen
2. die Länge des Array neu definieren
3. Den entsprechenden Eintrag im Array anpassen. z.B. (ungetestet):
Code:
Listbox.items.add('ITEMTEXT');
setlength(aArray, Listbox.items.count);
iItem := Listbox.IndexOf('Eintrag');
aArray[iItem] := True; //(True = darf gelöscht werden, False = darf nicht gelöscht werden)
//optional, wenn du das "X" (leider nur als Haken möglich) haben willst:
//CheckListbox.items[iItem].checked := aArray[iItem];
Löschen
Code:
iItem := ListBox.ItemIndex; //Position zwischenspeichern
if aArray[iItem] then //Prüfung
begin
  //darf gelöscht werden
  ListBox.Items.Delete(iItem);
  //Achtung das Array muss auch angepasst werden!
  for i := iItem + 1 to length(aArray) do //Array durchlaufen und aufrücken
  begin
    aArray[i - 1] := aArray[i];
  end;
  aArray := length(aArray) - 1;
end else
begin
  //darf nicht gelöscht werden -> Fehlermeldung?
end;
Alles nur aus dem Gedächtnis und kann Fehler enthalten :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:44 Uhr.
Seite 1 von 2  1 2      

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