ComboBox
ComboBox
Hallo,
ich lese eine Tabelle aus (ID und eine andere Spalte) und möchte diese Werte in eine ComboBox eintragen. Das Eintragen ist kein Problem, aber ich möchte auch die IDs (der Datenbank) mit in der ComboBox hinterlegen (so ähnlich wie ItemData). Wähle ich also z.B. einen Eintrag aus, möchte ich sofort die entsprechende ID (der Datenbank) habe, da sich daraus eine andere SQL-Abfrage ergibt..
Wie kann ich das machen...??
Danke
ich lese eine Tabelle aus (ID und eine andere Spalte) und möchte diese Werte in eine ComboBox eintragen. Das Eintragen ist kein Problem, aber ich möchte auch die IDs (der Datenbank) mit in der ComboBox hinterlegen (so ähnlich wie ItemData). Wähle ich also z.B. einen Eintrag aus, möchte ich sofort die entsprechende ID (der Datenbank) habe, da sich daraus eine andere SQL-Abfrage ergibt..
Wie kann ich das machen...??
Danke
Re: ComboBox
Meinst du eine TDBLookupComboBox?
knight
knight
-
- Beiträge: 619
- Registriert: Mi 9. Mär 2011, 16:34
- OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
- CPU-Target: 64Bit
- Wohnort: seit 01.06.2011 in Wahlstedt
Re: ComboBox
nun jeder eintrag in einer ComboBox hat einen ich nenn ihn mal internen Counter.
denn verfühgt dieser bedingt durch seine Eigenschaft über ein EIngabefeld. wenn du den wert des eingabefeldes abfragt und den Listeneintrag in deiner ComboBox suchst, erhälst du den EIntrag zurück.
mal schnell aus der kalten geschrieben... sollte auch so gehen...
denn verfühgt dieser bedingt durch seine Eigenschaft über ein EIngabefeld. wenn du den wert des eingabefeldes abfragt und den Listeneintrag in deiner ComboBox suchst, erhälst du den EIntrag zurück.
Code: Alles auswählen
for a:= ComboBox1.Items.Count Downto 0 do
if ComboBox1.Items[a] = ComboBox1.Text then Merker:= ComboBox1.Text+IntToStr(a)
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache
und der Kreis Segeberg meine LIEBE 


Re: ComboBox
'a' ist aber der interne Zähler der ComboBox, falls ich das verstanden habe. Die eindeutigen IDs einer DB können aber bel. sein, z.B.
usw...
Code: Alles auswählen
ID Eintrag
28 Eintrag 1
37 Eintrag 2
.. ...
-
- Beiträge: 619
- Registriert: Mi 9. Mär 2011, 16:34
- OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
- CPU-Target: 64Bit
- Wohnort: seit 01.06.2011 in Wahlstedt
Re: ComboBox
nun ich gehe gennerell mal davon aus, das du die ID zufällig erhalten magst.CoolTuc hat geschrieben:'a' ist aber der interne Zähler der ComboBox, falls ich das verstanden habe. Die eindeutigen IDs einer DB können aber bel. sein, z.B.
usw...Code: Alles auswählen
ID Eintrag 28 Eintrag 1 37 Eintrag 2 .. ...
alernativ, würde ich sagen, den eintrag in diezeile zu kopieren, in der auch der ID liegt.
dies könnte denne ggf. mit der Zeile
Code: Alles auswählen
ComboBox1.Items.Insert(ID, eintrag);
Selber habe ich mich dieser Sache noch nicht besch#ftigt, da ich bisher noch Keine Datenbanken geschrieben habe.

Würde allerdigns diesen Ansatz zuerst versuchen.
alternativ kannst neben der ComboBox auch noch mit einer TStringlist arbeiten. Vorteil?
TStringlist[1] = ID 5 ComboBox.Items[1] = Eintrag20
TStringlist[2] = ID 99 ComboBox.Items[2] = Eintrag1
u.s.w.
somit braucht du dann nur einen "Zähler" und hast beide werte zur hand.
Nachteil! für ein wert brauchst du denne 2 Objekte.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache
und der Kreis Segeberg meine LIEBE 


Re: ComboBox
Code: Alles auswählen
ComboBox1.Items.Insert(ID, eintrag);
Ich denke mal der Vorschlag mit der TStringList scheitert daran, dass es zu viel Aufwand ist; es ist nicht nur eine ComboBox, es bis zu 20....die muss ich dann alle vorhalten...
Re: ComboBox
ich habe gehört, man sollte dafür eine TDBLookupComboBox verwenden, wobei das bei mir allerdings nicht funktioniert, entweder weil es nicht funktioniert oder aber weil ich was falsch mache...
-
- Beiträge: 619
- Registriert: Mi 9. Mär 2011, 16:34
- OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
- CPU-Target: 64Bit
- Wohnort: seit 01.06.2011 in Wahlstedt
Re: ComboBox
OKCoolTuc hat geschrieben:funktioniert leider nur bei aufsteigender ID, beginnend bei 0, alle andere werden erst gar nicht eingetragen...Code: Alles auswählen
ComboBox1.Items.Insert(ID, eintrag);
Ich denke mal der Vorschlag mit der TStringList scheitert daran, dass es zu viel Aufwand ist; es ist nicht nur eine ComboBox, es bis zu 20....die muss ich dann alle vorhalten...


das macht die sache dann schon mal wirklich etwas Umständlich.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache
und der Kreis Segeberg meine LIEBE 


