Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - 2. Spalte auslesen in Listbox


hube - Mo 03.01.11 13:39
Titel: 2. Spalte auslesen in Listbox
Hallo zusammen

Ich habe folgendes Problem: Ich habe einen Table in welchem ich 2 Spalten mit Werten habe, die ich mit einem Mausklick in eine Listbox "weiterverarbeiten" will.

Der Table sieht etwa so aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Artikel     WG_Artikel
Badehose    3
Badekleid   3
Bademantel  3
Badeschuhe  1
Bikini      3
Bluse       3
Body        3
Buch        5
Finken      1

Zuerst befülle ich die Listbox wie folgt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TArtikel.FormShow(Sender: TObject);
var FieldValue: String;
begin
Listbox1.Items.Clear;
try
TempQuery.Close;
TempQuery.SQL.Clear;
TempQuery.SQL.Add('Select Artikel, WG_Artikel from ARTIKEL GROUP BY ARTIKEL, WG_Artikel');
TempQuery.Open;
while not TempQuery.Eof do
begin
FieldValue := TempQuery.Fields[0].AsString;
if FieldValue <> '' then ListBox1.Items.Add(FieldValue);
TempQuery.Next;
end;
ListBox1.ItemIndex := 0;

except
on EDatabaseError do
MessageDLG('Kann keine Artikel finden.', mtError, [mbOK], 0)
end;

Damit befüllt es mir die Listbox wie gewünscht mit allen "Artikel". Wenn ich nun einen Wert (Artikel) aus der Listbox (mit einem Doppelklick) auswählen will, dann mache ich dies so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TArtikel.ListBox1DblClick(Sender: TObject);
var
i : integer;
FieldValue : string;
begin
   for i:=0 to ListBox1.Items.Count-1 do
   if ListBox1.Selected[i] then
   begin
   Edit1.Text := ListBox1.Items[i];
   end;
end;

Und dann zeigt es mir den mit einem Doppelklick ausgewähleten Wert im Edit1.Text an. Soweit funktioniert alles wunderbar. Das Problem ist nun, ich möchte in einem "Edit2.Text" den 2. Wert "WG_Artikel" (welcher in der Listbox1 zwar nicht sichtbar ist, jedoch trotzdem ausgewählt ist) anzeigen lassen.

Hat jemand eine Ahnung wie ich das machen kann?

Besten Dank für jede Hilfe.

Liebe Grüsse, Markus

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Delete - Mo 03.01.11 13:58

Eine Listbox hat nur eine Spalte. Ein Listview wäre wohl das geeignetere Steuerelement für dich.

Und die Schleife ist auch überflüssig:

Delphi-Quelltext
1:
2:
if Listbox1.Items.Count > 1 then
  Edit1.Text := Listbox1.Selected[ListBox1.ItemIndex];


zuma - Mo 03.01.11 16:58

wenn dir Luckie's Vorschlag (andere Komponente statt Listbox benutzen) nicht so gefällt, bleibt nur noch, das du bei Auswahl eines Listboxeintrages im Hintergrund in den Query gehst und dir dort die Info herholst, also zb. per Locate in etwa so


Delphi-Quelltext
1:
2:
3:
4:
if TempQuery.Locate('Artikel', Listbox1.Selected[ListBox1.ItemIndex], []) then
 Edit2.Text := lQueryTemp.FieldByName(WG_Artikel).asstring
else
 Edit2.Text := '';


ist aber unsauber, da die Synchronisation der Listbox/Query-Daten von dir ge(währ)leistet werden muss.


Bergmann89 - Mo 03.01.11 17:02

Hey,

alternativ könntest du die Daten auch mit mehreren Records in einer Liste organisieren.

MfG Bergmann.


LSanchez - Di 04.01.11 10:13

oder verwende

Delphi-Quelltext
1:
ListBox1.Items.AddObject(FieldValue, WG_ArtikelObject);                    


WG_ArtikelObject ist von Typ TWG_ArtikelObject und enthält den 2. Wert.


Delphi-Quelltext
1:
2:
3:
TWG_ArtikelObject = class
    PrimaryKey: String;
end;


Gruß

Luis Sanchez