Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objekte in Listen und deren Eigenschaften (https://www.delphipraxis.net/56978-objekte-listen-und-deren-eigenschaften.html)

TheAn00bis 14. Nov 2005 16:46


Objekte in Listen und deren Eigenschaften
 
Hi,

wenn ich so 5 Objekte erstelle und in eine TList packe:

Delphi-Quellcode:
private liste:Tlist;
//...

procedure xyz;
var test:ObjetktTyp;
    i: integer;
begin
for i:=1 to 5 do begin
  test:=ObjektTyp.create;
  test.name:='test'+inttostr(i);
  liste.add(test);
end;
end;
und hinterher den Namen jedes einzelnen abfrage, dann haben alle den Namen "test5".
Aber wie mir in dem Thread noch erklärt wurde (link), wird doch jedes mal für eine neue Karte neuer Speicher angefodert. Den Pointer zu diesem neuen Speicher pack ich dann in die Liste. Aber daraus ist doch zu schließen, dass jetzt jedes Objekt einen anderen Namen hat, oder sehe ich da irgendwas falsch? (muss ich ja, sonst würd es ja funktionieren ;))

Wie bekomme ich denn unendlich viele Instanzen hin, mit jeweils unterschiedlichen Werten in den Attributen?

RavenIV 14. Nov 2005 16:53

Re: Objekte in Listen und deren Eigenschaften
 
versuche anstelle von
Delphi-Quellcode:
test:=ObjektTyp.create;
lieber mal
Delphi-Quellcode:
test := new (ObjectTyp);

TheAn00bis 14. Nov 2005 16:59

Re: Objekte in Listen und deren Eigenschaften
 
Zitat:

Zitat von RavenIV
Delphi-Quellcode:
test := new (ObjectTyp);

Dann erscheint die Fehlermeldung "Incompatible types"; egal ob "test" vom Typ "ObjektTyp" oder vom Typ Pointer ist.

Muetze1 14. Nov 2005 17:02

Re: Objekte in Listen und deren Eigenschaften
 
@RavenIV: Wer sagt denn, dass ObjektTyp keine Klasse ist? Sonst müsste er ja schon beim Create meckern...

@TheAn00bis: Dann zeig mal bitte wie du die Namen ausgibst - der gepostet Code ist in Ordnung.

TheAn00bis 14. Nov 2005 17:09

Re: Objekte in Listen und deren Eigenschaften
 
Zitat:

Zitat von Muetze1
@TheAn00bis: Dann zeig mal bitte wie du die Namen ausgibst - der gepostet Code ist in Ordnung.

Das freut mich doch, dann war das ja schonmal nicht falsch :D.

So gebe ich die Namen aus:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
    test:ObjetktTyp;
begin
  for i:=0 to liste.count-1 do begin
  test:=liste[i];
  showmessage(test.namen);
end;
end;

oder so:

Delphi-Quellcode:
for i:=0 to liste.count-1 do begin
showmessage(TObjektTyp(Liste[i]).name);
end;

shmia 14. Nov 2005 17:14

Re: Objekte in Listen und deren Eigenschaften
 
Für Objekte gibt es übrigens die Container-Klasse TObjectList, die von TList abgeleitet ist.

SirThornberry 14. Nov 2005 17:18

Re: Objekte in Listen und deren Eigenschaften
 
@TheAn00bis: Auch dieser Teil ist fehlerfrei, steht das wirklich ganz genau so bei dir im Quelltext? Vielleicht hast du ja irgendwo nur einen Tippfehler.

TheAn00bis 14. Nov 2005 17:25

Re: Objekte in Listen und deren Eigenschaften
 
Zitat:

Zitat von shmia
Für Objekte gibt es übrigens die Container-Klasse TObjectList, die von TList abgeleitet ist.

Danke für den Tip, aber die bietet keine Vorteile, die ich gebrauchen könnte.

Zitat:

Zitat von SirThornberry
@TheAn00bis: Auch dieser Teil ist fehlerfrei, steht das wirklich ganz genau so bei dir im Quelltext? Vielleicht hast du ja irgendwo nur einen Tippfehler.

Verdammt! Oder auch nicht ;)

Nein, ist nicht der genaue Quelltext, da ich das allgemein halten wollte.
(damit das Problem schneller klar wird)

Hier der Quelltext um den es geht:


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var karte:Tkarte;
begin
  karte:=Tkarte.create(edit1.text,edit2.text);
  liste.Add(karte);
 end;

procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
    karte:Tkarte;
begin
  for i:=0 to liste.count-1 do begin
    karte:=liste[i];
    showmessage(karte.gibfrage);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  liste:=Tlist.create();
end;
end.

Hierbei habe ich natürlich edit1 und 2.text vor jedem Klicken geändert.
Wenn ich dann auf button2 klicke, erscheint in jedem Fenster dennoch das gleiche.

edit: Achja, der erste "create"-Parameter setzt die Variable, die durch "GibFrage" ausgegeben wird.

