Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Per Klick auf Listboxeintrag bestimmten Datensatz auslesen? (https://www.delphipraxis.net/59332-per-klick-auf-listboxeintrag-bestimmten-datensatz-auslesen.html)

Rayne 20. Dez 2005 20:18


Per Klick auf Listboxeintrag bestimmten Datensatz auslesen?
 
Hallo!

In meinem kleinen Programm kann man in verschiedene Edit-Felder Dinge eintragen, die dann in einer Datei gespeichert werden.

Jetzt habe ich eine Suche, die es mir ermöglicht, mit Suchbegriffen den jeweiligen passenden Datensatz aus der Datei rauszusuchen und alle dazugehörigen Werte wieder in die Edit-Felder einträgt.

Da es ja vorkommen kann, dass in bestimmten Datensätzen einzelne Bezeichnungen doppelt vorkommen (bspw. Vorname, Artikelname etc.), habe ich mir eine ListBox erstellt, wo alle Datensätze angezeigt werden, wenn es mal einen doppelten Eintrag geben sollte.
Ein Beispiel: Es gibt 2 Datensätze, wo die Person jeweils Klaus heißt. Jetzt suche ich nach Klaus und in meiner ListBox erscheint 2 mal der Eintrag Klaus.

Jetzt kommt mein Problem: Ich möchte, dass wenn ich nun auf solch einen Eintrag in der ListBox klicke, die dazugehörigen weiteren Eigenschaften dieses Datensatzes in den Edit-Feldern eingetragen werden.
Ein Beispiel: Klaus 1 wohnt in Berlin, ist 38 Jahre alt und verheiratet. Klaus 2 wohnt in München, ist 22 Jahre alt und Single.
In meiner ListBox stehen nun 2 Einträge „Klaus“ (das geht bis jetzt alles schon).
Klicke ich auf den ersten Eintrag, sollen in den Edit-Feldern alle Eigenschaften von Klaus 1 eingefügt werden. Klicke ich auf Klaus 2, sollen alle Eigenschaften von ihm dort eingetragen werden.

Der Quellcode für die Suche lautet:

Delphi-Quellcode:
procedure TForm1.Suchen1Click(Sender: TObject);  //Suche
var q,index : integer; suchstring: string[30];
begin

 
index:=-1;
suchstring:=Edit15.Text;
Listbox1.Clear;

 
If Edit15.Text='' Then
begin
ShowMessage('Bitte einen Suchbegriff eingeben!');
end

 
Else
begin

 
If RadioButton1.checked=True Then
begin

 
  for q:=0 to 100 do                                  //sucht nach Gurtzeugen
    begin
      if (saetze[q].gurtzeug = suchstring) then
      begin
      index:=q;
      Listbox1.Items.Add(IntToStr(index+1)+'. '+saetze[q].gurtzeug); //zeigt alle Suchergebnisse in Listbox an, die den Suchkriterien entsprechen
    end;
    end;
  if index > -1 then
    begin
     edit1.text:=saetze[index].gurtzeug;
     edit2.text:=IntToStr(saetze[index].baujahr1);
     edit3.text:=IntToStr(saetze[index].spruenge1);

 
     edit4.text:=saetze[index].hauptschirm;
     edit5.text:=IntToStr(saetze[index].baujahr2);
     edit6.text:=IntToStr(saetze[index].spruenge2);

 
     edit7.text:=saetze[index].reserve;
     edit8.text:=IntToStr(saetze[index].baujahr3);
     edit9.text:=IntToStr(saetze[index].spruenge3);

 
     edit10.text:=saetze[index].aad;
     edit11.text:=IntToStr(saetze[index].baujahr4);
     edit12.text:=IntToStr(saetze[index].spruenge4);

 
     Edit13.Text:=IntToStr(saetze[index].preis);

 
     Edit14.Text:=IntToStr(saetze[index].index);

 
    end

 
    Else
    begin
    ShowMessage('Leider keine Treffer gefunden!');
    end;

 
    end;

Ich weiß nun allerdings nicht, wie das mit der ListBox genau geht, dass mir per Klick die richtigen Daten ausgelesen werden.

Also ich denke mir, dass ich ungefähr so was eintragen muss:

Delphi-Quellcode:
procedure TForm1.ListBox1Click(Sender: TObject);
begin

 
     edit1.text:=saetze[r].gurtzeug;
     edit2.text:=IntToStr(saetze[r].baujahr1);
     edit3.text:=IntToStr(saetze[r].spruenge1);

 
     edit4.text:=saetze[r].hauptschirm;
     edit5.text:=IntToStr(saetze[r].baujahr2);
     edit6.text:=IntToStr(saetze[r].spruenge2);

 
     edit7.text:=saetze[r].reserve;
     edit8.text:=IntToStr(saetze[r].baujahr3);
     edit9.text:=IntToStr(saetze[r].spruenge3);

 
     edit10.text:=saetze[r].aad;
     edit11.text:=IntToStr(saetze[r].baujahr4);
     edit12.text:=IntToStr(saetze[r].spruenge4);

 
     Edit13.Text:=IntToStr(saetze[r].preis);

 
     Edit14.Text:=IntToStr(saetze[r].index);

 
end;
Wenn ich das jedoch so mache, zeigt der mir immer nur den ersten Eintrag im Datensatz an.
Der soll aber „erkennen“, welchen Datensatz ich gerade in der ListBox anklicke und soll genau dessen Eigenschaften in die Edit-Felder eintragen ;-)

