Delphi-PRAXiS

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 - Record zu Item hinzufügen (https://www.delphipraxis.net/101023-listbox-record-zu-item-hinzufuegen.html)

darksign 7. Okt 2007 11:11


ListBox - Record zu Item hinzufügen
 
Hallo!

Ich habe ein Listbox "Mitarbeiter" mit verschiedenen Einträgen(=Mitarbeitern). Wenn ich jetzt auf einen Mitarbeiter klicke, dann werden unter der Listbox 3 Editfelder angezeigt, wo ich zusätzliche Daten zu dem ausgewählten Mitarbeiter eingeben kann! Natürlich müssen die eingegebenen Daten irgendwo zwischengespeichert werden. Ich hätte das in Form eines Records gemacht

Record "Mitarbeiterinfo"
Adresse:String
Telefon:String;
....

Gibt es nun eine Möglichkeit, dass ich, wenn ich die Infos eines ausgewählten Mitarbeiters eingebe, das Record befülle und dann direkt zu dem bereits bestehenden ausgewählten Item hinzuspeichere!

Ich weiss, wenn man ein neues Item anlegt (mit AddObject), kann man auch ein Object hinzuspeichern! Ich will aber kein neues Item anlegen, sondern das REcord zu einem bereits bestehenden Item geben! Geht das irgendwie?


mfg

Apollonius 7. Okt 2007 11:25

Re: ListBox - Record zu Item hinzufügen
 
Das Property Objects gewährt doch auch Schreib-Zugriff. Also einfach
Delphi-Quellcode:
Listbox1.Items.Objects[i]:=Zeiger_auf_den_Record

darksign 7. Okt 2007 11:54

Re: ListBox - Record zu Item hinzufügen
 
das hab ich doch schon probiert, aber leider kommt da ein FEhler "Ungültige Typumwandlung", wenn ich es wie folgt mache:

[code]
Record.name ='Test';
Record.telefon = '12345';

listbox.items.object[i] := Record;

SirThornberry 7. Okt 2007 11:57

Re: ListBox - Record zu Item hinzufügen
 
ein Object ist intern ein Pointer zu den Daten. Ein Record ist aber eben kein Pointer.
Die einfachste Variante, wenn du mit Pointern noch nicht so fit bist, ist das du einfach ein Array für deine Records nimmst und der Array-Index 0 ist eben für den 0ten Eintrag der Listbox etc.

darksign 7. Okt 2007 12:02

Re: ListBox - Record zu Item hinzufügen
 
hmm, die Idee ist schon mal nicht schlecht, nur leider soll es möglich sein, dass man die Reihenfolge der Items in der Listbox verändern kann, d.h. ein bestimmtest Item soll z.B. in der Listbox um eine Position nach oben geschoben werden, und dann würde ja das mit dem Array nicht mehr zusammenpassen!

Gibt es keine Möglichkeit, mit der ich das REcord zu dem Item hinzuspeichern kann?

mfg

SirThornberry 7. Okt 2007 12:06

Re: ListBox - Record zu Item hinzufügen
 
du müsstest dynamsich speicher anfordern für dein Array und den Pointer auf diesen Speicher dann in der Listbox bei Object speichern. Oder besser. Du nimmst keinen Record sondern eine Klasse. Die Klasseninstanz kannst du dann auch zuweisen.

Wenn dir das nicht zusagt kannst du wieder zu der anderen Lösung mit dem Array greifen. Wenn in der Listbox ein Item verschoben wird brauchst du ja nur zeitlich auch in dem Array das Item verschieben.

Hansa 7. Okt 2007 12:14

Re: ListBox - Record zu Item hinzufügen
 
Die Objects sind genau für solche Fälle gedacht ! Aber so muss der Typ aussehen :
Delphi-Quellcode:
TMitarbeiterinfo = class(TObject)
  Adresse:String
  Telefon:String;
  ...
end;
Die Delphi-Hilfe sagt noch das :

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

var
  i: Integer;
begin
  for i := 0 to PageControl1.PageCount - 1 do
    ComboBox1.Items.AddObject(PageControl1.Pages[i].Name,
      PageControl1.Pages[i]);
  ComboBox1.ItemIndex := 0;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if (Sender is TComboBox) then
    with (Sender as TComboBox) do
      PageControl1.ActivePage := TTabSheet(Items.Objects[ItemIndex]);

end;
Das lässt sich 1:1 auf TListBox anwenden. Aber Achtung mit den Objects ! Da wird Speicher angefordert und der sollte auch wieder weg.

Noch ein Verweis auf die Delphi-Hilfe : :warn:

Zitat:

Mit der Methode AddStrings lassen sich die String-Einträge eines anderen TStrings-Objekts zu einer String-Liste hinzufügen. Wenn beide TStrings-Objekte Strings mit zugeordneten Objekten unterstützen, werden mit den Strings auch die zugehörigen Objekt-Referenzen übertragen.
Brauche bei meinen Objects auch reals usw. Bei Strings scheint das noch einfacher zu gehen.

darksign 7. Okt 2007 12:58

Re: ListBox - Record zu Item hinzufügen
 
Ok, ich glaub ich mach mir ne Klasse "Mitarbeiterinfo" mit den Membervariablen "Name, Telefon, ...", und theoretisch könnte ich doch jedesmal eine Instanz dieser Klasse zu einem Item hinzuspeichern, oder?

Aber muss ich da eigentlich jedesmal ne neue Instanz für jedes Item anlegen, oder reicht es, wenn ich nur 1 Instanz für alle Mitarbeiterdaten anlege (eigentlich kann das nicht gehen, weil dann überschreibe ich ja immer die Daten des vorherigen Mitarbeiters, oder, für mich wärs logisch, wenn jeder Mitarbeiter+Info ne eigene Instanz braucht)!

mfg

SirThornberry 7. Okt 2007 13:00

Re: ListBox - Record zu Item hinzufügen
 
Zitat:

Zitat von darksign
Ok, ich glaub ich mach mir ne Klasse "Mitarbeiterinfo" mit den Membervariablen "Name, Telefon, ...", und theoretisch könnte ich doch jedesmal eine Instanz dieser Klasse zu einem Item hinzuspeichern, oder?

Aber muss ich da eigentlich jedesmal ne neue Instanz für jedes Item anlegen, oder reicht es, wenn ich nur 1 Instanz für alle Mitarbeiterdaten anlege (eigentlich kann das nicht gehen, weil dann überschreibe ich ja immer die Daten des vorherigen Mitarbeiters, oder, für mich wärs logisch, wenn jeder Mitarbeiter+Info ne eigene Instanz braucht)!

mfg

Deine Schlussfolgerung ist richtig.

Hansa 7. Okt 2007 13:17

Re: ListBox - Record zu Item hinzufügen
 
Jedes Item kriegt zusätzlich sein Object (ist quasi Record). So ist das. Du kannst da auch z.B. Farben speichern.


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