ComboBox

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
CoolTuc
Beiträge: 7
Registriert: So 6. Sep 2009, 14:42

ComboBox

Beitrag von CoolTuc »

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

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: ComboBox

Beitrag von knight »

Meinst du eine TDBLookupComboBox?

knight

Maik81ftl
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

Beitrag von Maik81ftl »

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.

Code: Alles auswählen

for a:= ComboBox1.Items.Count Downto 0 do
  if ComboBox1.Items[a] = ComboBox1.Text then Merker:= ComboBox1.Text+IntToStr(a)
mal schnell aus der kalten geschrieben... sollte auch so gehen...
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

CoolTuc
Beiträge: 7
Registriert: So 6. Sep 2009, 14:42

Re: ComboBox

Beitrag von CoolTuc »

'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.

Code: Alles auswählen

ID    Eintrag
28   Eintrag 1
37   Eintrag 2
 ..     ...
usw...

Maik81ftl
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

Beitrag von Maik81ftl »

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.

Code: Alles auswählen

ID    Eintrag
28   Eintrag 1
37   Eintrag 2
 ..     ...
usw...
nun ich gehe gennerell mal davon aus, das du die ID zufällig erhalten magst.

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);
von statten gehen.

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 :D und der Kreis Segeberg meine LIEBE :D

CoolTuc
Beiträge: 7
Registriert: So 6. Sep 2009, 14:42

Re: ComboBox

Beitrag von CoolTuc »

Code: Alles auswählen

ComboBox1.Items.Insert(ID, eintrag);
funktioniert leider nur bei aufsteigender ID, beginnend bei 0, alle andere werden erst gar nicht eingetragen...

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...

CoolTuc
Beiträge: 7
Registriert: So 6. Sep 2009, 14:42

Re: ComboBox

Beitrag von CoolTuc »

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...

Maik81ftl
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

Beitrag von Maik81ftl »

CoolTuc hat geschrieben:

Code: Alles auswählen

ComboBox1.Items.Insert(ID, eintrag);
funktioniert leider nur bei aufsteigender ID, beginnend bei 0, alle andere werden erst gar nicht eingetragen...

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...
OK :?: :!:
das macht die sache dann schon mal wirklich etwas Umständlich.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

gtmind.de
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

Beitrag von gtmind.de »

An diesem Probem habe ich auch lange gesucht und in Delphi diese Lösung gefunden. Müsste in Lazarus genauso gehen ..
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;
in die Combobox ein das Objekt einfügen z.B. mit:

Code: Alles auswählen

cb.Items.AddObject(TStringField(Qu1.FieldByName('VAL')).AsString,TFTh.Create(1,TStringField(Qu1.FieldByName('ITEMINDEX')).AsInteger));
auf die Werte kannst du dan wieder mit:

Code: Alles auswählen

id := TFTh(cbProcTyp.Items.Objects[cbProcTyp.ItemIndex]).eid;
ich hoffe das hilft dir weiter
Zuletzt geändert von Lori am Mi 6. Apr 2011, 20:55, insgesamt 2-mal geändert.
Grund: Bitte den Code-Highlighter benutzen
Auch aus Steinen, die einem in den Weg gelegt werden, kann man etwas schönes bauen.

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: ComboBox

Beitrag von knight »

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...
Um beurteilen zu können, ob du etwas falsch machst, müsstest du uns schon mitteilen, was du gemacht hast.

knight

Maik81ftl
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

Beitrag von Maik81ftl »

CoolTuc hat geschrieben:

Code: Alles auswählen

ComboBox1.Items.Insert(ID, eintrag);
funktioniert leider nur bei aufsteigender ID, beginnend bei 0, alle andere werden erst gar nicht eingetragen...

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...
mal na ganz ander Frage??? wieviel ID's hast du, die verwendet werden???

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 :D und der Kreis Segeberg meine LIEBE :D

CoolTuc
Beiträge: 7
Registriert: So 6. Sep 2009, 14:42

Re: ComboBox

Beitrag von CoolTuc »

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...

gtmind.de
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

Beitrag von gtmind.de »

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.

CoolTuc
Beiträge: 7
Registriert: So 6. Sep 2009, 14:42

Re: ComboBox

Beitrag von CoolTuc »

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...

Code: Alles auswählen

sTemp := DataModel.qryTemp.FieldValues[sCol];
lID := DataModel.qryTemp.FieldValues['id'];
cmbCombo.Items.AddObject(sTemp, TObject(lID));
Danke noch mal für die Denkanstösse...

Antworten