-
- Beiträge: 9
- Registriert: So 27. Feb 2011, 16:23
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.4.z)
- CPU-Target: AMD 32/64 bit
- Wohnort: Dessau-Roßlau
- Kontaktdaten:
Re: ComboBox
An diesem Probem habe ich auch lange gesucht und in Delphi diese Lösung gefunden. Müsste in Lazarus genauso gehen ..
eine kleine Klasse
in die Combobox ein das Objekt einfügen z.B. mit:
auf die Werte kannst du dan wieder mit:
ich hoffe das hilft dir weiter
eine kleine Klasse
Code: Alles auswählen
type
TFTh = class
public
oid , eid: Integer; // Objecte ID (ed, cb ..), Eigene ID
constructor Create(oi ,ei: integer) ;
end;
constructor TFTh.Create(oi, ei: integer) ;
begin
oid := oi;
eid := ei;
end;
Code: Alles auswählen
cb.Items.AddObject(TStringField(Qu1.FieldByName('VAL')).AsString,TFTh.Create(1,TStringField(Qu1.FieldByName('ITEMINDEX')).AsInteger));
Code: Alles auswählen
id := TFTh(cbProcTyp.Items.Objects[cbProcTyp.ItemIndex]).eid;
Zuletzt geändert von Lori am Mi 6. Apr 2011, 20:55, insgesamt 2-mal geändert.
Grund: Bitte den Code-Highlighter benutzen
Grund: Bitte den Code-Highlighter benutzen
Auch aus Steinen, die einem in den Weg gelegt werden, kann man etwas schönes bauen.
Re: ComboBox
Um beurteilen zu können, ob du etwas falsch machst, müsstest du uns schon mitteilen, was du gemacht hast.CoolTuc hat geschrieben:ich habe gehört, man sollte dafür eine TDBLookupComboBox verwenden, wobei das bei mir allerdings nicht funktioniert, entweder weil es nicht funktioniert oder aber weil ich was falsch mache...
knight
-
- Beiträge: 619
- Registriert: Mi 9. Mär 2011, 16:34
- OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
- CPU-Target: 64Bit
- Wohnort: seit 01.06.2011 in Wahlstedt
Re: ComboBox
mal na ganz ander Frage??? wieviel ID's hast du, die verwendet werden???CoolTuc hat geschrieben:funktioniert leider nur bei aufsteigender ID, beginnend bei 0, alle andere werden erst gar nicht eingetragen...Code: Alles auswählen
ComboBox1.Items.Insert(ID, eintrag);
Ich denke mal der Vorschlag mit der TStringList scheitert daran, dass es zu viel Aufwand ist; es ist nicht nur eine ComboBox, es bis zu 20....die muss ich dann alle vorhalten...
Frage deshalb, da mir grad der gedanke kahm. bei 50 IDs 55 Leerzeilen zu erzeugen. inser(ID, Eintrag) und wenn eine Zeile mehr ingetragen wurde 'ne leerzeile wieder löschen. wird zwar auswendig aber sollte theoretisch auch gehen oder?!
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache
und der Kreis Segeberg meine LIEBE 


Re: ComboBox
ich denke, ich werde mal die Version mit Create probieren....wobei es be einem constructor auch eine destruktor geben muss, damit der Speicher wieder aufgeräumt wird...mal schauen und vielen Dank schon mal...sage dann bescheid was es gegeben hat...
-
- Beiträge: 9
- Registriert: So 27. Feb 2011, 16:23
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.4.z)
- CPU-Target: AMD 32/64 bit
- Wohnort: Dessau-Roßlau
- Kontaktdaten:
Re: ComboBox
ich habes noch mal in Lazarus versucht .. geht auch ..
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
TTh = class
private
eid, tid: Integer;
public
constructor Create(ei, ti : integer) ;
end;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
ComboBox1: TComboBox;
procedure Button1Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
constructor TTh.Create(ei, ti : integer) ;
begin
eid := ei;
tid := ti;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ComboBox1.Items.Clear;
ComboBox1.Items.AddObject('hallo 2..22',TTh.Create(2,22));
ComboBox1.Items.AddObject('hallo 12..122',TTh.Create(12,122));
ComboBox1.Items.AddObject('hallo 11..121',TTh.Create(11,121));
ComboBox1.Items.AddObject('hallo 44..55',TTh.Create(44,55));
ComboBox1.Items.AddObject('hallo 1..2',TTh.Create(1,2));
ComboBox1.Items.AddObject('hallo 98..345',TTh.Create(98,345));
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
ShowMessage(IntToStr(TTh(TComboBox(Sender).Items.Objects[TComboBox(Sender).ItemIndex]).eid)+' .. '+
IntToStr(TTh(TComboBox(Sender).Items.Objects[TComboBox(Sender).ItemIndex]).tid));
end;
end.
Auch aus Steinen, die einem in den Weg gelegt werden, kann man etwas schönes bauen.
Re: ComboBox
Hallo,
ich habe nun ein Lösung für mein Problem, in einer normalen ComboBox zusätzlich die DB-IDs zu speichern, folgendermassen gelöst...
Danke noch mal für die Denkanstösse...
ich habe nun ein Lösung für mein Problem, in einer normalen ComboBox zusätzlich die DB-IDs zu speichern, folgendermassen gelöst...
Code: Alles auswählen
sTemp := DataModel.qryTemp.FieldValues[sCol];
lID := DataModel.qryTemp.FieldValues['id'];
cmbCombo.Items.AddObject(sTemp, TObject(lID));