Problem bei Aktualisierung von ListBoxen

Rund um die LCL und andere Komponenten
Antworten
Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Problem bei Aktualisierung von ListBoxen

Beitrag von Kay »

Hallo zusammen,

ich habe folgendes Problem bei der Aktualisierung von ListBoxen:
Ich verwende drei Auswahllisten (Typ TListBox). Immer wenn ein neuer Eintrag in ListBox1 ausgewählt wird, soll die ListBox2 mit neuen Werten gefüllt werden und immer wenn ein Eintrag in ListBox2 ausgewählt wird, soll ListBox3 entsprechend aktualisiert werden.

Code: Alles auswählen

procedure TForm1.FormShow(Sender: TObject);
begin
  ListBox1.Items.Add('1');
  ListBox1.Items.Add('2');
  ListBox1.Items.Add('3');
  ListBox1.ItemIndex := 0;
end;
 
procedure TForm1.ListBox1SelectionChange(Sender: TObject; User: boolean);
var
  I: Integer;
  S: String;
begin
  ShowMessage('ListBox1SelectionChange');
  S := ListBox1.Items[ListBox1.ItemIndex] + '.';
  ListBox2.Items.Clear;
  for I := 1 to 3 do ListBox2.Items.Add(S + IntToStr(I));
  ListBox2.ItemIndex := 0;
end;
 
procedure TForm1.ListBox2SelectionChange(Sender: TObject; User: boolean);
var
  I: Integer;
  S: String;
begin
  ShowMessage('ListBox2SelectionChange');
  S := ListBox2.Items[ListBox2.ItemIndex] + '.';
  ListBox3.Items.Clear;
  for I := 1 to 3 do ListBox3.Items.Add(S + IntToStr(I));
  ListBox3.ItemIndex := 0;
end;
Beim Programmstart funktioniert alles einwandfrei, d. h. wenn das Formular angezeigt wird, werden alle drei ListBoxen aktualisiert.
Wenn ich allerdings jetzt in ListBox1 einen beliebigen Wert auswähle (durch DropDown), wird nur die SelectionChange-Methode von ListBox1 ausgeführt, die von ListBox2 nicht. Demnach wird auch die dritte Liste nicht aktualisiert.
Woran liegt das und wie kann ich diesen Fehler beheben?

Viele Grüße
Kay

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Problem bei Aktualisierung von ListBoxen

Beitrag von MAC »

Momment, wenn ich das eichtig verstehe willst du listbox1 ändern.Dadurch ändert sich auch LB 2, und LB3 sollte sich ändern, tut es aber nicht ?
Dann musst du einfach die vorlezte Zeile hinzufügen Damit rufst du nach dem ändern von LB2 die methode auf damit auch LB3 geändert wird. LB = listbox

Code: Alles auswählen

procedure TForm1.ListBox1SelectionChange(Sender: TObject; User: boolean);
var
  I: Integer;
  S: String;
begin
  ShowMessage('ListBox1SelectionChange');
  S := ListBox1.Items[ListBox1.ItemIndex] + '.';
  ListBox2.Items.Clear;
  for I := 1 to 3 do ListBox2.Items.Add(S + IntToStr(I));
  ListBox2.ItemIndex := 0;
  ListBox2SelectionChange(Sender,User);
end;

Code: Alles auswählen

Signatur := nil;

Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Re: Problem bei Aktualisierung von ListBoxen

Beitrag von Kay »

Hallo MAC,

ja genau, wenn ich in LB1 blättere, dann soll LB2 und davon abhängig auch LB3 geändert werden.
Also wenn ich den Quelltext von TListBox richtig verstehe, dann müsste eigentlich beim Setzen von ItemIndex die Methode SelectionChange automatisch aufgerufen werden, sofern eine gesetzt wurde.
Ich hab jetzt den expliziten Aufruf, wie von dir angegeben, eingefügt. Beim Programmstart wird die Event-Methode von ListBox2 nun doppelt ausgeführt und wenn ich in der ListBox1 blättere, dann bekomme ich die Fehlermeldung: "Out of bounds."

Viele Grüße
Kay

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Problem bei Aktualisierung von ListBoxen

Beitrag von shokwave »

Hallo Kay,

am Code liegt es nicht. Der läuft unter Ubuntu 10.10 64bit (GTK2) und WindowsXP 32bit(habs gerade probiert).
Welche Version von Lazarus und FPC verwendest du. Ich benutze Lazarus 0.9.29 mit FPC 2.5.1.

"Out of bounds" bedeutet, dass du auf ein Item zugreifen willst, das es nicht gibt. In deinem Beispiel gibt es die Items 0 bis 2.
mfg Ingo

Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Re: Problem bei Aktualisierung von ListBoxen

Beitrag von Kay »

Ja, von der Logik her dachte ich eigentlich auch, dass der Code fehlerfrei laufen müsste. Kann mir das nicht wirklich erklären.
Ich verwende Lazarus 0.9.29 + FPC 2.4.3 (Win32).

Viele Grüße
Kay

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Problem bei Aktualisierung von ListBoxen

Beitrag von MAC »

das 2 mal beim programmstart klappt vielleicht mir

Code: Alles auswählen

if user then "listbox2change"
wobei das ja eigentlich nicht so schlimm ist.

Mir fällt gerade jetzt ein, das dein fehler zu 90 % ist das das .itemindex den wert -1 hat. Also das kein Item makiert ist.
Versuch mal

Code: Alles auswählen

if Listbox1.itemindex = -1 then exit;
am anfang des programms bei listbox1 change, bzw bei listbox2 change.
Wahrscheinlich klappt das programm dann nicht mehr so wie es soll, aber es tritt kein fehler mehr auf.

Code: Alles auswählen

Signatur := nil;

Antworten