Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Werte aus einer Liste von Listen auslesen


dowo - Mi 28.01.04 11:50
Titel: Werte aus einer Liste von Listen auslesen
Hallo,

Ich habe (hoffentlich) eine TList von TLists erzeugt, in der wie in einer Matrix die Werte
100 400
200 500
stehen. Jetzt würde ich gerne wissen, wie ich jede einzelne dieser Zahlen (bzw. Speicherpositionen) ansprechen kann.
Ich bin relativ neu bei Delphi, und falls mir jemand sonstige Tipps zu dem unten geschriebenen Code geben kann, bin ich auch sehr dankbar.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;


type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;


var
  Form1: TForm1;
  Liste1,Liste2: TList;
  A:^integer;
  Poi:^integer;
  Zahl:integer;
  x:integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
  Liste1:=TList.Create;
  Liste2:=TList.Create;
  new(A);
  A^:=100;
  Liste2.Add(A);
  new(A);
  A^:=200;
  Liste2.Add(A);
  Liste1.Add(Liste2);
  Liste2.free;

  Liste2:=TList.Create;
  new(A);
  A^:=400;
  Liste2.Add(A);
  new(A);
  A^:=500;
  Liste2.Add(A);
  Liste1.Add(Liste2);

  for i:=0 to Liste1.count-1 do
  begin
  Poi:=Liste1.Items[i];  //Man bekommt nicht die einzelnen Elemente
  Zahl:=Poi^;
  showmessage(inttostr(Zahl));
  end;
  Liste1.free;
  Liste2.free;
end;


Moderiert von user profile iconUGrohne: Topic verschoben und Tags korrigiert


Tana´Ri - Mi 28.01.04 15:49

Wenn ichs recht versteh fügst du Liste1 zwei items an. diese sind selbst
Listen mit je 2 items.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
for i:=0 to 1 do // List 1 or 1 Dimension
 for j:=0 to 2 do // list 2 or Item of list1 or 2 dimension
  begin
   P := (List1.Items[i] as TList).Items[j];
   ShowMessage(IntToStr(P^));
 end;


i hope it works ;-)


Anonymous - Mi 28.01.04 16:09

Da gibst du die Liste wieder frei:


Delphi-Quelltext
1:
2:
  Liste1.Add(Liste2);
  Liste2.free;


Wenn du danach aber nochmal darauf zugreifen willst, gibt es sie natürlich nichtmehr.
Das solltest du am Ende tun. Außerdem sollten auch die Elemente der Listen wieder aus dem speicher entfernt werden (dispose)
Poi sollte dann noch vom Typ TList sein.


dowo - Mi 28.01.04 16:40

Tana´Ri hat folgendes geschrieben:
Wenn ichs recht versteh fügst du Liste1 zwei items an. diese sind selbst
Listen mit je 2 items.

Du hast mein Problem genau richtig erkannt, und mir mit der Synthax schon mal eine wertvollen Tip gegeben, allerdings kommt, wenn ich diesen Code richtig einfüge, der Fehler "Operator ist auf diesen Operandentypen nicht anwendbar" beim Compilieren.
Was ist denn noch falsch daran?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
for i:=0 to 1 do // List 1 or 1 Dimension
 for j:=0 to 2 do // list 2 or Item of list1 or 2 dimension
  begin
   P := (List1.Items[i] as TList).Items[j];
   ShowMessage(IntToStr(P^));
 end;


i hope it works ;-)


Tana´Ri - Mi 28.01.04 17:01

Versuch mal das

P := (List1.Items[i]^ as TList).Items[j];
OR
P := TList(List1.Items[i]^).Items[j];


dowo - Mi 28.01.04 19:07
Titel: Problem gelöst
Hi Obschtkuche und Tana'Ri,

mit der Hilfe von Euch beiden habe ich es geschafft mein Problem zu lösen. Weitere Fragen folgen sicherlich. Aber vielen Dank für die schnelle Beratung.

Hier der Code:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
var
  Form1: TForm1;
  Liste1,Liste2,Liste3,TempListe: TList;
  A:^integer;
  Zahl:integer;
  P:^integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
  Liste1:=TList.Create;

  Liste2:=TList.Create;
  new(A);
  A^:=1;
  Liste2.Add(A);
  new(A);
  A^:=2;
  Liste2.Add(A);
  new(A);
  A^:=3;
  Liste2.Add(A);
  Liste1.Add(Liste2);

  Liste3:=TList.Create;
  new(A);
  A^:=40;
  Liste3.Add(A);
  new(A);
  A^:=50;
  Liste3.Add(A);
  Liste1.Add(Liste3);

 for i:=0 to Liste1.count-1 do
 begin
   TempListe:=Liste1.Items[i];
   for j:=0 to TempListe.count-1 do
   begin
     P := TempListe.items[j];
     ShowMessage(IntToStr(P^));
   end;
 end;

  Liste1.free; Liste2.free; Liste3.free;
end;

end.