Irgendwie kann das doch gar nicht so schwer sein, aber ich komm an dieser Stelle echt nicht mehr weiter :-(

Ich hoffe, ihr könnt mir den entscheidenden Tipp geben :-)

Danke!

Der_Unwissende 20. Dez 2005 20:28

Re: Per Klick auf Listboxeintrag bestimmten Datensatz ausles
 
Hi,
schau dir mal bei der Listbox die Eigenschaft ItemIndex an (siehe OH), das sollte dir weiter helfen.
Zudem kannst du auch in einem TStrings (benutzt eine ListBox) Objekte zu jedem Eintrag hinzu fügen. Wenn da jetzt die weiteren Daten drin stünden...

Gruß Der Unwissende

Rayne 20. Dez 2005 21:57

Re: Per Klick auf Listboxeintrag bestimmten Datensatz ausles
 
Hm, danke erstmal für die Antwort, aber so richtig viel kann ich damit auch nicht anfangen, leider.

Was zum Beispiel bringt mir der ItemIndex der ListBox? Damit kann ich doch eigentlich nur gucken, welcher Eintrag in der ListBox ausgewählt worden ist, oder?

Aber der beispielsweise 2. Eintrag in der ListBox muss doch nicht gleich dem 2. Eintrag in meiner Datei sein :wiejetzt:

Angenommen Klaus 1 befindet sich in der Datei an Stelle 5 und Klaus 2 an Stelle 7. Dann werden ja bei der Suche beide Klaus' in der ListBox angezeigt an Stelle 1 und 2. Was bringt es mir dann also, wenn ich rauskriege, dass Klaus 1 an Stelle 1 in der ListBox steht (in der Datei aber an Stelle5)?

Oder verstehe ich das falsch?
Ich bin total verwirrt *g*

Pfoto 20. Dez 2005 23:07

Re: Per Klick auf Listboxeintrag bestimmten Datensatz ausles
 
du kannst einer Listbox anstatt mit "Add" per "AddObject" einen zweiten Paramter übergeben, der versteckt mitgeführt wird. Du kannst darin einen Integerwert bzw. Pointer speichern.
Normalerweise kannst du damit den Zeiger auf ein Objekt abspeichern, deshalb der name "AddObject"

Du solltest versuchen, jedem deiner Datensätze eine eindeutige Nummer zuzuweisen, eine ID also.
Dies ist sozusagen Pflicht, wenn man vorhat, ein wenig mehr mit solchen Datensätzen zu jonglieren und ist auch bei "richtigen" Datenbank-Realisationen normal.

Wenn jeder Datensatz eine eindeutige ID hat, ist es somit egal, wie viele "Klaus" etc. es gibt, denn nach einem Klick auf die Liste wird nicht nach dem Namen (z.B "Klaus") gesucht, sondern es wird die in der Liste mitgespeicherte ID geholt und der entsprechende Datensatz gesucht.
Dies geschieht wie gesagt, indem du vorher die List mit "AddObject" füllst.


Also etwa so:

Delphi-Quellcode:
Listbox1.Items.AddObject('Klaus', TObject(1));
Die "1" soll in diesem Fall einfach die ID des Datensatzes darstellen. Jeder Datensatz muss natürlich seine eigene Nummer haben, die du auch mit in der Datei speichern solltest.
Da der Compiler normalerweise einen Pointer auf ein Objekt erwartet, gaukeln wir ihm mit "TObject()" vor, es sei an dieser Stelle eins.

Um die Daten (die ID) nach einem Klick auszulesen, kannst du folgendes machen:

Delphi-Quellcode:
var ID : integer;
// ...
ID:= Integer(ListBox1.Items.Objects[Listbox1.itemindex]);
Wir sagen dem Compiler, dass er den Pointer als Integer-Wert interpretieren soll (da er ja normalerweise dort einen Pointer auf ein Objekt erwartet). Über die "Objects[]"-Methode lesen wird also die Adresse aus, wo wir ja vorher die ID abgespeichert hatten.


So, ich hoffe es soweit richtig erklärt zu haben, da ich es selbst erst vor kurzem hier gelernt habe...


Gruß
Pfoto


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 Uhr.

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