AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Listbox item löschen und nächstes selektieren
Thema durchsuchen
Ansicht
Themen-Optionen

Listbox item löschen und nächstes selektieren

Ein Thema von JanWe · begonnen am 17. Mai 2023 · letzter Beitrag vom 18. Mai 2023
Antwort Antwort
Benutzerbild von JanWe
JanWe

Registriert seit: 23. Mär 2015
Ort: NRW
78 Beiträge
 
Delphi 7 Personal
 
#1

Listbox item löschen und nächstes selektieren

  Alt 17. Mai 2023, 23:46
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
Miniaturansicht angehängter Grafiken
sel.jpg  
Jan
Allen demnächst ein gutes 2023!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

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

  Alt 17. Mai 2023, 23:49
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Mai 2023 um 23:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 18. Mai 2023, 10:10
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?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:19 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