Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ListBox Eingabe mit Bezug auf vorheriges ListBox (https://www.delphipraxis.net/187711-listbox-eingabe-mit-bezug-auf-vorheriges-listbox.html)

Sanni13 25. Dez 2015 14:01


ListBox Eingabe mit Bezug auf vorheriges ListBox
 
Hallo,
ich möchte mehrere Listboxen mit Bezug aufeinander nutzen. Die erste Listbox soll die Auswahl a oder b haben. Bei der zweiten sollen, abhängig ob a oder b in Listbox1 gewählt wurde, verschiedene Auswahlmöglichkeiten angezeigt werden. Soweit funktioniert es. Ich kann dann aber die Auswahlmöglichkeiten in Listbox2 nicht anklicken. Es soll danach noch eine dritte Listbox geben welche sich auf die Auswahl der zweiten bezieht. Wie lässt es sich lösen, dass ich die zweite Listbox zwar anklicken aber nichts auswählen kann?
Außerdem zeigt mir das Programm bei der Ausführung eine System-Fehlermeldung "out of bound" an, wenn ich Listbox2 anwähle bevor ich eine Auswahl in ListBox1 treffe. Lässt sich diese Meldung ausschalten?

Vielen Dank im Voraus und schöne Feiertage =)

Hier mein Quelltext:

Delphi-Quellcode:
procedure ListBox2Click(Sender: TObject);
var x:String;
begin
 x:= Listbox1.Items[ListBox1.Itemindex] ;
if ListBox1.ItemIndex >=0 then
 begin
 if x='a' then
   begin
   ListBox2.Items.Clear;
   ListBox2.Items.Add('a1');
   ListBox2.Items.Add('a2');
   end
  else if x='b' then
    begin
    ListBox2.Items.Clear;
    ListBox2.Items.Add('b1');
    ListBox2.Items.Add('b2');
    end
  end
else ShowMessage('Bitte Wert aus Liste1 auswählen');
end;

procedure ListBox3Click(Sender: TObject);
var y:String;
 begin
if ListBox2.ItemIndex >=0 then
 begin
 y:= Listbox2.Items[ListBox2.Itemindex] ;
 if y='a1' then
  begin
  ListBox3.Items.Clear;
  ListBox3.Items.Add('a11');
  ListBox3.Items.Add('a12');
  end
 else if y='b2' then
   begin
   ListBox3.Items.Clear;
   ListBox3.Items.Add('b21');
   ListBox3.Items.Add('b22');
   end
 else if y='a2' or 'b1' then
   ListBox4.Items.Clear;
 end
else ShowMessage('Bitte Wert aus Liste2 auswählen');
end;

Amateurprofi 25. Dez 2015 15:01

AW: ListBox Eingabe mit Bezug auf vorheriges ListBox
 
Zitat:

Zitat von Sanni13 (Beitrag 1325259)
Hallo,
Außerdem zeigt mir das Programm bei der Ausführung eine System-Fehlermeldung "out of bound" an, wenn ich Listbox2 anwähle bevor ich eine Auswahl in ListBox1 treffe. Lässt sich diese Meldung ausschalten?

Ja, indem du erst dann auf Listbox1.Items[ListBox1.Itemindex] zugreifst, wenn geprüft ist, dass ListBox1.Itemindex>=0 ist.

Perlsau 25. Dez 2015 15:26

AW: ListBox Eingabe mit Bezug auf vorheriges ListBox
 
Zitat:

Zitat von Sanni13 (Beitrag 1325259)
Hallo, ich möchte mehrere Listboxen mit Bezug aufeinander nutzen.

Herzlich willkommen in der Delphipraxis. :hi:

Was du beschreibst, läßt in meiner Vorsellung einen Baum entstehen, der an jedem Ast eine bestimmte Anzahl Zweige aufweist und an jedem Zweig eine bestimme Anzahl Blätter hat. Falls ich das richtig interpretiere, wäre womöglich eine Treeview-Komponente besser zur Darstellung geeignet.

Ich hab mal in einem einfachen Datenbank-Manager etwas ähnliches mit Listboxen entwickelt: In der ersten Listbox befanden sich die verfügbaren Datenbanken, die im Programm registriert waren. Je nach Auswahl von List_DB wurde in List_Tabellen eine andere Auswahl an Tabellen angezeigt. Abhängig von List_Tabellen war dann die Anzeige in Listbox3, die ich List_Felder nannte und die, wenig überraschend, die verfügbaren Felder der ausgewählten Tabelle angezeigt hat. Dabei mußte ich dafür sorgen, daß die Listboxen entweder beim Programmstart bereits mit den entsprechenden Daten befüllt wurden, also sozusagen eine Ausgangsstellung herstellen, oder aber entsprechende Bedingungen in die OnChange-Ereignisbehandlung eingebaut wurden, die verhinderten, daß in Listboxen, die noch nicht befüllt wurden (Count=0), ein nicht vorhandener Index angewählt wurde. Und genau das besagt die von dir gepostete Fehlermeldung out of bound: Der Index des angeforderten Eintrags liegt außerhalb der verfügbaren Indexmenge.

