![]() |
Indexen eines Arrays unterschiedliche Proz. zuweisen
Hiho ;)
Sagen wir, ich habe ein array of TIrgendwas und TIrgendwas ist so definiert:
Delphi-Quellcode:
An der Stelle (*) will ich - sobald im OnKeyDown Return reagiert (also das schaff ich schon *fg*),
type
TIrgendwas = record BlaBla: String; FooBar: Integer; // (*) OnDoMyProc: T...? end; ... var MyArr: array[0..1] of TIrgendwas; dass MyArr[EinInteger].OnDoMyProc ausgeführt wird. Ich hatte mir nun erstmal gedacht, dass OnDoMyProc vom Typ TNotifyEvent sein sollte, dann könnte ich zwar eine Prozedur zuweisen...aber wie löse ich sie aus? Daher meine Frage: Wie kann ich "OnDoMyProc" eine Prozedur zuweisen, die ausgeführt werden kann, wann ich es will? (Und jetzt bitte nicht sagen, ich soll beim Reagieren auf Return eine Fallunterscheidung machen *fg*) Danke schonmal :) air |
Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
Delphi-Quellcode:
Meinst du das?
if Assigned(MyArray[i].OnMyMethod) then
MyArray[i].OnMyMethod(Self); |
Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
machs doch einfach so:
Delphi-Quellcode:
tirgendwas=class
aldkjf:integer; alkadfjdfj:string; procedure abc(i:integer); end; [...] var myarray:array[0..1] of tirgendwas; [...] procedure tirgendwas.abc(i:integer); begin alkadfjdfj:=inttostr(aldkjf); aldkjf:=i; end; [...] procedure tform1.formcreate(...); var i:integer; begin for i:=0 to length(myarray)-1 do myarray[i]:=tirgendwas.create; end; [...] //Prozeduraufruf: myarray[i].abc(17); |
Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
*hust*
Manchmal gehts eben einfacher als man denkt *fg* Allerdings gehts noch nicht ganz. Wie muss denn mein Prozedurkopf und die enstprechende Zuweisung aussehen? Ich habs im Moment so:
Delphi-Quellcode:
Es kommt beim Prozedurkopf (also 1. Teil im QT) folgende Meldung:
procedure MyProc(Sender: TObject);
... MyArr[i].OnDoMyProc := MyProc; ... MyArr[i].OnDoMyProc(Self); Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur' MfG, air P.S. @ichbins Ich will die Prozedur ja auch nicht innerhalb des Records deklarieren ;) Und das will ich ohne Klasse machen, da die Prozedur sich in kein Muster fassen lässt und eine klasse den QT somit unnötig verlängern würde :) |
Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
Hi,
muss mal ganz kurz sagen, das QT unnötig verlängert wird finde ich ist mal ein super Satz! Ne ehrlich, weg mit diesen Kommentaren, Programme funktionieren auch ohne! Und die machen den QT nur unnötig lang! Aber mal ne generelle Frage, du musst doch die Prozedur irgendwann implementieren, wo und wann willst du das denn machen? Also was spricht dort dagegen, es in einer Klasse zu machen? |
Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
Die prozeduren werden in der Unit ja festgelegt.
Aber wenn ich nun in einer Klasse eine Prozedur festlege, arbeitet die immer mit dem selben Muster, ich kann höchstens ein paar Parameter wechseln. Es kann aber sein, dass die Prozeduren, die ich ausführen will, komplett und von grund auf verschieden sind ;) air P.S.: Würde ich in der Prozedur der Klasse übrigens je nach Fallunterscheidung eine andere externe Prozedur ausführen, kommt es nur auf eine kompliziertere Art raus, als die Fallunterscheidung schon bei der Erkennung des Returns durch GetAsyncKeyState zu machen... ;) @Der_Unwissende Kommentare erfüllen dann aber wenigstens für den Entwickler einen Sinn. Fast mein ganzes Projekt ist auf OOP aufgebaut, da spar ich schon nicht dran - aber hier sehe ich keinen Vorteil eine Klasse zu nehmen... |
Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
Zitat:
MyArray[ i ].OnDoMyProc will einen Zeiger auf eine Methode, was MyProc ja nicht ist, weil es nur eine 'reguläre Prozedur' ist. Luckie hat mal ein Beispiel geschrieben, wie man einen Timer in einer Konsolenanwendung verwenden kann, das Beispiel liegt auf seiner Homepage (ich tu den Link jetz nich posten, weils mir selber schon bei anderen Threads passiert ist, dass Luckie inzwischen die Struktur seiner HP und somit die URL geändert hat). Das ist dann in etwa das gleiche Schema. Du brauchst praktisch ein Objekt, um eine Mehtode zu haben :) //edit: Noch was *g* Wenn du auf Delphi 2006 wartest, dann kannst du in records auch Prozeduren und Funktionen definieren, ohne Friemelei ;) Records sind einfach nicht für Prozeduren gedacht, sondern halt einfach zur Datenspeicherung. //edit: Noch was :mrgreen: Das vorangestellte T ist eigentlich für Klassen gedacht, wenn dus bei anderen "Sachen" verwendest, ist das irreführend ;) //edit: Hab das Ganze mal selber getestet *g*
Delphi-Quellcode:
type
TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure Dingsda(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; MyRec = record IntBla: integer; StrBla: string[255]; OnDingsda: TNotifyEvent; end; var MyRec1: MyRec; procedure TForm1.Dingsda(Sender: TObject); // <--- Das klappt, weils jetz ne Methode ist begin // Würde auch klappen, wenn du statt TForm1 ein Dummyobjekt erzeugst ShowMessage(Sender.ClassName); // Haputsache, MyRec1.OnDingsda zeigt auf eine Methode end; procedure TForm1.Button1Click(Sender: TObject); begin MyRec1.IntBla := 234; MyRec1.StrBla := 'Hallo auch'; MyRec1.OnDingsda := Dingsda; MyRec1.OnDingsda(self); end; |
Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
Zitat:
|
Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
@Ultimator
Danke :) Werde das mal so umbauen ;) Ich dachte bisher immer das 'T' steht für Type, was für mich eig. nix mit Klassen zu tun hat, schließlich stehen Records nicht umsonst bei "type" :stupid: ;) air |
Re: Indexen eines Arrays unterschiedliche Proz. zuweisen
Das Problem an Methoden <-> lokale/globale Prozeduren ist eben, dass die Methoden noch einen versteckten Self-Parameter mitführen.
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz