Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 03:38

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Objekte unterschiedlich erstellen
BeitragVerfasst: Fr Jan 20, 2006 15:18 
Offline
DGL Member

Registriert: Do Dez 01, 2005 12:55
Beiträge: 41
Hallo DelphiGLer!

Mir stellt sich folgendes Problem:

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?

Gruß
Jan


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 20, 2006 15:35 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 20, 2006 15:40 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
naja, wie macht das denn die VCL, wenn du auf deinem Formular zwei Buttons mit unterschiedlichen Klick-Ereignissen hast? Zwei Klassen generieren? :shock:

Nein, einfach einen (TNotify-) Event auslösen.

Code:
  1.  
  2. type
  3.  TNotifyEvent = procedure(Sender: TObject);
  4.  
  5.  TSomething = class(TObject)
  6.   public
  7.    OnClick = TNotifyEvent;
  8.    constructor Create(OnClick: TNotifyEvent);
  9. end;
  10.  
  11. procedure OnClick1(sender: TObject);
  12. begin
  13. //....//
  14. end;
  15.  
  16. procedure Whatever;
  17. var sth: TSomething;
  18. begin
  19.   sth := TSomething.Create(OnClick1);
  20. end;
  21.  


So in etwa sollte das funktionieren. Du hast also für jede Instanz eine eigene OnClick-Prozedur.

_________________
Bild

"User Error. Replace User and hit Continue."


Zuletzt geändert von luketheduke am Fr Jan 20, 2006 23:30, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 20, 2006 15:57 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Du kannst natürlich auch deinen eigenen Funktionspointer/Callback Typ definieren:

Code:
  1. type
  2. TCallback_mit_Objekt = procedure(Sender: TObject);
  3. TCallback_mit_int_Object = procedure(count : int; Sender: TObject);


Das geht entsprechend auch. Eventuell findest du dazu mehr bei DSDT.de

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Zuletzt geändert von Flash am Fr Jan 20, 2006 16:12, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 20, 2006 16:00 
Offline
DGL Member
Benutzeravatar

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:
  1. type
  2.   TBlubEvent = procedure(Sender: TObject);
  3.  
  4.   TSomething = class(TObject)
  5.   public
  6.     OnClick: TBlubEvent;
  7.     constructor Create(OnClick: TBlubEvent);
  8.   end;
  9.  
  10. procedure OnClick1(sender: TObject);
  11. begin
  12.   //....//
  13. end;
  14.  
  15. procedure Whatever;
  16. var
  17.   sth: TSomething;
  18. begin
  19.   sth := TSomething.Create(OnClick1);
  20. 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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 20, 2006 16:15 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 20, 2006 16:56 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
Zum Glück komm ich da drumrum.
Wie wäre es wenn du mir eine PN diesbezüglich schicken würdest (wie du das machst...)? :wink:

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 20, 2006 17:30 
Offline
DGL Member

Registriert: Do Dez 01, 2005 12:55
Beiträge: 41
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 20, 2006 17:58 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 20, 2006 23:29 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
Ja... die dunkle Seite der Macht ergreift eben langsam in Gestalt von C# Besitz von mir... daher muss das class gekommen sein...

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 21, 2006 17:11 
Offline
Guitar Hero
Benutzeravatar

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... :roll: )
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 21, 2006 17:30 
Offline
DGL Member

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

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 28, 2006 21:37 
Offline
DGL Member

Registriert: Do Dez 01, 2005 12:55
Beiträge: 41
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.

Kann man das irgendwie umgehen?

Gruß
Jan


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 29, 2006 00:32 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
na, da wagen wir doch noch einmal einen Blick auf die VCL: Da wird die Instanz einfach mit übergeben.

Code:
  1.  
  2. procedure Event(Sender: TObject);
  3. begin
  4.   with (Sender as TMyInheritedClass) do
  5.     begin
  6.        SomeProperty := SomeValue;
  7.     end;
  8. end;
  9.  


8)

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 29, 2006 18:52 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Genau. Die Callbacks bekommen einen Pointer auf die Klasse mit, welche die Funktion benutzt (in der VCL "Sender").

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]