Fast vergessen: Wenn du deinen Quellcode vor dem Posten mit der Maus markierst und dann den Button mit dem Delphi-Helm drückst, wird der Code in die sog. Delphi-Tags eingebettet, wodurch die Formatierung erhalten bleibt und das Lesen deines Codes angenehmer wird.

Sanni13 27. Dez 2015 12:23

AW: ListBox Eingabe mit Bezug auf vorheriges ListBox
 
Vielen Dank für die Antworten!
Die Fehlermeldung out of bound konnte ich beheben =)

Leider kann ich in meinem Projekt die TreeView-Komponente nicht nutzen, wegen der späteren Verarbeitung. Deshalb benötige ich diese Listboxen. Mittlerweile sehe ich auch warum es nicht funktioniert, da ich die Abfrage auf das Ereignis onklick beziehe, wird immer die Abfrage gemacht, ich kann aber nicht die eingetragenen Werte auswählen. Gibt es dafür einen Befehl?

PS: Den Tipp mit dem Delphihelm ist gemerkt!

Perlsau 27. Dez 2015 13:15

AW: ListBox Eingabe mit Bezug auf vorheriges ListBox
 
Sorry, ich hab keinen blassen Schimmer, wovon du hier schreibst :gruebel:

Sanni13 27. Dez 2015 14:22

AW: ListBox Eingabe mit Bezug auf vorheriges ListBox
 
Naja sobald ich auf meine Listbox2 klicke, wird geschaut, was in der Listbox1 angeklickt wurde und dementsprechend in die Listbox2 die Auswahlmöglichkeiten geschrieben. Jetzt müsste ich diese anklicken können, das geht aber nicht, da es dann wieder die eben beschriebene Abfrage macht.

Habe aber eben die Lösung dafür gefunden, anstelle von dem Ereignis OnClick muss ich OnEnd nutzen. Jetzt läufts wie es soll :)

Vielen Dank für die Hilfe!

Perlsau 27. Dez 2015 14:47

AW: ListBox Eingabe mit Bezug auf vorheriges ListBox
 
TListBox.OnEnd ist mir noch nicht über den Weg gelaufen, ich kenne lediglich TListBox.OnEndDrag und TListBox.OnEndDock. Hat aber mit deinem Problem nichts zu tun.

Wieso reagierst du nicht einfach auf eine Änderung des Eingrags in Listbox1 mit dem Einlesen in Listbox2? Und um unnötiges Einlesen zu vermeiden (es gibt kein OnChange in TListBox, ein Klick muß nicht zangsläufig den ItemIndex ändern), fragst du vor dem Einlesen in Listbox2, also im OnClick von Listbox1 ab, ob sich der ItemIndex geändert hat:

Delphi-Quellcode:
...
Private
  Var
    Idx_ListBox1,
    Idx_ListBox2 : Integer;
...
Implementation

Procedure TForm1.ListBox1Click(Sender: TObject);
begin
  If ListBox1.ItemIndex = Idx_ListBox1 Then Exit;
  Idx_ListBox1 := ListBox1.ItemIndex;
  Einlesen_ListBox2;
end;

Sir Rufo 27. Dez 2015 14:50

AW: ListBox Eingabe mit Bezug auf vorheriges ListBox
 
Ich würde beim Klicken in ListBox1 die Werte in der ListBox2 setzen, denn ab dem Zeitpunkt ist klar, was in ListBox2 stehen muss.

haentschman 27. Dez 2015 17:48

AW: ListBox Eingabe mit Bezug auf vorheriges ListBox
 
Moin...:P
Zitat:

Leider kann ich in meinem Projekt die TreeView-Komponente nicht nutzen, wegen der späteren Verarbeitung.
...das riecht ganz stark nach Datenhaltung in den Controls. Der Anzeige sollte es egal sein wie die Daten vorgehalten werden...und umgekehrt. :roll:

Dejan Vu 28. Dez 2015 07:17

AW: ListBox Eingabe mit Bezug auf vorheriges ListBox
 
Meiner Ansicht nach lässt sich das Problem dadurch lösen, indem Listbox2 genau dann gefüllt wird, wenn ein Eintrag in Listbox1 ausgewählt wurde. Du kannst LB2 auch disabled, *bis* etwas in LB1 gewählt wurde usw.

Als Alternative zur Treeview würde ich statt Listboxen eventuell Comboboxen verwenden. Der imho einzige Grund, eine TV nicht zu verwenden, ist der Platzbedarf (so eine TV verbrät ja doch Platz im Formular). Und hier sind 2 Comboboxen einfach das kompakteste.

Ja ja, eine dropdown-TV-Combo wäre noch besser. Aber die gibt es in der VCLFMX-Welt ja nicht.


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