Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Ereignisse mehrerer Instanzen eines Objectes in einem array
Daniel L. - Mo 06.09.10 19:47
Titel: Ereignisse mehrerer Instanzen eines Objectes in einem array
Hallo,
bin leider nicht so OOP fit, deshalb eine Frage:
ich nutze ein Object
TDieses = class
In TDieses ist eine Ereigniss deklariert: OnEspassiert
Nun brauche ich 10 Instanzen von diesem Object:
Delphi-Quelltext
1:
| var diese: array [0..9] of TDieses; |
creieren:
Delphi-Quelltext
1:
| for i := to 9 do diese [i] := TDieses.create; |
Soweit so gut.
Jetzt möchte ich in einer Espassiert Procedure rauskriegen, von welcher Instanz das Ereigniss ausgelöst wurde, um dann unterschiedlich reagieren zu können.
Delphi-Quelltext
1: 2: 3: 4:
| procedure Espassiert (Sender : TObject); begin if "durch diese [8] ausgelöst" then... end; |
Wie würde man das machen ?
(Es folgt natülich noch:
Delphi-Quelltext
1:
| for i := to 9 do diese [i].onespassiert := Espassiert) |
Danke + Gruss: Daniel
Moderiert von
Narses: Delphi-Tags hinzugefügt
Stundenplan - Mo 06.09.10 19:56
Hallo!
In Sender steht das Objekt, dessen Ereignis aufgerufen wird.
Viele Grüße,
Stundenplan.
Daniel L. - Mo 06.09.10 20:30
Meinst du sender.classname?
Da steht TDieses drin, nicht aber die auslösenden Instanz.
Daniel
NewMori - Mo 06.09.10 20:33
Daniel L. hat folgendes geschrieben : |
| Da steht TDieses drin, nicht aber die auslösenden Instanz. |
Sender ist eines der TDieses. Also ein Pointer auf eines der TDieses im Array. Wenn du in einer Loop Sender mit diese[0..9] vergleichst erhälst du irgendwann true.
Delphi-Quelltext
1: 2: 3: 4: 5:
| for i:=0 to 9 do begin if Sender=diese[i] then break; end; |
I enthält hiernach den Index der Instanz in Array.
Daniel L. - Mo 06.09.10 20:45
oh ja - Danke!!!
elundril - Di 07.09.10 06:44
NewMori hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5:
| for i:=0 to 9 do begin if Sender=diese[i] then break; end; | |
Ja, willst du denn das Gott eine Plage auf uns sendet, so in Sünde wie du schreibst? ;) Break ist in diesem Fall unangebracht und erhöht die Lesbarkeit des Codes überhaupt nicht. Man könnte die Schleife entweder gleich mit einer Ergebnisvariablen durchlaufen lassen oder man verwendet gleich die Abbruchbedingung als Abbruchbedingung:
Delphi-Quelltext
1: 2:
| while NOT Sender = diese[i] do inc(i); |
Weiters sollte man sich überlegen ob es nicht sinnvoll wäre gleich beim Anlegen der TDieses ein Integer-Feld zu deklarieren in dem man dann die Position speichern kann. Dann hätte man nicht eine O(n)-Laufzeit sondern eine O(1)-Laufzeit. Bei 8 Objekten ist das ja eigentlich egal, will es nur mal erwähnt haben.
lg elundril
Nersgatt - Di 07.09.10 07:45
elundril hat folgendes geschrieben : |
Delphi-Quelltext 1: 2:
| while NOT Sender = diese[i] do inc(i); | |
In dem Fall muss man sich aber 100% sicher sein, dass der Sender im Array gefunden wird. Sonst läuft man Zwangsläufig auf eine Exception wenn i > high(diese) wird. Nur so als Anmerkung.
zuma - Di 07.09.10 08:21
Nur mal so als kleine Anregung:
Statt eines Array's könnte man evtl. auch eleganter eine TObjectlist verwenden und in der dann recht einfach mit ObjectList.IndexOf(Sender) das richtige Objekt ermitteln.
Dadurch fällt zum einen die elende Schleifensucherei weg und zum andern bietet die Objectlist noch einige andere Vorteile.
Daniel L. - Di 07.09.10 14:15
Ich habs so gemacht
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| function Tmain.GetSenderIndex (Sender : TObject) : integer; var i, r : integer; begin r := -1; for i := 0 to 9 do if sender = dies [i] then r := i; result := r; end; |
Daniel
NewMori - Di 07.09.10 15:11
@Daniel: Du kannst nachdem if True ist die Schleife abbrechen, da du dein Objekt ja dann schon gefunden hast und die anderen es nicht mehr sein können.
Narses - Di 07.09.10 20:17
Moin!
Sofern die Liste statisch ist: das Objekt um eine Index-Property erweitern und beim Create den Index im Feld mitgeben. Dann kann man direkt darauf zugreifen. :idea: ;)
cu
Narses
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!