SirThornberry 14. Nov 2005 17:29

Re: Objekte in Listen und deren Eigenschaften
 
auch das sieht richtig aus *g*
Hast du eventuell im Constructor von TKarte den Namen fest eingetragen (eventuell zum testen und dann nicht zurück geändert).

noch nen kleiner Tipp:
anstelle von
Delphi-Quellcode:
var karte:Tkarte;
begin
  karte:=Tkarte.create(edit1.text,edit2.text);
  liste.Add(karte);
kannst du auch gleich
Delphi-Quellcode:
  liste.Add(Tkarte.create(edit1.text,edit2.text));
schreiben.

Du kannst ja mal schauen welchen Werte "karte.name" nach
Delphi-Quellcode:
var karte:Tkarte;
begin
  karte:=Tkarte.create(edit1.text,edit2.text);
  liste.Add(karte);
hat.

shmia 14. Nov 2005 17:31

Re: Objekte in Listen und deren Eigenschaften
 
Zitat:

Zitat von TheAn00bis
Zitat:

Zitat von shmia
Für Objekte gibt es übrigens die Container-Klasse TObjectList, die von TList abgeleitet ist.

Danke für den Tip, aber die bietet keine Vorteile, die ich gebrauchen könnte.

Doch, der Konstruktor von TObjectList hat den Parameter AOwnsObjects. Falls dieser True ist (in deinem Fall wohl sinnvoll), dann werden im Destruktor von TObjectList alle Items gefreed.
sozusagen: "Create And Forget"

Hansa 14. Nov 2005 17:34

Re: Objekte in Listen und deren Eigenschaften
 
Und es gibt ab TStrings noch die Eigenschaft Objects. Nenne ein Element doch Pik-As und verpaße dem zugehörigen Object einfach ein passendes Image. :-D

TheAn00bis 14. Nov 2005 17:40

Re: Objekte in Listen und deren Eigenschaften
 
:(
Zitat:

Zitat von SirThornberry
auch das sieht richtig aus *g*
Hast du eventuell im Constructor von TKarte den Namen fest eingetragen (eventuell zum testen und dann nicht zurück geändert).

[...]

Du kannst ja mal schauen welchen Werte "karte.name" nach
Delphi-Quellcode:
var karte:Tkarte;
begin
  karte:=Tkarte.create(edit1.text,edit2.text);
  liste.Add(karte);
hat.

1) Hab ich nicht. :(
2) Dann erscheint das, was ich auch eingegeben habe, also richtig...

Zitat:

Zitat von shmia
Zitat:

Zitat von TheAn00bis
Zitat:

Zitat von shmia
Für Objekte gibt es übrigens die Container-Klasse TObjectList, die von TList abgeleitet ist.

Danke für den Tip, aber die bietet keine Vorteile, die ich gebrauchen könnte.

Doch, der Konstruktor von TObjectList hat den Parameter AOwnsObjects. Falls dieser True ist (in deinem Fall wohl sinnvoll), dann werden im Destruktor von TObjectList alle Items gefreed.
sozusagen: "Create And Forget"

Okay, geändert!

Zitat:

Zitat von Hansa
Und es gibt ab TStrings noch die Eigenschaft Objects. Nenne ein Element doch Pik-As und verpaße dem zugehörigen Object einfach ein passendes Image. :-D

Das sind keine Spielkarten... Und wofür brauche ich die Eigenschaft Objects?

Hier nochmal die komplette (geänderte) Unit:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;
  Liste: TObjectList;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var zahl:integer;
begin
zahl:=liste.Add(Tkarte.create(edit1.text,edit2.text));
showmessage(TKarte(liste[zahl]).gibFrage);
end;

procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
    karte:Tkarte;
begin
for i:=0 to liste.count-1 do begin
karte:=TKarte(liste[i]);
showmessage(karte.gibfrage);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
liste:=TObjectList.create();
end;


end.

TheAn00bis 14. Nov 2005 18:03

Re: Objekte in Listen und deren Eigenschaften
 
Ich glaub es nicht...

An dem Code war wirklich alles richtig.

Ich hatte aber in der Klasse TKarte die Variablen folgendermaßen deklariert:

Delphi-Quellcode:
implementation


var

Frage,
Antwort:String;

//..
procedure ...
Diese scheinen dann public zu sein - was mir nicht bewusst war -
und haben sich wohl immer gegenseitig überschrieben.

Dieser Fehler ist mir vor einiger Zeit schon mehrere male passiert.
Tut mir echt Leid, dass ich aus so einem Mist, so einen Thread mache...

Aber immerhin weiß ich es ja jetzt! :D

SirThornberry 14. Nov 2005 18:05

Re: Objekte in Listen und deren Eigenschaften
 
diese Variablen sind nicht Public sondern Global und genau aus dem Grund was dir passiert ist sind diese Globalen so unbeliebt. Eine Variable gehört in eine Klasse (wenn sie mit der Klasse in Zusammenhang steht) und nicht in die Unit pur.


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