Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Alle Instanzen einer Klasse benachrichtigen (https://www.delphipraxis.net/57289-alle-instanzen-einer-klasse-benachrichtigen.html)

freak4fun 18. Nov 2005 14:01


Alle Instanzen einer Klasse benachrichtigen
 
Hallo :hi:,
ich habe eine Klasse TMensch mit den Methoden Sagen und Hören. Ich habe mehrere Instanzen der Klasse. Wenn nun eine ein Mensch etwas sagt möchte ich den gesagten Text an alle anderen Menschen senden. Diese sollen dann darauf reagieren, oder es zumindest hören(in der Hören Methode). Ich möchte nicht jeden Mensch das gesagte einzeln zusenden, sondern an alle, da die sich ja nicht kennen und es auch nicht feststeht, wie viele Menschen da sind.
Ich hab nach Nachrichten und Events gesucht, aber nichts gefunden, das mir weiterhilft.
Ich hoffe ihr versteht was ich meine und könnt mir helfen. Sehr lieb wäre ein Beispiel. ;)

MfG
freak

dataspider 18. Nov 2005 14:12

Re: Alle Instanzen einer Klasse benachrichtigen
 
Hallo freak4fun,
google mal nach Observer Pattern.
Deine Instanzen der Klasse TMensch müssen sich bei einem Observer anmelden und auch an ihn die Nachricht schicken. Der Observer schickt sie an alle weiter, die sich bei ihm angemeldet haben.
Beim Zerstören einer Instanz muss sich wieder abgemeldet werden.
Wenn du nicht klarkommst, kann ich ein Beispiel posten.
Gruß, Frank

freak4fun 18. Nov 2005 15:19

Re: Alle Instanzen einer Klasse benachrichtigen
 
Hallo Frank,
danke für die schnelle Antwort. Das Prinzip trifft mein Problem zu 100%. Ich schaue mir das gerade an. Mit den Interface ist auch eine schöne Sache, da muss man sich nicht mehr um das Freigeben kümmern. Allerdings glaube ich du solltest dein Beispiel schon mal vorbereiten, weil so ganz steig ich da nicht durch. Ich werde mal posten, was ich hinbekommen hab, dann werden wir weiter sehen. :mrgreen:

MfG
freak

SirThornberry 18. Nov 2005 16:27

Re: Alle Instanzen einer Klasse benachrichtigen
 
du könntest auch einfach im Create von TMensch die Instanz (Self) in eine Liste hängen (die Liste könnte man ja beim Create als Parameter übergeben). Und wenn du dann alle Instanzen in einer Liste hast ist es ein leichtes diese zu benachrichtigen. (im Destroy natürlich wieder aus der Liste austragen)

freak4fun 18. Nov 2005 16:41

Re: Alle Instanzen einer Klasse benachrichtigen
 
@SirT: Ich hab ein dynamisches Array of TMensch erstellt, geht so eine Liste auch einfacher?

@spider: Ich bleib weiterhin auch an deine Idee dran. ;)

MfG
freak

shmia 18. Nov 2005 17:41

Re: Alle Instanzen einer Klasse benachrichtigen
 
1.) ein Liste der Klasse TObjectList ist besser, weil Items hinzugefügt und entfernt werden können,
ohne dass wie im Array Verschiebereien stattfinden.
2.) Die Liste darf es nur einmal geben, da sie zur Klasse TMensch gehört.
3.) Die Liste wird also als globale Variable im Abschnitt implementation geführt
4.) TMensch.Create trägt sich selbst in die Liste ein und TMensch.Destroy trägt sich selbst aus der Liste aus.
5.) TMensch.Create prüft, ob es die Liste schon gibt, falls nicht, wird sie erzeugt
6.) TMensch.Destroy prüft, ob es das letzte Objekt in der Liste war. Falls ja: FreeAndNil(liste)

tommie-lie 18. Nov 2005 18:24

Re: Alle Instanzen einer Klasse benachrichtigen
 
Zitat:

Zitat von shmia
1.) ein Liste der Klasse TObjectList ist besser, weil Items hinzugefügt und entfernt werden können,
ohne dass wie im Array Verschiebereien stattfinden.

TObjectList ist doch auch nur ein TList, was auch nur ein Array mit Zugriffsfunktionen ist. Man muss sich halt nur nicht mehr selber um das Verschieben kümmern, weil jemand anderes den Code schon geschrieben hat, den man selbst schreiben würde.

Der_Unwissende 18. Nov 2005 18:28

Re: Alle Instanzen einer Klasse benachrichtigen
 
Zitat:

Zitat von tommie-lie
Zitat:

Zitat von shmia
1.) ein Liste der Klasse TObjectList ist besser, weil Items hinzugefügt und entfernt werden können,
ohne dass wie im Array Verschiebereien stattfinden.

TObjectList ist doch auch nur ein TList, was auch nur ein Array mit Zugriffsfunktionen ist. Man muss sich halt nur nicht mehr selber um das Verschieben kümmern, weil jemand anderes den Code schon geschrieben hat, den man selbst schreiben würde.

Ja, aber ein Array ist auch nur ein Speicherbereich, stehen auch nur Bytes drin, auf die zugegriffen wird. Man muss sich beim Array nur nicht mehr um den Assembler dahinter kümmern :mrgreen:
Natürlich hat tommie-lie recht, aber ist das nicht der Sinn von Klassen? Abstrahieren und Arbeit abnehmen?

tommie-lie 18. Nov 2005 19:00

Re: Alle Instanzen einer Klasse benachrichtigen
 
Zitat:

Zitat von Der_Unwissende
aber ist das nicht der Sinn von Klassen? Abstrahieren und Arbeit abnehmen?

Schon, aber man hört immer wieder, daß TList ach so toll und ach so gut gegenüber einem Array sei, weil Arrays ja generell alle doof sind, weil man da ständig rumkopiert. Bei einer TList wird genauso rumkopiert, nur muss man sich den Code nicht selber schreiben. Die Aussage von shmia bis zum ersten Komma unterstütze ich ja auch, TList ist besser, aus den von dir genannten Gründen, nämlich weil der code schon da ist, warum sollte man ihn selber schreiben? Daß aber im Gegensatz zum Array keine Verschiebereien stattfinden, ist nicht nur nicht richtig, sondern auch noch falsch, deswegen mein Einwand.


Edit: Es wird spät, ich fange an die Kommas an die falschen Stellen zu setzen...

freak4fun 18. Nov 2005 19:08

Re: Alle Instanzen einer Klasse benachrichtigen
 
Ich bin dabei von dynamischen Array auf TList umzustellen. :mrgreen:

[edit] In der Liste sind ja nur Pointer, da bekomm ich meine TMeschObjekte gar nicht wieder. :( [/edit]

MfG
freak


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr.
Seite 1 von 2  1 2      

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