Delphi-PRAXiS
Seite 2 von 2     12   

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)

Gremlin 30. Mai 2007 14:23

Re: ComboBox mit mehreren Spalten?
 
Wenn du 30.000 Datensätze hast, dann darfst du den Initialisierungsvorgang für die Combo bzw. StringListe nicht vergessen. Ein Scrollen über einen Datensatz und ein anschliessendes Suchen in deiner 2. Datenmenge würde evtl. gleich schnell sein.

Du könntest beispielsweise über die Eigenschaft Values der Klasse TStringliste zugreifen und darüber die korr. Werte ermitteln.

Delphi-Quellcode:
  ShowMessage('Der Wert für 4711=Test: '+Liste.Values['4711']);

Ich kann nicht beurteilen, woher die Werte für die ComboBox resp. die StringListe kommen. Wenn diese aus einer anderen Tabelle wie deine erste Tabelle kommen würden und der Grid ist nur zum blättern/scrollen verwendet, dann würde sich ein Query anbieten mit einem Join von Tabelle1 zu Tabelle2 über die ID-Nummer:

Delphi-Quellcode:
[...]
  // FQuery ist beispielsweise ein im Formular angegebener Query a la FQuery : TQuery;
  // Dann könnte eine für die Initialisierung in etwa so aussehen
  with FQuery do begin
    Close;
    SQL.Clear;
    SQL.Add('Select Tabelle1.ID, Tabelle2.Personalname');
    SQL.Add('from Tabelle1');
    SQL.Add(' join Tabelle2 on (Tabelle2.ID=Tabelle1.ID)');
    // wenn es nicht notwendigerweise einen Personalnamen zum Hauptdatensatz gibt,
    // diesen 2. Teil verwenden
    // SQL.Add(' left join Tabelle2 on (Tabelle2.ID=Tabelle1.ID)');
    try
      Open;
    except
      // Eventuelles Fehlerhandling hier einbauen
    end;
  end;

Carsten Schmitz 31. Mai 2007 20:30

Re: ComboBox mit mehreren Spalten?
 
Hi Gremlin,

Vielen Dank für deine konstruktive Unterstützung. Ich hätte heute fast angefangen, eine der weiter oben beschriebenen Lösungen umzusetzen.

Jedoch habe ich über ein anderes Forum, wo ich ebenfalls aktiv bin, genau die Lösung erhalten, die ich suche. Und zwar kann man auf die Objekte der in einer ComboBox enthaltenen Items ebenfalls ganz einfach zugreifen. Man muß nur wissen wie, die Lösung des Problems lautet:
ComboBox1.Items.IndexOfObject(TObject(iID))

Ist das nicht eine geile Lösung ? Man kann sofort und ohne Umwege über die in der Tabelle enthaltene ID das zugehörige Item der ComboBox ausfindig machen. Der Umweg über eine Stringliste ist somit definitiv nicht nötig. Die Werte meiner ComboBox werden übrigens während der Intialisierung des Formulars über eine 2. Tabelle gefüllt.

Grüsse,
Carsten

Gremlin 31. Mai 2007 22:06

Re: ComboBox mit mehreren Spalten?
 
Hi Carsten,


jo, kannst du auch über die Combo machen, es gibt doch mehrere Lösungen. :thumb:
Nur solltest du dir überlegen, ob es sinnvoll ist, die Werte von der Tabelle2 in die Combo zu schreiben und beim Scrollen von Tabelle1 in der Combo zu suchen, anstatt über einen Query beide Tabellen auf einmal zu kombinieren. Ich kann das für dich nicht entscheiden. :-D

Fang doch einfach mal mit einer ersten Lösung an und wenn sie dir nicht gefällt machst du es eben anders. Wenn dann noch Fragen auftauchen melde dich einfach nochmal. :wink:

Viel Erfolg.

Ykcim 15. Dez 2014 17:12

AW: ComboBox mit mehreren Spalten?
 
Hallo Zusammen,

der Threat ist zwar schon älter, aber vielleicht kann mir trotzdem jemand einen Tip geben.

Ich habe es folgendermaßen umgesetzt:
Delphi-Quellcode:
while not Query.Eof do begin
      if not Query.FieldByName(Spalte_sichtbar).IsNull then begin
         Wert:=Query.FieldByName(Spalte_Unsichtbar).AsString;
         ComboBox.Items.AddObject(Query.FieldByName(Spalte_sichtbar).AsString, TObject(Wert));
      end;
      Query.Next;
   end;
Im OnChange Procedure wollte ich den Wert dann in ein Editfeld schreiben und habe es so versucht:

Delphi-Quellcode:
Edit_Abteilung_ID.Text:=String(Combo_Abteilung.Items.Objects[Combo_Abteilung.ItemIndex]);


Leider wird dann nur so ein komisches Zeichen in das Editfeld geschrieben (wie ein L falschherung, Schenkel zeigt nach links).

Wenn ich es debuggere, dann bekomme ich immer den Wert #4.

Kann mir jemand sagen, was ich falsch mache?

Vielen Dank
Patrick

Bernhard Geyer 15. Dez 2014 17:48

AW: ComboBox mit mehreren Spalten?
 
Du kannst nicht einen String als TObject interpretieren um ihn entsprechend anzuhängen.
Bei Strings gibt es automatische Referenzzählung. Wenn zur Laufzeit gemeint wird das der String nicht mehr verwendet wird, wird er aufgeräumt.
Und nach einiger Zeit ist an dieser Speicheradresse irgendwas zu finden.

Ykcim 15. Dez 2014 19:18

AW: ComboBox mit mehreren Spalten?
 
Das verstehe ich nicht. Habe ich diesen Thread falsch verstanden? Ich dachte es ginge genau darum, einem String eine Zusatz-Info mitzugeben, die ich dann später wieder abrufen kann.
Wenn das so nicht geht, hast Du eine andere Idee, wie ich das lösen kann?

Vielen Dank
Patrick

Sir Rufo 15. Dez 2014 20:44

AW: ComboBox mit mehreren Spalten?
 
Ja, da hast etwas völlig falsch verstanden.

Diese "tolle" Lösung (mehr ein Gewurschtel oder auch Krücke) misbraucht den Objekt-Parameter um einen Integer Wert dort abzulegen. Das funktioniert irgendwie, ist aber nicht der Sack der Zwerge.

Wenn du eine Information dort ablegen willst, dann lege dort auch eine Information ab.

Nehmen wir an, dort soll eine Person abgelegt werden mit einem string ID Wert, dann mach das dich richtig:
Delphi-Quellcode:
TPerson = class
public
  constructor Create( const ID, FirstName, LastName : string );
  function ToString : string; override;
  property ID : string read FID;
  property FirstName : string read FFirstName;
  property LastName : string read FLastName;
end;

function TPerson.ToString: string;
begin
  Result := FLastName + ', ' + FFirstName;
end;
Aus der Abfrage erzeugst du dir die Instanzen und fügst diese dann zu den ComboBox Items hinzu
Delphi-Quellcode:
LPerson := TPerson.Create( ... );
ComboBox.Items.AddObject( LPerson.ToString, LPerson );
Du musst jetzt nur wegen der Freigabe schauen, ob die ComboBox Items das OwnsObjects unterstützen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz