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 Listbox zweiten Wert pro Eintrag hinterlegen (https://www.delphipraxis.net/129990-listbox-zweiten-wert-pro-eintrag-hinterlegen.html)

seppelon 1. Mär 2009 12:10


Listbox zweiten Wert pro Eintrag hinterlegen
 
Moin moin,

ich hätte da mal gerne ein Problem.
Ich hab bisher nur etwas Kleinkram mit Delphi programmiert und scheitere jetzt an einer wahrscheinlich simplen Problemstellung.
Meine Listbox soll mehrere Einträge bekommen, diese repräsentieren jeweils einen Datensatz aus einer MySQL-Tabelle - soweit noch kein Problem. Ich verwende folgende Schleife um die Datensätze nach einander in die Listbox zu schreiben:

Delphi-Quellcode:
For i := 1 to Form1.FResult.RowsCount do
begin
Listbox1.Items.Add(Form1.FResult.FieldValueByName('name'));
Form1.FResult.Next;
end;
Jetzt wird mir für jeden Datensatz ein Eintrag in der Listbox angezeigt. Ich möchte nun durch Doppelklicken auf einen Eintrag ein Formular öffnen, in dem ich weitere Parameter des Datensatzen editieren kann, also ihn verändern kann.
Dazu müsste ich mit einer erneuten SQL-Query die restlichen Parameter des Datensatzes nachladen.
Jetzt komme ich zum eigentlichen Problem: Es kann zwei oder mehr Datensätze geben die im Feld 'name', dem in der Listbox angezeigten, identische Werte enthalten.
Also würde ich nun zusätzlich zum angezeigten Text noch den primary Key des Datensatzes in der Listbox hinterlegen wollen - natürlich nicht sichtbar.
Aaaaber wie geht das?
Nach dem ich schon diverse Beiträge zu ähnlichen Problemen gelesen habe bin ich nun langsam am Ende.
Da wird von eigenen Klassen definieren gesprochen und von Objekten hinzufügen und von weiß ich was noch allem. :stupid:
Für mich sah jetzt die Prozedur Listbox.Items.AddObject nach dem aus was ich brauche(?!).
Allerdings hat mir weder die Delphi-Hilfe noch irgendein Forenbeitrag wirklich vermitteln können wie ich das ganze verwende.

Delphi-Quellcode:
Items.AddObject('Name=Wert',Pointer(43)
Das habe ich mal in einem Beitrag gefunden - werde ich leider auch nicht besonders schlau draus. Instinktiv würde ich da jetzt als Wert den anzuzeigenden String übergeben. Aber was hat es mit Pointer(43) auf sich? Kann ich da meinen primary Key (int) übergeben? Wie greif ich auf den Wert später wieder zu? :drunken:

Vielen Dank für eure Hilfe
ein Delphi-N00b

Satty67 1. Mär 2009 12:19

Re: Listbox zweiten Wert pro Eintrag hinterlegen
 
Also denke das es bei dem Lösungsansatz um andere Listen, als TStrings geht. TreeView Items z.B. haben ein Datenfeld, dem man z.B. ein Integer als gecasteten Pointer untermogeln kann.

In Deinen Fall kämen mir folgende Ideen:

anderen Datencontainer (ListView oder StringGrid mit ausgeblendeten Spalten) oder eine paralell mit geführte Liste (TstringList). Letzteres wird kompliziert, wenn ListBox sortiert wird.

DeddyH 1. Mär 2009 12:28

Re: Listbox zweiten Wert pro Eintrag hinterlegen
 
Nein, das geht auch mit TStrings. Da eine Objektreferenz ja auch nur ein Zeiger ist, welcher wiederum aus einer ganzen Zahl besteht, kann man durch den gezeigten Cast auch Zahlen (also den Primärschlüssel, wenn numerisch) hinterlegen.
Pseudocode:
Delphi-Quellcode:
ListBox.Items.AddObject(Datensatz.Stringfeld, Pointer(Datensatz.ID));
Um die hinterlegte ID wieder auszulesen, geht man den umgekehrten Weg:
Delphi-Quellcode:
ID := integer(ListBox.Items.Objects[ListBox.ItemIndex]);
Mit dieser ID kann man dann eine Query befüllen und sich die Daten holen. Die Beispiele sind nicht getestet, daher keine Garantie ;)

Satty67 1. Mär 2009 12:37

Re: Listbox zweiten Wert pro Eintrag hinterlegen
 
Ja warum umständlich, wenn es auch einfach geht. Dabei hatte ich sogar eben noch schnell geschaut, ob TStrings eine Objektliste mitführt (und die völlig übersehen). :oops:

seppelon 1. Mär 2009 12:41

Re: Listbox zweiten Wert pro Eintrag hinterlegen
 
Das ist ja total cool - funktioniert soweit astrein :thumb:
Mal so rein aus Interesse, wäre es auch möglich noch mehr Werte zu hinterlegen bzw. z. B. Strings zu hinterlegen?

Danke liebe Delphi-Pro's :cheer:

Luckie 1. Mär 2009 12:49

Re: Listbox zweiten Wert pro Eintrag hinterlegen
 
Zitat:

Zitat von seppelon
Das ist ja total pornomäßig

Ich würde dich bitten solche Ausdrücke in Zukunft zu unterlassen.

DeddyH 1. Mär 2009 13:10

Re: Listbox zweiten Wert pro Eintrag hinterlegen
 
Zitat:

Zitat von seppelon
Mal so rein aus Interesse, wäre es auch möglich noch mehr Werte zu hinterlegen bzw. z. B. Strings zu hinterlegen?

Wenn Du die in eine Klasse packst, kannst Du die Objektreferenz dieser Klasse hinterlegen (das ist ja auch der ursprüngliche Sinn des Ganzen). Zum Zugriff musst Du dann nur gegen diese Klasse casten.

seppelon 1. Mär 2009 13:18

Re: Listbox zweiten Wert pro Eintrag hinterlegen
 
Ok, dann werd ich mich mal mit Klassen und Objektreferenzen auseinander setzen.
Wer weiß wann man das mal gebrauchen kann.

Danke an alle die geholfen haben :cheers:
Seppl




PS:
Zitat:

Zitat von Luckie
Ich würde ich bitten solche Ausdrücke in Zukunft zu unterlassen.

Werd ich in Zukunft beachten - der Kommentar war in der Tat etwas unüberlegt.

Luckie 1. Mär 2009 13:25

Re: Listbox zweiten Wert pro Eintrag hinterlegen
 
Guck mal hier: http://www.delphipraxis.net/internal...476&highlight= da habe ich so was gemacht. Die Objekte befinden sich alle einer Liste. Bim füllen der Listbox, werden die Zeiger auf die Objekte an jeden Eintrag gehangen. Entscheidet sich die Methoden FillListbox in der Unit Main.pas und die Methode zum Selberzeichnen der Listbox in der entsprechenden Unit.

Reinhard Kern 1. Mär 2009 21:43

Re: Listbox zweiten Wert pro Eintrag hinterlegen
 
Zitat:

Zitat von seppelon
Also würde ich nun zusätzlich zum angezeigten Text noch den primary Key des Datensatzes in der Listbox hinterlegen wollen - natürlich nicht sichtbar.
Aaaaber wie geht das?

Hallo,

es gibt auch noch eine viel einfachere und sprachunabhängige Methode: man hängt ein TAB und den primary key an den Listbox-Eintrag dran, und dann macht man die Tabposition so weit rechts, dass der primary key niemals sichtbar wird.

Gruss Reinhard


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

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