![]() |
TObjectList
Hi Leute!
Ich programmiere gerade ein Spiel und suche eine Komponente, wo ich Objekte rein"packen" kann und die dann über einen ItemIndex (oder so ähnlich). Wie z.B. bei der ImageList: -> Ich lade ein Bild rein und kann es dann über einen Index aufrufen Könnte man vielleicht eine ObjectList nehmen und wenn ja, kann mir jemand erklären, wie man das macht? LG & DiV twityzuz |
AW: TObjectList
Warum versuchst du es nicht einfach? :roll:
Delphi-Quellcode:
Wobei TMyObjectType die Klasse ist, deren Objekte du reinpacken willst.
uses
Generics.Collections; var MyList: TObjectList<TMyObjectType>; begin MyList := TObjectList<TMyObjectType>.Create(True); try MyList.Add(TMyObjectType.Create(...)); ... MyList[0]... finally FreeAndNil(MyList); end; |
AW: TObjectList
Du hast schon die richtige Komponent gefunden :) sinnvoll wäre es, wenn du dir eine Demo-Anwendung schreibst, um zu testen, wie es funktioniert. Wir können dich auch nur auf die Hilfe verweisen, da es nicht nur zwei Methoden gibt :) Besonders an TObjectList ist aber, dass diese als Besitzer von den hinzugefügten Objekten fungieren kann, d.h. wenn du z.B. ein Remove machst, dann wird das entfernte Objekt automatisch freigegeben, oder wird die ObjectList freigegeben werden alle darin enthaltenen Objekte auch freigegeben. Dieses "Owner"-Verhalten kannst du über den Konstruktor steuern.
-- Edit: Der Vorschlag von jaenicke sollte dann zum Einsatz kommen, wenn du eine typsichere Programmierung haben willst, denn sonst musst du unter Umständen sehr oft casten. Die generischen Listen sind halt erst ab Delphi 2009 verfügbar. |
AW: TObjectList
Erstmal danke für eure hilfe:D
Also ich habe Delphi 7. Aber wie deklariere ich oder erstelle jetzt eine ObjectList?? *verzweifle* LG |
AW: TObjectList
Genauso, nur ohne die Typangabe in spitzen Klammern dahinter.
|
AW: TObjectList
Ich weiß nicht, ob es im D7 schon eine TObjectList gab.
Du kannst sonst genau so gut eine TList nutzen. Der einzige Unterschied ist dass die Objekte nicht automatisch aufgelöst werden können, wenn sie aus der Liste entfernt werden. Man muss dann die entfernten Objekte ggf. explizit mit MyItemObject.Free auflösen. |
AW: TObjectList
Zitat:
|
AW: TObjectList
Unter Delphi 7 gibt es bereits TObjectList (Unit Contnrs).
|
AW: TObjectList
Zitat:
Delphi-Quellcode:
:?::?::?:
uses
Generics.Collection; Wenn ich es am Anfang der Unit einfach einfüge, meint Delphi, dass ich einen Programmierfehler mache... |
AW: TObjectList
Nimm die Unit Contnrs und einfach TObjectList.
|
AW: TObjectList
Zitat:
Ich weiß, dass mag für euch alle jetzt ziemlich dumm rüberkommen, aber ich kann euch einfach nicht folgen. Ich programmiere noch nicht so lange, hinzu kommt, dass ich auch ziemlich unter Druck stehe, weil ich das Programm bald abgeben muss... |
AW: TObjectList
Statt "Generics..." einfach "Contnrs" verwenden.
Die Unit Generics... ist erst in den aktuellen Delphi-Versionen verfügar. Da sind quasi die Komponenten mit den Spitzen Klammern drin definiert (ähh, na ja, so ähnlich jedenfalls...). Also Generics... und spitze Klammern musst Du weg lassen und dafür die Unit Contnrs verwenden. |
AW: TObjectList
Sinnfreier Beispielcode:
Delphi-Quellcode:
uses Windows, SysUtils, {usw.} Contnrs;
... var Liste: TObjectList; i: integer; EineKlasse: TEineKlasse; begin Liste := TObjectList.Create; try for i := 0 to 9 do begin EineKlasse := TEineKlasse.Create; EineKlasse.Bla := Blubb; Liste.Add(EineKlasse); end; finally Liste.Free; end; end; |
AW: TObjectList
@DeddyH: Das verstehe ich leider nicht :(:(
Jetzt habe ich die ObjectList schonmal. Jetzt die Frage: Wie kann ich Objekte reinladen (ich will euch ja nicht auf die nerven gehen, aber es wäre cool, wenn ihr es für BLÖDE erklären könntet:D) |
AW: TObjectList
Das habe ich doch gerade gezeigt. Objektliste erstellen, Objekt erstellen und mit TObjectList.Add() der Liste hinzufügen.
|
AW: TObjectList
Delphi-Quellcode:
So habe ich das jetzt gemacht, dann kommt eine Fehlermeldung von Windows:
MyList.Add(BitBtn47);
Zitat:
|
AW: TObjectList
Du hast MyList nicht erstellt bevor du es verwendet hast.
|
AW: TObjectList
Wenn es einen Moment Zeit hat: ich schreibe gerade ein kleines Beispielprogramm in Delphi 7.
|
AW: TObjectList
Jetzt funktionierts; Aber wie benutze ich das Teil jetzt? Also mit Index und so?
|
AW: TObjectList
Trotz rotem Kasten, wegen der vielen Mühe...
Sieht so aus, als ob Du Deine Liste zwar definiert aber nicht instanziiert (erzeugt) hast. Setze einen Haltepunkt in Deine Zeile und sieh Dir MyList an. Wird vermutlich NIL sein. Du musst Deiner List-Variablen vorher noch eine Liste zuweisen:
Delphi-Quellcode:
Jetzt kannst Du mit "der Liste" (besser gesagt mit dem Objekt der Klasse "TObjectList", das in der Variable MyList zugeweisen ist) arbeiten.
MyList := TObjectList.Create;
Im Spachgebrauch sagt man nun, MyList ist eine Liste. Ihr muss aber zuvor ein Instanz einer List (das was mit Create irgendwo im Hauptspeicher erzeugt wird) zugewiesen werden. Vorher ist NIL (also nichts) zugewiesen und man kann die Liste nicht benutzen. |
AW: TObjectList
Jaja das mit dem .Create habe ich ja jetzt gemacht (ich bin auch blöd^^)
Aber wie kann ich jetzt zum Beispiel auf die BitBtns zugreifen? |
AW: TObjectList
Liste der Anhänge anzeigen (Anzahl: 1)
So, hier mein Demoprogramm.
|
AW: TObjectList
Das hilft mir iwie nicht weiter.
Nochmal: Ich habe viele verschiedene BitBtns. Jetzt soll z.B. eine Zufallszahl ermittelt werden, z.B. 45. Jetzt soll BitButton45 zerstört werden.
Delphi-Quellcode:
So, das möchte ich jetzt mit der OList machen.
var i:integer;
begin i:=random(50); {Jetzt soll BitBtn[i] ausgewählt werden} BitButton[i].Destroy; Frage: Wie? |
AW: TObjectList
Einfach aus der Liste löschen. Der Konstruktor der Liste hat einen Parameter namens OwnsObjects, welcher per Vorgabe auf true steht. Das sorgt dafür, dass die Objekte beim Löschen aus der Liste automatisch freigegeben werden.
BTW: Niemals(!!!) Destroy direkt aufrufen, sondern immer Free. |
AW: TObjectList
@twityzuz: geht mal in dein Profil
![]() und stell' dort die passende "Delphi"-Version ein. Du nutzt doch Lazarus? (falls ich das nicht falsch gesehn hatte) Einige Dinge sind in Lazarus/FreePascal ein bissl anders, als in Delphi und auch in den verschiedenen Delphi-Versionen unterscheidet sich manches. [add] siehste ... jetzt hab ich mich doch verguckt. :oops: Aber bei Delphi 7 hätte man sich z.b. die Generics sparen können und hätten dich nicht damit verwirrt. :angle2: |
AW: TObjectList
Delphi 7 wissen wir ja jetzt, aber trotzdem kann es nicht verkehrt sein, die Version im Profil anzuzeigen.
|
AW: TObjectList
Gerade heute gemacht:
![]() |
AW: TObjectList
Und weshalb verwendest Du da TList und nicht gleich TObjectList?
|
AW: TObjectList
Weil mir nicht eingefallen ist, dass es TObjectList gibt. Und jetzt habe ich keine Lust mehr es umzuschreiben. ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 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