Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Einen Haufen Objekte verwalten (https://www.delphipraxis.net/46840-einen-haufen-objekte-verwalten.html)

Michael_Bayer 1. Jun 2005 13:49


Einen Haufen Objekte verwalten
 
Hallo.
Ich hab hier ein Projekt, in dem zur Laufzeit viele Objekte dyn. erzeugt werden.
Jetzt stellt sich die Frage, wie ich die Verwalten soll.

Ich würde da ein dynamisches Array nehmen und immer um eins größer werden lassen, wenn ein neues Objekt dazu kommt.
Nun kommt es in dem Projekt vor, dass Objekte auch zur Laufzeit wieder verschwinden.
Hier würde ich den entsprechenden Eintrag im Array einfach nur nil'en.
Je nach dem wieviele Objekte erstellt/grlöscht werden, dürfte das Array nach einiger Zeit aussehen, wie ein schweizer Käse. (und evtl irgendwann mal überlaufen)

Ist das sinnvoll das so zu machen oder sollte ich eine Art "Controllerobjekt" machen, dass die einzelnen Objekte in sich trägt und ab und zu mal eine Art "Wartung" durchführt und die ge'nil'ten Einträge entfernt und die Objekte aufrücken lässt (und evtl. einen Index setzt)

Oder vielleicht ganz anders?

Gruß und danke!

franktron 1. Jun 2005 13:54

Re: Einen Haufen Objekte verwalten
 
Warum brauchst du überhaupt ein array oder sowas ich erstelle die einfach

Delphi-Quellcode:
With TButton.Create do
Begin
  Caption:='xxx';
  Name='B_1';
End;
Und Spreche die dann mit Findcomponent an

alcaeus 1. Jun 2005 13:56

Re: Einen Haufen Objekte verwalten
 
Hallo Michael,

guck dir mal die Delphi-Referenz durchsuchenTObjectList an. Darin kannst du Objekte jeglichen Typs (solang sie von TObject abgeleitet sind) speichern.

Greetz
alcaeus

barf00s 1. Jun 2005 13:57

Re: Einen Haufen Objekte verwalten
 
@franktron

with TButton.Create do begin
...
Parent := Self; // oder was auch immer dein parent war, panel, form, frame, ...
...

hast vergessen :)

Tyrael Y. 1. Jun 2005 13:58

Re: Einen Haufen Objekte verwalten
 
Versteh ich dich richtig...du erzeugst Objekte und lässt sie rumliegen einfach so??

bzw. sidn deine Objekte alle global :shock: ?

weil normal wäre...
Delphi-Quellcode:
function MyFunction(.....): TIrgendwas;
var
...
 EineInstanz: TMyObject;
...
begin
  ...
  EineInstanz := TMyObject.Create
  try
   .....
   .....
  finally
   EineInstanz.free;
  end;
end;
man instanziert ein Objejt und sobald man es nicht braucht, weg damit...
oder hab ich dich ganz falsch verstanden?

Gruß

Michael_Bayer 1. Jun 2005 14:02

Re: Einen Haufen Objekte verwalten
 
Zitat:

Zitat von Tyrael Y.
Versteh ich dich richtig...du erzeugst Objekte und lässt sie rumliegen einfach so??

bzw. sidn deine Objekte alle global :shock: ?

weil normal wäre...
...code...

man instanziert ein Objejt und sobald man es nicht braucht, weg damit...
oder hab ich dich ganz falsch verstanden?

Gruß

Ja die Objekte sind global, denn das sind halt meine, mit daten gefütterten, Objekte. (Die liegen einfach rum und warten darauf, dass man was mit ihnen macht :))

EDIT: @alcaeus: TObjectList klingt gut..Danke!

jim_raynor 1. Jun 2005 14:06

Re: Einen Haufen Objekte verwalten
 
Zitat:

Zitat von franktron
Warum brauchst du überhaupt ein array oder sowas ich erstelle die einfach

Delphi-Quellcode:
With TButton.Create do
Begin
  Caption:='xxx';
  Name='B_1';
End;
Und Spreche die dann mit Findcomponent an

Erstes ist es verdammt langsam und zweitens vermute ich mal, dass er keine Visuellen Objekte hat.

Um wirklich viele Objekte zu verwalten ist TObjectList vermutlich am besten.

franktron 1. Jun 2005 15:21

Re: Einen Haufen Objekte verwalten
 
Zitat:

Zitat von barf00s
@franktron

with TButton.Create do begin
...
Parent := Self; // oder was auch immer dein parent war, panel, form, frame, ...
...

hast vergessen :)

Ja wahr etwas zu stark vereinfacht

@Tyrael Y.

Ja sie liegen nur so rum

alzaimar 1. Jun 2005 15:34

Re: Einen Haufen Objekte verwalten
 
Nochmal für mich als Rentner zum Mitschreiben:
Du hast also tierisch viele Objekte, die Du ... wie erzeugst? So etwa?
Delphi-Quellcode:
...
  TMyObject.Create
...
Oder wie?
Also, ich habe bei mir, wenn überhaupt, immer eine Liste von Objekten. Dann habe ich eine Funktion, die mir ein neues Objekt liefert. In der Funktion speichere ich das Objekt dann in einer TList ab. Wozu eigentlich dynamische Arrays? Ist doch Murks. Dann noch eine, die eine Instanz wieder freigibt. Wenn Du richtig abschleimen willst, dann kannst Du ja noch davon ausgehen, das die Objekte 'wissen', das sie in einer Liste gespeichert werden, also ähnlich einer Collection:

Delphi-Quellcode:
Constructor TMyObject.Create;
Begin
  Inherited;
  aMyObjectList.Add (Self);
  ...
End;

Destructor TMyObject.Destroy;
Begin
  aMyObjectList.Remove (Self);
  ...
  Inherited;
End;

Procedure FinalizeObjects;
Var
  i : Integer;
Begin
  While aMyObjectList.Count > 0 do TMyObject (aMyObjectList).Free;
  aMyObjectList.Free;
End;

Initialization
  aMyObjectList := TList.Create;
Finalization
  FinalizeObjects;
end.
Nur mal so: Gewöhn Dir doch mal an, soweit möglich, die vorhandenen Delphi-Klassen zu nehmen, die sind echt praktisch. Wenn man sich mal dran gewöhnt hat, machen die einem das Leben sogar einfacher.

P.S: TObjectList gibts wohl erst *nach* D6, oder? Ich habs jedenfalls nicht...

barf00s 1. Jun 2005 15:36

Re: Einen Haufen Objekte verwalten
 
TObjectList findest in der Unit "Contnrs" .sprich. Containers

alzaimar 1. Jun 2005 16:02

Re: Einen Haufen Objekte verwalten
 
Jips bei D6 nich (warte, nicht weggehen, isch gugg ma)... Ach neee, da is ja die Sau! Danke!

Michael_Bayer 1. Jun 2005 16:06

Re: Einen Haufen Objekte verwalten
 
Im Prinzip wollte ich sowas wie TObjectList mit records machen (ich kannte ja TObjectList noch nicht)
-> TObjectList ist ja so geil .. sogar .sort geht da :firejump:

barf00s 1. Jun 2005 16:07

Re: Einen Haufen Objekte verwalten
 
mit records wär das auch nich weiter schwer :)
aber mit dieser ObjectList sicher einfacher :P

r2c2 1. Jun 2005 16:09

Re: Einen Haufen Objekte verwalten
 
N bisschen spät, weil mir mein rechner abgeschmiert is, aber hier mein Post:
Zitat:

Zitat von Michael_Bayer
Ich würde da ein dynamisches Array nehmen und immer um eins größer werden lassen, wenn ein neues Objekt dazu kommt.

Schlag dir das mit dem dynamischen Array lieber aus dem Kopf. Jedesmal, wenn du diesen um 1(eins) erhöhst, passiert nämlich folgendes:
- ein neuer Array, der um 1 größer ist wird erstellt
- Daten werden kopiert
- alter Array wird gelöscht
==> extrem "Rescourcensparend" :mrgreen:
Man sollte also, wenn man dynamische Arrays verwendet, diesen immer um einen größeren Wert erhöhen, aber eben seltener.

In deinem Fall ist also eine ObjectList das beste.

Auch, wenn ich noch nicht lange OOP programmiere, würde ich dir vorschlagen eine Art "Rahmenklasse" zu schreiben, die deine Objekte instanziert, wieder freigibt und die Verwaltung der ObjectList übernimmt. Das hat dann auch den Vorteil, dass du nur noch eine(d.h. mit Form1, o.ä. zwei) globale Variablen hast.

mfg

Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz