Autor Beitrag
Daniel L.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 140
Erhaltene Danke: 14

W7, W8
TurboD Prof, Delphi Community
BeitragVerfasst: Mo 06.09.10 19:47 
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:
ausblenden Delphi-Quelltext
1:
var diese: array [0..9of TDieses;					


creieren:
ausblenden 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.
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 32

Win 7
Delphi 7 Pers., C# (VS 2010 Express)
BeitragVerfasst: Mo 06.09.10 19:56 
Hallo!

In Sender steht das Objekt, dessen Ereignis aufgerufen wird.

Viele Grüße,
Stundenplan.
Daniel L. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 140
Erhaltene Danke: 14

W7, W8
TurboD Prof, Delphi Community
BeitragVerfasst: Mo 06.09.10 20:30 
Meinst du sender.classname?
Da steht TDieses drin, nicht aber die auslösenden Instanz.

Daniel
NewMori
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45
Erhaltene Danke: 1



BeitragVerfasst: 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.
ausblenden 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.

_________________
Es ist keine Kunst in ein Programm 20 Fehler zu schreiben. Die Kunst ist es das Programm dann noch zum laufen zu bekommen.
Daniel L. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 140
Erhaltene Danke: 14

W7, W8
TurboD Prof, Delphi Community
BeitragVerfasst: Mo 06.09.10 20:45 
oh ja - Danke!!!
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Di 07.09.10 06:44 
user profile iconNewMori hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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:

ausblenden 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

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 07.09.10 07:45 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden 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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: 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.

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
Daniel L. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 140
Erhaltene Danke: 14

W7, W8
TurboD Prof, Delphi Community
BeitragVerfasst: Di 07.09.10 14:15 
Ich habs so gemacht
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45
Erhaltene Danke: 1



BeitragVerfasst: 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.

_________________
Es ist keine Kunst in ein Programm 20 Fehler zu schreiben. Die Kunst ist es das Programm dann noch zum laufen zu bekommen.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.