Autor Beitrag
clon
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 13.02.03 09:11 
Hallo,

ich habe folgendes Problem:
In eine Listbox werden über SQL-Abfragen zusammengesetzte Strings aus einer Datenbanktabelle hinzugefügt ("String1 - String2"), jetzt will ich aber wieder auf die ID der Datenbanktabelle zurückkommen. Ok, und jetzt das Nicht-Datenbankproblem, ich will zusätzlich zu diesem Item einen Integerwert speichern, wie stellt man das an?

Wie könnte so ein Record oder was auch immer aussehen und wie kann man dann wieder darauf zugreifen?

Oder wie könnte man alternativ mit einer Abfrage wieder auf die ursprüngliche ID zurückkommen, wenn "String 1" und "String 2" ebenfalls einen Bindestrich enthalten darf

Grüße

_________________
Though this be madness, yet there is method in't (Hamlet)
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Do 13.02.03 10:17 
Hi,

wenn Du die Listbox mit Werten füllst dann benutze die Methode AddObject. Dadurch hast Du die Möglichkeit ein tObject mit anzugeben. Wenn Du dann einen Eintrag in der Listbox selektierst kannst Du über die Eigenschaft Objects auf das Objekt zugreifen.

So kannst Du zum Beispiel Items der ListBox hinzufügen:
ausblenden Quelltext
1:
2:
3:
  ListBox1.Items.AddObject ('Zeile 1', Pointer (52));
  ListBox1.Items.AddObject ('Zeile 2', Pointer (96));
  ListBox1.Items.AddObject ('Zeile 3', Pointer (8));

Das Auslesen der zusätzlichen Daten (Integer Werte):
ausblenden Quelltext
1:
Label1.Caption := IntToStr (Integer (ListBox1.Items.Objects [ListBox1.ItemIndex]));					

Gruß
TINO
GSE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 740

Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
BeitragVerfasst: Do 13.02.03 10:19 
Also um zusätzliche Informationen zu einem Item zu speichern:
ausblenden Quelltext
1:
DeineListBox.Items.Objects[Itemnr] := pointer('dein Zeugs');					


mfg
GSE

P.S.: Mist zu spät!

_________________
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs
and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Richard Cook)
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 13.02.03 10:36 
Hallo,

die Klasse tStrings (welche auch die einträge einer Listbox verwaltet) besitzt die Eigenschaft Objects. Hierbei handelt es sich um ein Array of tObject. Da tObject-Variablen auch nichts anderes als Zeiger sind kannst du diese als Zeiger auf beliebige Datenstrukturen "missbrauchen". Jeder Array Eintrag gehört zum ensprechenden Listeneintrag.

Du erzeugst also einen Record sowie einen Pointer-Typ auf diesen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
tData = RECORD
    Wert : Integer;
    Datum : tDateTime
  END;

  pData = ^tData;


Um Daten anzuhängen erzeugst du Dynamisch Speicher und füllst diese Daten ein, in diesem Beispiel sind dies der Index in der Liste sowie der Aktuelle Zeitpunkt:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
  VAR
    tmp : pData;
begin
  new(tmp) ; // Speicher für die Daten reservieren
  tmp^.Wert := ListBox1.Items.Count;
  tmp^.Datum := now;
  ListBox1.Items.AddObject(TimeToStr(tmp^.Datum), tObject(tmp));
end;


Wie du siehst muss man behaupten, das tmp vom Typ tObjekt ist. Das fürhrt zu fehlern wenn du versuchst tatasächlich ein Object an dieser Stelle anzusprechen. Das hast du aber nicht vor, und du weisst ja, das du da kein Objekt angehängt hast. Also Typecastest du das Ganze wieder beim auslesen (hier wenn mann doppelt auf einen Listeneintrag clickt):
ausblenden Quelltext
1:
2:
3:
4:
5:
procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
  Label1.Caption := IntToStr(pData(ListBox1.Items.Objects[ListBox1.ItemIndex])^.Wert);
  Label2.Caption := FormatDateTime('c', pData(ListBox1.Items.Objects[ListBox1.ItemIndex])^.Datum);
end;

Da du den speicher Dynamisch reserviert hast, musst du ihn auch selber wieder Freigeben. Diese Funktion puttzt alle angehängten Datentypen weg:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.FormDestroy(Sender: TObject);
  VAR
    i : Integer;
begin
  FOR i := Listbox1.Items.Count - 1 DOWNTO 0 DO
    Dispose(pData(Listbox1.Items.Objects[i]));
end;


Gruß
Klabautermann

PS: Da holt man nur mal weiter aus und schon sind andere schneller ;).