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 ComboBox mit mehreren Spalten? (https://www.delphipraxis.net/23132-combobox-mit-mehreren-spalten.html)

Stefan H. 29. Mai 2004 08:47


ComboBox mit mehreren Spalten?
 
Hallo Leute,

leider bin ich noch blutiger Delphi-Anfänger und deshalb habe ich eine Frage an die Fachleute. :warn: :coder:

Ist es eigentlich möglich, in der Standard-ComboBox mehrere Spalten darzustellen und wenn ja, wie macht man so etwas. Ich möchte meine Access-Frontend Datenbank als Delphi-Programm umschreiben und bei meiner Access-Datenbank benutze ich sehr häufig die ComboBox mit mehreren Spalten.

Folgendes Beispiel: Ich möchte eine Benutzerauswahl über eine ComboBox machen.
1. Spalte = Personalnummer (nicht sichtbar z.B. Spaltenbreite 0cm!)
2. Spalte = Name (soll angezeigt werden!)

Es soll aber nur der Name angezeigt werden, die Personalnummer soll nicht sichtbar sein und dient nur zur eindeutigen Identifikation des Benutzers - sozusagen als Rückgabewert den ich dann für weitere Abfragen weiterverwenden kann.

Kann ich so etwas auch mit Delphi6 Personal-Edition machen? :gruebel:
Für die Datenbank-Verbindung benutze ich KaDao (Freeware).

Ich hoffe, dass mir evtl. jemand weiterhelfen kann ansonsten brauche ich erst gar nicht anfangen.

Danke im Voraus!

MfG
Stefan H.

Luckie 29. Mai 2004 08:49

Re: ComboBox mit mehreren Spalten?
 
Wenn du eh nur eine sehen willst, dann benutze die Methode AddObject von Item -> http://www.delphipraxis.net/internal...hlight=listbox

Alexander 29. Mai 2004 10:04

Re: ComboBox mit mehreren Spalten?
 
Vielleicht hilft dir sonst auch das hier:
http://www.swissdelphicenter.ch/de/showcode.php?id=580
Oder habe ich dich falsch verstanden?

SirThornberry 29. Mai 2004 10:25

Re: ComboBox mit mehreren Spalten?
 
so Legt man ein (bzw. 3) Item(s) mit dazugehöriger PersonalNummer an
Delphi-Quellcode:
var LPersonalnummer: String;
begin
  LPersonalnummer := 'Personalnummer 3094d';
  Combobox1.Items.AddObject('Hansmüller', TObject(LPersonalnummer));

  LPersonalnummer := 'Personalnummer 394d0';
  Combobox1.Items.AddObject('Fritz walter', TObject(LPersonalnummer));

  LPersonalnummer := 'Personalnummer 08173';
  Combobox1.Items.AddObject('Max mustermann', TObject(LPersonalnummer));
Uns so lässt du dir die personalnummer von dem ausgewählten Item anzeigen
Delphi-Quellcode:
  showmessage(String(Combobox1.Items.Objects[ComboBox1.ItemIndex]));

Luckie 29. Mai 2004 10:26

Re: ComboBox mit mehreren Spalten?
 
@SirThornberry: Habe ich alles in der Code-Lib erklärt. ;)

SirThornberry 29. Mai 2004 10:31

Re: ComboBox mit mehreren Spalten?
 
@Luckie: jetzt wo du es sagst seh ichs *g* hab den link nicht angeschaut. Aber da er ja nur eine personalnummer haben will ist mein beispiel denk ich einfacher zu verstehen. Das "new" und "dispose" verwirrt ihn vielleicht nur - ansonsten wenn er mehr als nur nen string speichern will dann ist dein beitrag aus der codelib eindeutig besser :thuimb:

Stefan H. 29. Mai 2004 13:20

Re: ComboBox mit mehreren Spalten?
 
Hallo!

Vielen, vielen Dank nochmals für die schnellen Antworten. :thuimb:
Ich werde das mit dem AddObject mal ausprobieren.

Wünsche allen noch ein schönes Wochenende!!!

MfG
Stefan H.

Carsten Schmitz 28. Mai 2007 22:15

Re: ComboBox mit mehreren Spalten?
 
Zitat:

Zitat von SirThornberry
so Legt man ein (bzw. 3) Item(s) mit dazugehöriger PersonalNummer an
Delphi-Quellcode:
var LPersonalnummer: String;
begin
  LPersonalnummer := 'Personalnummer 3094d';
  Combobox1.Items.AddObject('Hansmüller', TObject(LPersonalnummer));

  LPersonalnummer := 'Personalnummer 394d0';
  Combobox1.Items.AddObject('Fritz walter', TObject(LPersonalnummer));

  LPersonalnummer := 'Personalnummer 08173';
  Combobox1.Items.AddObject('Max mustermann', TObject(LPersonalnummer));
Uns so lässt du dir die personalnummer von dem ausgewählten Item anzeigen
Delphi-Quellcode:
  showmessage(String(Combobox1.Items.Objects[ComboBox1.ItemIndex]));

Der Tip mit dem "AddObject" hat mir wirklich sehr gut gefallen und hat mir bei meinem Problem geholfen. Ich benötige jetzt allerdings noch eine weitere Variation und versuche mal, den Sachverhalt mit den hier benutzten Variablen zu beschreiben.
Ich habe in meinem D5-Programm eine TComboBox-Komponente, die mehrere Items (Personennamen) enthält. Damit ich in der dahinterliegenden Datenbank (Firebird 2.0) nur eine ID speichere (z.B. "LPersonalnummer), habe ich diese ID in der ComboBox dem jeweiligen Item, wie von Dir beschrieben, mit AddObjects hinzugefügt.
Soweit so gut, nun zum Problem:
Ich möchte, wenn ich in einem TDBGrid durch die Datenmenge scrolle, die jeweilige Personalnummer aus der Datenbank holen und über diese ID das Item in der ComboBox ermitteln, dessen Personalnummer der ID des Datensatzes entspricht. Denn Ziel ist es, das zugehörige Item in der ComboBox auszuwählen und den Personennamen anzuzeigen.

Ich hoffe, jemand kann mir einen guten und performanten Tip geben.

Grüsse,
Carsten

Gremlin 28. Mai 2007 22:48

Re: ComboBox mit mehreren Spalten?
 
Hallo Carsten,

du hast eine Combo mit den Paaren ID, Personalname und eine Tabelle mit einem ID-Feld? Wenn du über die Tabelle scrollst, suchst du mit dem ID-Feld der Tabelle in der Combo, stimmt das soweit?

Nehmen wir an du suchst über einen Integer (Code so aus dem Kopf)

Delphi-Quellcode:

procedure <DeineForm>.SearchInCombo(Value:integer);
var
  i: integer;
begin
  for i := 0 to <ComboBox>.Items.Count-1 do begin
    if (integer(<ComboBox>.Items.Objects[i])=Value) then begin
      <ComboBox>.ItemIndex := i;
      Break;
    end;
  end;
end;
Ist deine ID ein String, dann musst du den Code eben schnell auf String-Werte anpassen. Du kannst in den Beiträgen weiter oben nachschauen.

Jedoch hast du für diese Lösung immer noch das Problem, das für nicht gefundene IS-Werte, zumindest der letzte Wert angezeigt wird. Sollte dies nicht gewünscht sein, so musst du anstatt dem Break ein Exit verwenden und am Ende der Schleife den ItemIndex auf -1 setzen.

Delphi-Quellcode:

procedure <DeineForm>.SearchInCombo(Value:integer);
var
  i: integer;
begin
  for i := 0 to <ComboBox>.Items.Count-1 do begin
    if (integer(<ComboBox>.Items.Objects[i])=Value) then begin
      <ComboBox>.ItemIndex := i;
      Exit;
    end;
  end;
  <ComboBox>.ItemIndex := -1;
end;
BTW: Warum nimmst du nicht zwei Tabellen (die Tabelle mit dem ID-Feld hast du schon, fehlt noch die 2. Tabelle mit den Werten für ID und Personalname), einen Query zur Suche in der 2. Tabelle und einer Ausgabe über ein Label oder ein ReadOnly-Editfeld. Dies könnte viel schneller sein, natürlich abhängig von der Anzahl der Daten.

Carsten Schmitz 29. Mai 2007 13:08

Re: ComboBox mit mehreren Spalten?
 
Hi Gremlin,

Vielen Dank für Dein ausführliches Beispiel. Meine Daten haben am Anfang ungefähr eine Größe von ca. 3.000 Datensätzen, später evtl. 30.000.

Das mit der FOR-Schleife habe ich mir auch schon überlegt. Ein Vorteil ist, daß die Berechnungen im Hauptspeicher ausgeführt werden, jedoch kann es auch lange dauern, wenn diese Schleife bis zu einige tausend Male aufgerufen wird.
Das mit der Query zur Suche in der 2. Tabelle ist unter diesen Umständen vielleicht doch günstiger. Die Ausgabe würde ich weiterhin in der ComboBox belassen, da man über die Funktion "ComboBox.Items.IndexOf" relativ schnell das zugehörige Item ermitteln kann.
Oder gibt es weitere Argumente für ein Label oder ein Readonly-Editfeld ?

Mir fällt noch eine dritte Möglichkeit ein, die ich hier kurz skizzieren möchte:
Parallel zum Füllen der ComboBox erzeuge ich eine StringList mit KeyValue-Werten (Bezeichner=Wert). Bezeichner würde in diesem Fall die ID sein und Wert würde der jeweils dazugehörige Name sein. Nur wie stelle ich es da an, mit dem Wert der ID direkt auf den Wert zuzugreifen ?


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