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..9of 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 user profile iconNarses: 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

user profile iconDaniel L. hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconNewMori hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:


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