Ich habe in meiner OpenGL anwendung mehrere Objekte, die ich alle über den Typ VisibleObject erstelle.
Wenn ich jetzt aber 10 Objekte oder mehr habe, die alle fast das gleiche machen, aber zum beispiel alle eine eigene Methode zum reagieren auf klicks auf selbiges Objekt brauchen, dann stellt stellt sich mir das Problem, dass ich mit meinem bisherigen Wissen in Delphi für jedes Objekt eine eigene Klasse brauche, was dann ja wirklich unübersichtlich wird, nur weil es da einen kleinen Unterschied gibt.
Ich würde ja gar nicht nach einer Lösung zu diesem Problem fragen, wenn ich es nicht von Java kennen würde, dass man da Methoden als Abstrakt definieren kann und die dann WÄHREND dem erstellen noch reinprogrammieren kann.
Die Init Methode würde dadurch zwar erheblich wachsen, aber das Programm ansich würde immernoch nur mit Instanzen von ein und dem selben Objekt arbeiten, was die Übersicht und den Arbeitsaufwand ja nun wirklich steigern würde.
Kann man dieses Prinzip auch irgendwie mit Delphi realisieren?
Ein Gedanke den ich auch hatte ist folgender:
Kann man eine Prozedur schreiben und die dann der Konstruktor-Methode per pointer übergeben?
Dann die Methode zum behandeln des Klickevents einfach die Methode, auf die der Pointer zeit ausführen lassen, und fertig?
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das was du meinst nennt sich "Callback", oder auch "Funktionpointer".
Sowas geht in Delphi. Schau dir z.B. mal den Typ "TList" an. dieser hat eine Funktion "sort" welche so einen Pointer erwartet.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Luke: Du hast ein paar Class zu viel.
Lanjan: Du musst zwischen 2 Möglichkeiten unterscheiden.
1. Procedure und 2. Procedure of Object;
In der VCL für die Events werden ausschließlich Procedure of objects verwendet. Der Unterschied liegt darin, dass die Procedure of Object zu einem Objekt gehört und dieses auch als unsichtbaren Parameter bekommt. Was manchmal sogar durchaus sehr praktisch ist. Die Procedure hingegen steht ziemlich alleine da.
In meiner glBitmap habe ich eine funktionsschnittstelle implementiert der man eine Procedur übergeben kann. Die wird das intern für jedes Pixel aufgerufen. Bis auf das Lukes code, an einigen Stellen, ein wenig komisch aussieht an hat er aber recht. Flashs Beispiel stimmt natürlich auch. TNotifyEvent ist denkbar schlecht als name, da es sich mit Sicherheit mit dem Originalen in die Quere kommen wird. Und sei es nur beim lesen.
Hier aber mal das was Luke meinte.
Code:
type
TBlubEvent =procedure(Sender:TObject);
TSomething =class(TObject)
public
OnClick: TBlubEvent;
constructor Create(OnClick: TBlubEvent);
end;
procedure OnClick1(sender:TObject);
begin
//....//
end;
procedure Whatever;
var
sth: TSomething;
begin
sth := TSomething.Create(OnClick1);
end;
Aus der Klasse kann es dann wie eine ganz normale Klasse aufgerufen werden.
@Flash: ein Callback (Normale Procedures keine of Object) ist doch nichts Anderes als das was dort gemacht wurde.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Um ehrlich zu sein, hab ich sowas noch nicht expliziet mit Delphi gemacht. Ich wusste nur das es geht. Das es da unterschiede gibt, wusste ich nicht. Deshalb meinen Post eher als randbemerkung verstehen.
Aber da sieht man mal wieder einen Punkt der in Delphi schöner ist als in C++. Wenn man in C++ nämlich einem Funktionpointer eine Methode einer Klasse zuweisen will, muss man sich fast die Hände brechen. Zum Glück komm ich da drumrum.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Dankeschön!
das ist ja alles sehr schön ausführlich.
Dass sowas grundsätzlich Möglich ist hatte ich auch schon gehört, ich wusste nur nicht genau wie.
Ich verstehe nur noch nicht 100% was das alles mit class of object heißen soll.
Heißt das einfach nur, dass ich da auch eine methode weitergeben kann, die teil eines Objekts ist, oder was?
Sowas brauche ich doch eigentlich nicht, oder?
Und wofür brauche ich den Sender? Kann ich den nicht einfach weglassen?
Gruß
jan
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also class of object gibt es nicht. Zu mindest heißt es wenn dann class of TKlasse aber das ist etwas ganz anders was jetzt wirklich zu weit führen würde.
für dich ist wichtig, dass du einen Typen definierst der si aussieht "... = procedure (...);" ... kannst du nach belieben verändern. Das "of object" kennzeichnet nur, dass es sich dabei um eine ObjektMethode handelt. Also diese Bestandteil einer Klasse ist. Die anderen Proceduten müssen immer globale Proceduren sein.
Das Sender kannst du natürlich nach belieben weglassen. Nur bei Komponenten oder sonst auch recht häufig kann es ganz praktisch sein, wenn man weiß wer einen aufgerufen hat. Bei einem Button.OnClick wäre der Sender der entsprechende Button.
Für den Code halte dich bitte an meinen Code oder streiche bei Luke die beiden class am Anfang der Zeile. die sind definitiv falsch und Delphi wird das auch anmeckern.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
@sniper:
Hier gibts ein äußerst ausführliches Tutorial zu Funktionpointer (in C u. C++). Leider nur in Englisch oder Französisch (obwohl der Typ ein deutscher ist... )
http://www.newty.de/fpt/index.html
Ich komm deshalb "drum rum" weil ich keine Methoden irgendwo anders ranbinden will. In meiner GL_SDL_UI übergebe ich ganz normale funktionen an eine Klasse, welche die dann als Methode verwendet.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Mi Dez 15, 2004 20:36 Beiträge: 454 Wohnort: Wien, Österreich
@Flash: So habe ich es auch bis jetzt gemacht....Ich dachte nur du hättest eine Lösung die "Delphi-Like" aussieht...( so wie properties ). Normalen funktion pointers sind längst im Einsatz.
_________________ "Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump
So, ich bin jetzt so weit, dass ich mit dem ganzen Callback Gedöhns anfangen kann und habe da jetzt auch schonmal einiges Programmiert.
Jetzt stehe ich allerdings vor GENAU dem Problem, welches ich befürchtet hatte, und wo ich eigentlich gehofft hatte, dass ich nur etwas falsch verstanden hatte.
Undzwar:
Bei der Anwendung die mir von euch dargelegt wurde (Funktion an ein Objekt weitergeben, welches diese Methode dann ausführt, wobei aber die Methode zu einem anderen Objekt gehört oder Objektlos ist) brauche ich ja innerhalb dieser übergebenen Prozedur nur Properties und Methoden die ich in der Unit habe, in der ich die Prozedur schreibe.
Was ich aber will ist, dass ich, wie ich das ja schon in meinem 1. Post angedeutet hatte, quasi die Klasse, an die ich die Methode abgebe, um diese Methode erweitere.
Die übergebene Methode soll also auf Properties und Methoden des Objekts, an welches sie übergeben wurde zugriff haben.
Das ist ja der Grund warum ich fragte, ob man die Klassen quasi beim erstellen innerhalb der anderen Unit zuende programmieren kann, so wie es in Java geht.
Das schlichte Problem welches ich jetzt habe ist, dass ich keinen Zugriff auf die Eigenschaften des Objekts habe, an die die Methode übergeben werden soll.
Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.