Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ListBox Wert zuweisen (https://www.delphipraxis.net/33081-listbox-wert-zuweisen.html)

dR4g0N 1. Nov 2004 14:51


ListBox Wert zuweisen
 
Also mit ListBox1.Items.Strings[i] bekomme ich ja sozusagen die Caption von dem markierten ListBoxeintrag heraus. Jetzt meine Frage kann ich zusätzlich jedem Eintrag in einer Listbox einen anderen String zuweisen, sodass wenn ich es markiere in Edit der vorher angegebene String erscheint?

Aenogym 1. Nov 2004 14:53

Re: ListBox Wert zuweisen
 
hi,

wenn ich dich richtig verstehe, willst du einem string in der listbox einen wert zuweisen. das geht genauso wie das abrufen. nur eben anders herum ;)

Delphi-Quellcode:
listbox1.items[i] := edit1.text;
Aenogym

Dax 1. Nov 2004 14:55

Re: ListBox Wert zuweisen
 
Mein Vorschlag: Ein dynamisches Array mit der Länge der TListBox.Items.Count.
Wenn nun ein Item selektiert wird, schreibst du ein Array[TListBox.ItemIndex] oder liest daraus aus.
Da TStrings leider nicht für jeden String in der Liste auch noch eine Data-Eigenschaft hat (wie TTreeView), wüsste ich keine andere Lösung, ausser vielleicht einer anderen Stringlist, doch im Prinzip ist es das selbe.

Muetze1 1. Nov 2004 15:00

Re: ListBox Wert zuweisen
 
Moin!

Keinen Pointer, aber ein Objects[] Array bietet jeder TStrings Nachfahre und daher würde ich das nehmen anstatt noch eine weitere Liste zu verwalten.

MfG
Muetze1

dR4g0N 1. Nov 2004 15:36

Re: ListBox Wert zuweisen
 
Zitat:

Zitat von Aenogym
hi,

wenn ich dich richtig verstehe, willst du einem string in der listbox einen wert zuweisen. das geht genauso wie das abrufen. nur eben anders herum ;)

Delphi-Quellcode:
listbox1.items[i] := edit1.text;
Aenogym

nein leider net, also in der listbox sind schon die verschienden items. nur möchte ich jetzt jedem item noch einen zweiten string zuweisen. und wenn er markiert wird, dass der 2 stringwert in einem editfeld erscheint.

Mal nen kleines Bsp:

ListBox1:

Sandra
Julia
Andrea
Marlene

-----

Wenn ich jetzt einen Eintrag auswähle, soll jetzt in Edit1 der passende Nachname erscheinen, denn ich vorher zugewiesen hab.



EDIT:

Achja wenn ihr eine andere Möglichkeit habt, also mit anderen Komponenten ist auch gut. Nur vom prinzip sollte es ungefähr das gleiche sein.

rudi_ 1. Nov 2004 16:09

Re: ListBox Wert zuweisen
 
hi

wie muetze1 schon gesagt hat, ich würde auf den Objects array zurückgreifen

hier mal ein kleines beispiel:


du deklarierst dir ein Objekt:

Delphi-Quellcode:
type
  TInfoObj = class(TObject)
  private
    FNachname: string;
  published
    property Nachname: string
      read FNachname write FNachname;
end;
wenn du jetzt deine Namen eintragen willst, ginge das z.b. folgendermaßen:

Delphi-Quellcode:
procedure eingabe(Vorname,Nachname: string)
var
  Eintrag: TInfoObj;
begin
  Eintrag := TInfoObj.Create;
  Eintrag.Nachname := Nachname;
  ListBox1.Items.AddObject(Vorname,Eintrag);
end;
damit erhälst du jeweils einen Eintrag in der Listbox mit dem Vornamen und gleichzeitig wurde da noch das Objekt vom typ TInfoObj mitgespeichert, das wiederrum den Nachnamen enthält (natürlich können dann auch genauso anderen Sachen gespeichert werden)


eine schleife zum ausgeben der Vor-/Nachnamen könnte z.B. so aussehen:

Delphi-Quellcode:
procedure ausgabe;
var
  Eintrag: TInfoObj;
  i: integer;
begin
  for i := 0 to ListBox1.Count -1 do
  begin
    Eintrag := ListBox1.Items.Objects[i];
    showmessage('Vorname: '+ListBox1.Items.Strings[i]+' Nachname: '+Eintrag.Nachname);
  end;
end;
diese prozedur liest in einer Schleife alle einträge aus und gibt jeweils den Vornamen wie gehabt aus der ListBox aus und holt sich zusätzlich noch das mit-eingetragene Objekt vom typ TInfoObj und liest die .Nachname property daraus aus. Man sollte natürlich noch als Sicherheit später noch überprüfen, ob Eintrag <> nil ist, aber es geht ja erstmal nur ums prinzip.

Ausserdem: wenn du ListBox1.Clear aufrufst werden zwar alle Einträge gelöscht und auch die Verweise auf die Objekte; diese bleiben allerdings im Speicher.

also müsste man zum leeren der Liste eher sowas hier verwenden:

Delphi-Quellcode:
procedure ClearList;
var
  i: integer;
begin
  for i := 0 to ListBox1.Count - 1 do
  begin
    TInfoObj(ListBox1.Items.Objects[i]).Free;
  end;
  ListBox1.Items.Clear;
end;
damit werden erst alle Objekte sauber aus dem speicher entfernt, bevor auch die Verweise darauf entfernt werden

dR4g0N 1. Nov 2004 16:23

Re: ListBox Wert zuweisen
 
ahh sry völlig übersehen. THX @ euch allen, werd es mir nachher mal genauer angucken, muss nu arbeiten.

dR4g0N 1. Nov 2004 22:00

Re: ListBox Wert zuweisen
 
Habs jetzt mal ausprobiert, aber wenn ich jetzt einen Nachnamen zuweisen möchte bekomme ich eine Fehlermeldung die ich mir nicht erklären kann.


Code:
[Fehler] Unit1.pas(40): Undefinierter Bezeichner: 'ListBox1'
[Fehler] Unit1.pas(40): Operator oder Semikolon fehlt
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden

rudi_ 2. Nov 2004 16:56

Re: ListBox Wert zuweisen
 
der code war eigentlich nur als beispiel gedacht
"ListBox1" funktioniert ja nur, wenn du auf deiner Form auch eine ListBox mit dem namen ListBox1 hast. Dazu kommt noch, dass ich 1) die funktionen nicht getestet habe und das aus dem Kopf heraus geschrieben habe (sollte allerdings funktionieren) und 2) müsstest du die Funktionen ausgabe() und eingabe() auch noch in dein Formobjekt mit einbinden.


z.b.:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;


type
  TInfoObj = class(TObject)
  private
    FNachname: string;
  published
    property Nachname: string
      read FNachname write FNachname;
end;


type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure eingabe(Vorname,Nachname: string);
    procedure Ausgabe;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.eingabe(Vorname,Nachname: string);
var
  Eintrag: TInfoObj;
begin
  Eintrag := TInfoObj.Create;
  Eintrag.Nachname := Nachname;
  ListBox1.Items.AddObject(Vorname,Eintrag);
end;

procedure TForm1.ausgabe;
var
  Eintrag: TInfoObj;
  i: integer;
begin
  for i := 0 to ListBox1.Count -1 do
  begin
    Eintrag := TInfoObj(ListBox1.Items.Objects[i]);
    showmessage('Vorname: '+ListBox1.Items.Strings[i]+' Nachname: '+Eintrag.Nachname);
  end;
end;


end.

hier fehlt natürlich noch irgendwas, was das ganze auch wirklich einliest (z.b. zwei textfelder für vor/nachname und ein Button, der im OnClick ereigniss die Eingabe prozedur aufruft und die werte der beiden Textfelder als parameter übergibt) und noch ein weiterer button zur ausgabe




ps: in der variante ist auch der fehler mit dem semikolon behoben und noch ein weiterer in der ausgabeprozedur


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 Uhr.

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