Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Listbox item löschen und nächstes selektieren (https://www.delphipraxis.net/213068-listbox-item-loeschen-und-naechstes-selektieren.html)

JanWe 17. Mai 2023 23:46

Listbox item löschen und nächstes selektieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend,

Listbox/ Listen - einfachste Sache ...
eigentlich.
Dachte ich auch.

Ich habe eine Liste mit Items (Überschriften), die mit einer Liste mit Texten verknüpft ist, d.h. ich selektiere in der Liste und der VollText wird im Memo angezeigt.

Ich möchte aus der Listbox ein (blau) ausgewähltes Item löschen und gleich das z.B. darüberliegende (oder darunter) (wo der schwarze Rahmen dann nach dem Löschen schon draufzeigt, welcher aber noch nicht blau selektiert ist), selektieren und den dazugehörigen Text anzeigen.
Am Anfang, nach Programmstart und Listenfüllung ist das erste Item blau markiert. LB-Itemindex:= 0;

In der Keydown = Entf-Tasten-Procedur steht:
Delphi-Quellcode:
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
var e : integer;
begin
 e := ListBox1.ItemIndex;
 ListBox1.items.Delete(e);
 sl.delete (e); // Element aus Volltext-Liste del
 listbox1.ItemIndex := (e); // neues Setzen der Selektion
 if e > 1 memo1.text := sl[e-1]; // anzeigen des Volltextes
 listbox1.SetFocus;
end;
Wenn ich einfach nur lösche (Entf drücke) wird immer die oberste gelöscht. Der blaue Balken bleibt stets beim Obersten.
(die Volltextanzeige arbeitet dann auch korrekt.)


Wenn ich nun das letzten Item blau selektiere (Taste Pagedown in der Liste) und dann lösche,
wird er gelöscht, der schwarze Rahmen markiert nun das letzte, also ehemals darüberliegende item. Blau hinterlegt ist es aber nicht.
Drücke ich erneut ENTF wird er letzte Eintrag gelöscht, doch der schwarze Rahmen markiert nun das oberste Item.
Bei erneutem ENTF-Drücken werden fortan nur noch die obersten Items gelöscht. (warum nicht dort, wo der Itemindex vorher stand?)

(ich hoffe, ich hab das alles nachvollziehbar beschrieben).

Was mach ich denn falsch?
Wieso springt der auf das Item[0]
und wieso selektiert er das neue Item nicht mit dem blauen Balken?

(Übrigens stimmt nach dem Löschen die passende memo-Anzeige nur, wenn das oberste selektiert und gelöscht wird. - da müßte auch synchron)

Kann jemand nachvollziehen, wo es bei mir hakt?

Kurz: Also ich möchte einfach Items löschen und direkt den passenden Volltext synchron zum Item angezeigt bekomment und das nächstliegende Item blau markiert haben. So dacht ich mir das.

Wo liegt denn mein Denkfehler bei Listen und Listboxen?

Danke schonmal

himitsu 17. Mai 2023 23:49

AW: Listbox item löschen und nächstes selektieren
 
Tipp: Debuggen.

Rate mal was ItemIndex für einen Wert haben wird, wenn nichts selektiert ist? (drittes Bild)
Nachdem du das Letzte gelöscht hast und versuchst den Index auf das Item danach (Letztes+1) zu setzen. :stupid:

KodeZwerg 18. Mai 2023 10:10

AW: Listbox item löschen und nächstes selektieren
 
Delphi-Quellcode:
procedure TForm12.ListBox1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  i: Integer;
begin
  case Key of
    VK_DELETE:
      begin
        i := Self.ListBox1.ItemIndex;
        if (i > -1) then
          begin
            Self.ListBox1.Items.Delete(i);
            if (i < Self.ListBox1.Items.Count) then
              Self.ListBox1.Selected[i] := True
              else
              if Self.ListBox1.Items.Count > 0 then
                Self.ListBox1.Selected[Pred(Self.ListBox1.Items.Count)] := True;
          end;
      end;
  end;
end;
Sowas?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:50 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