Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   TObjectList (https://www.delphipraxis.net/160695-tobjectlist.html)

twityzuz 26. Mai 2011 16:10

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

jaenicke 26. Mai 2011 16:17

AW: TObjectList
 
Warum versuchst du es nicht einfach? :roll:
Delphi-Quellcode:
uses
  Generics.Collections;

var
  MyList: TObjectList<TMyObjectType>;
begin
  MyList := TObjectList<TMyObjectType>.Create(True);
  try
    MyList.Add(TMyObjectType.Create(...));
    ...
    MyList[0]...
  finally
    FreeAndNil(MyList);
  end;
Wobei TMyObjectType die Klasse ist, deren Objekte du reinpacken willst.

s.h.a.r.k 26. Mai 2011 16:19

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.

twityzuz 26. Mai 2011 16:22

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

jaenicke 26. Mai 2011 16:26

AW: TObjectList
 
Genauso, nur ohne die Typangabe in spitzen Klammern dahinter.

stahli 26. Mai 2011 16:27

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.

s.h.a.r.k 26. Mai 2011 16:29

AW: TObjectList
 
Zitat:

Zitat von jaenicke (Beitrag 1103091)
Genauso, nur ohne die Typangabe in spitzen Klammern dahinter.

Und Generics gabs "damals" leider auch noch nicht :stupid:

DeddyH 26. Mai 2011 16:30

AW: TObjectList
 
Unter Delphi 7 gibt es bereits TObjectList (Unit Contnrs).

twityzuz 26. Mai 2011 16:32

AW: TObjectList
 
Zitat:

Zitat von jaenicke (Beitrag 1103091)
Genauso, nur ohne die Typangabe in spitzen Klammern dahinter.

Aber was bringt mir
Delphi-Quellcode:
uses
Generics.Collection;
:?::?::?:

Wenn ich es am Anfang der Unit einfach einfüge, meint Delphi, dass ich einen Programmierfehler mache...

DeddyH 26. Mai 2011 16:34

AW: TObjectList
 
Nimm die Unit Contnrs und einfach TObjectList.

twityzuz 26. Mai 2011 16:36

AW: TObjectList
 
Zitat:

Zitat von DeddyH (Beitrag 1103098)
Unit Contnrs und einfach TObjectList.

Was möchten mir diese weisen Worte sagen?
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...

stahli 26. Mai 2011 16:37

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.

DeddyH 26. Mai 2011 16:41

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;

twityzuz 26. Mai 2011 16:43

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)

DeddyH 26. Mai 2011 16:44

AW: TObjectList
 
Das habe ich doch gerade gezeigt. Objektliste erstellen, Objekt erstellen und mit TObjectList.Add() der Liste hinzufügen.

twityzuz 26. Mai 2011 16:53

AW: TObjectList
 
Delphi-Quellcode:
MyList.Add(BitBtn47);
So habe ich das jetzt gemacht, dann kommt eine Fehlermeldung von Windows:
Zitat:

Zugriffsverletzung bei Adresse 004133DF in Modul 'Project2.exe'. Lesen von Adresse 00000008.
Was jetzt?

jaenicke 26. Mai 2011 16:56

AW: TObjectList
 
Du hast MyList nicht erstellt bevor du es verwendet hast.

DeddyH 26. Mai 2011 17:00

AW: TObjectList
 
Wenn es einen Moment Zeit hat: ich schreibe gerade ein kleines Beispielprogramm in Delphi 7.

twityzuz 26. Mai 2011 17:02

AW: TObjectList
 
Jetzt funktionierts; Aber wie benutze ich das Teil jetzt? Also mit Index und so?

stahli 26. Mai 2011 17:04

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:
MyList := TObjectList.Create;
Jetzt kannst Du mit "der Liste" (besser gesagt mit dem Objekt der Klasse "TObjectList", das in der Variable MyList zugeweisen ist) arbeiten.
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.

twityzuz 26. Mai 2011 17:09

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?

DeddyH 26. Mai 2011 17:11

AW: TObjectList
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, hier mein Demoprogramm.

twityzuz 26. Mai 2011 17:18

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:
var i:integer;
begin
i:=random(50);
{Jetzt soll BitBtn[i] ausgewählt werden}
BitButton[i].Destroy;
So, das möchte ich jetzt mit der OList machen.
Frage: Wie?

DeddyH 26. Mai 2011 17:25

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.

himitsu 26. Mai 2011 17:28

AW: TObjectList
 
@twityzuz: geht mal in dein Profil
http://www.delphipraxis.net/profile.php?do=editprofile
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:

DeddyH 26. Mai 2011 17:29

AW: TObjectList
 
Delphi 7 wissen wir ja jetzt, aber trotzdem kann es nicht verkehrt sein, die Version im Profil anzuzeigen.

Luckie 26. Mai 2011 18:46

AW: TObjectList
 
Gerade heute gemacht: http://www.michael-puff.de/Programmi...utoRunsCls.pas

DeddyH 26. Mai 2011 18:52

AW: TObjectList
 
Und weshalb verwendest Du da TList und nicht gleich TObjectList?

Luckie 26. Mai 2011 18:54

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