Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Wie Objekte in ObjectList identifizieren? (https://www.delphipraxis.net/156467-wie-objekte-objectlist-identifizieren.html)

Jazzman_Marburg 2. Dez 2010 19:45

Wie Objekte in ObjectList identifizieren?
 
Hallo Gemeinde!

Folgendes konzeptuelle Problem plagt mich:
In meinem Programm erzeugt der User durch einen Maus-Klick Buttons (TSpeedButton) durch:

Delphi-Quellcode:
PROCEDURE TMyClass.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

BEGIN

    FObjContainer.ADD(TSpeedbutton.CREATE( Self ));  // Button im Objekt-Container

    FAnzObj := FObjContainer.Count;

    WITH TSpeedbutton(FObjContainer.Items[FAnzObj-1]) DO // Durch FAnzObj Zugriff auf das eben erzeugte Objekt
    ...
D.h. es wird ein SpeedButton erzeugt und zum Objekt-Container (TObjectList) hinzugefügt. Auf dieses gerade erzeugte Objekt kann ich dann mit der oben gezeigten WITH Anweisung schön zugreifen.
Nun aber das Problem: Wenn der User die rechte Maus-Taste betätigt, soll das Objekt, auf welchem sich Maus befindet, gelöscht werden:

Delphi-Quellcode:
PROCEDURE TMyClass.BtnMouseUp(Sender: TObject; Button: TMouseButton;
                                 Shift: TShiftState; X, Y: Integer);

BEGIN

  IF Button = mbRight THEN
  BEGIN

    ( SENDER AS TSpeedButton ).FREE; // Der Button, der dieses Ereignis ausgelöst hat, wird gelöscht
    ...
Nun möchte ich aber das betreffende Objekt auch aus dem Objekt-Container löschen -- nur welches bzw. es existiert ja doch garnicht mehr, oder?
Die oben gezeigte Methode das Objekt mittels FREE loszuwerden ist ja auch nur ein Umweg: stattdessen sollte das Löschen ja direkt im Objekt-Container geschehen -- da ich aber nicht weiß wie ich dieses Objekt auf welchem die Maus sitzt identifizieren kann, habe ich es so gemacht -- dabei geht mir gerade durch den Kopf: Habe ich dadurch im Objekt-Container ein Zombie-Button erzeugt? Ich meine ich habe ja das Objekt mit ( SENDER AS TSpeedButton ).FREE; gelöscht -- aber im Objekt-Container existiert es ja noch, irgendwie...

Vielleicht kann ja jemand mal Licht in diese gruselige Geschichte bringen?

Vielen Dank & Gruß
Jazzman

Bummi 2. Dez 2010 19:55

AW: Wie Objekte in ObjectList identifizieren?
 
Statt TObject(Sender).Free
TObject(Sender) an eine Routine übergeben die das Objekt aus der Liste entfernt (langt bei FOb.OwnsObjects := true) ansonsten hinterher freigeben.

Jazzman_Marburg 2. Dez 2010 20:09

AW: Wie Objekte in ObjectList identifizieren?
 
Zitat:

Zitat von Bummi (Beitrag 1065758)
Statt TObject(Sender).Free
TObject(Sender) an eine Routine übergeben die das Objekt aus der Liste entfernt (langt bei FOb.OwnsObjects := true) ansonsten hinterher freigeben.

:gruebel:
Ich glaube, das habe ich nicht verstanden: "...an eine Routine übergeben die das Objekt aus der Liste entfernt"
Und woher weiss diese Routine, welches Objekt aus der Liste zu löschen ist? Ich dachte das sei ja mein Problem?! Woher soll diese Routine es wissen, wenn ich es doch auch nicht weiß?

Grübelnd
Jazzman

Satty67 2. Dez 2010 20:12

AW: Wie Objekte in ObjectList identifizieren?
 
was ergibt
Delphi-Quellcode:
ObjektList.Items.IndexOf(Sender)
.

Sir Rufo 2. Dez 2010 20:15

AW: Wie Objekte in ObjectList identifizieren?
 
Es soll ja ungemein bildend sein, die Hilfe zu Rate zu ziehen.

Dann findet man auch so tolle Sachen wie IndexOf und Delete

Möglich ist aber auch
Delphi-Quellcode:
theList.Remove( Sender );
Sender.Free;

Jazzman_Marburg 2. Dez 2010 20:21

AW: Wie Objekte in ObjectList identifizieren?
 
Zitat:

Zitat von Satty67 (Beitrag 1065764)
was ergibt
Delphi-Quellcode:
ObjektList.Items.IndexOf(Sender)
.

Schon gut, schon gut! :oops:
Jetzt habe ich es auch verstanden!

Vielen Dank -- ich hab da echt gepennt!

Gruß
Jazzman

Bummi 2. Dez 2010 20:22

AW: Wie Objekte in ObjectList identifizieren?
 
@Sir Rufo

wobei
Delphi-Quellcode:
Sender.Free;
wenn er die Standarddeinstellungen der Objektlist nicht verändert hat das nächste Problem für Ihn wird.

Sir Rufo 2. Dez 2010 20:28

AW: Wie Objekte in ObjectList identifizieren?
 
Zitat:

Zitat von Bummi (Beitrag 1065768)
@Sir Rufo

wobei
Delphi-Quellcode:
Sender.Free;
wenn er die Standarddeinstellungen der Objektlist nicht verändert hat das nächste Problem für Ihn wird.

Wo ich es geschrieben hatte, kam mir auch der Gedanke, ob Remove nun bei OwnsObjects das Object nicht auch gleich ins Nirwana befördert.
Jo, wenn es sicher sein soll, dann mit Extract und dann Free, oder doch mit Remove und nur wenn not OwnsObjects, dann Free

Wenn du wüsstest, wo ich mich gerade befinde, würdest du dich darüber auch nicht wundern :mrgreen:

Bummi 2. Dez 2010 20:42

AW: Wie Objekte in ObjectList identifizieren?
 
Zitat:

Wenn du wüsstest, wo ich mich gerade befinde, würdest du dich darüber auch nicht wundern
[OT]
neugierig machen gilt nicht :stupid:
[/OT]

Jazzman_Marburg 2. Dez 2010 20:47

AW: Wie Objekte in ObjectList identifizieren?
 
Zitat:

Zitat von Bummi (Beitrag 1065768)
@Sir Rufo

wobei
Delphi-Quellcode:
Sender.Free;
wenn er die Standarddeinstellungen der Objektlist nicht verändert hat das nächste Problem für Ihn wird.

Ganz bestimmt wird es für ihn ein Problem -- aber da lassen wir ihn erstmal reinlaufen... :shock:

Gruß
Jazzman

Bummi 2. Dez 2010 20:54

AW: Wie Objekte in ObjectList identifizieren?
 
Nein, ich hatte es Dir in Posting #3 bereits beschrieben, ich wußte nur nicht daß Du Remove nicht kennst.
Das Posting galt tatsächlich Sir Rufo, da er nicht darauf hingewiesen hatte.

himitsu 2. Dez 2010 21:10

AW: Wie Objekte in ObjectList identifizieren?
 
Zitat:

Zitat:

Delphi-Quellcode:
theList.Remove( Sender );
Sender.Free;

...
Probleme
...
Wenn man .Extract nutzt und dann .Free, dann kommt es auch nicht zu Problemen.
Und dieses funktioniert immer, egal ob man die ObjektListe die Objekte freigeben lassen würde oder nicht. :stupid:

Bummi 2. Dez 2010 21:25

AW: Wie Objekte in ObjectList identifizieren?
 
@himitsu

Sir Rufo hatte sich in #8 ja bereits korrigiert bzw. vervollständigt.

Hawkeye219 2. Dez 2010 21:28

AW: Wie Objekte in ObjectList identifizieren?
 
Hallo,

die Verwendung einer Delphi-Referenz durchsuchenTComponentList würde die Sache etwas vereinfachen.

Gruß Hawkeye

Bummi 2. Dez 2010 21:50

AW: Wie Objekte in ObjectList identifizieren?
 
@Hawkeye219

hilf mir, was ist der Vorteil gegenüber der TObjectlist IMHO castet sie nur TObject auf TComponent

Hawkeye219 2. Dez 2010 22:19

AW: Wie Objekte in ObjectList identifizieren?
 
Hallo Thomas,
Zitat:

Zitat von embarcadero docwiki
Das TComponentList-Objekt aktualisiert sich automatisch selbst, wenn eine Komponente freigegeben wird. Dazu wird der Verweis auf die betreffende Komponente gelöscht und die Liste gepackt.

Es ist doch wunderbar, wenn man sich bei der Freigabe von Komponenten nicht mehr um die Aktualisierung der Liste kümmern muss, findest du nicht?

Gruß Hawkeye

Bummi 2. Dez 2010 22:43

AW: Wie Objekte in ObjectList identifizieren?
 
Danke, das war mir bisher unbekannt. :thumb:

himitsu 2. Dez 2010 23:39

AW: Wie Objekte in ObjectList identifizieren?
 
Das ist aber keine reine Sache der Liste.

- TComponentList trägt sich beim Einfügen von Objekten als Owner ein
- TComponent-Nachfahren tragen sich, beim Freigeben aus ihrem Owner aus, also aus dieser Liste
> das Ganze wird übrigens von der VCL genutzt ... worin z.B. die Forms ihre Komponenten verwalten

Natürlich müssen dann die eigenen Objekte von TComponent abgeleitet sein
und man sollte sich nicht wundern, wenn der Owner seiner Komponente sich verändert.

Bummi 2. Dez 2010 23:48

AW: Wie Objekte in ObjectList identifizieren?
 
@himitsu

ich habe mir die Implementierung angeschaut, nachdem ich hier auf Neuland gestossen war wollte ich wissen wie es tickt ...
Bei den üblichen Anwendungsfällen werde ich wahrscheinlich ohnehin bei TList(gegf. TObjectlist) bleiben und alles so handhaben wie ich es gerade brauche, aber es war interessant für mich zu erfahren daß es einen Mechanismus wie in TComponentlist implementiert bereits von Haus aus gibt.

himitsu 3. Dez 2010 00:00

AW: Wie Objekte in ObjectList identifizieren?
 
Schau dir auch mal die generischen TList und TObjektList an.
Auch wenn die Generics nicht immer so toll funktionieren, aber hier sind die echt super.

Vorallem die TList<> ist IMHO gegenüber der notmalen TList schon eine gewaltige Erleichterung.
> integrierte Speicherverwaltung (bei Records und Co.)
> keine Typkonvertierungen mehr nötig.

Ansonsten steckt ja hinter TComponent + TComponentList keine große Hexerei und wenn dir der Overhead von TComponent für deine Objekte zuviel ist, dann kannst dir das ja einfach abgucken, erstellst dir 'ne eigene "TSmallComponent" (oder wie auch immer du sie nennst) und motzt dazu noch eine TObjectList oder TObjectList<> auf.

Bummi 3. Dez 2010 00:08

AW: Wie Objekte in ObjectList identifizieren?
 
ich habe mit den generics mal etwas herumgespielt, allerdings schwingt da noch eine gehörige Portion Misstrauen mit, mal sehen was wird.


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