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

Aktuelle Zeit: Do Jul 03, 2025 13:50

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Pointer auf Proceduren
BeitragVerfasst: So Mai 08, 2011 21:29 
Offline
DGL Member

Registriert: Do Mai 05, 2011 14:43
Beiträge: 17
Ich habe schon in erfahrung bringen können das es möglich ist die eine procedure in einer Klasse auf das OnTimer event eines Timers ansprechen zu lassen, nur leider habe ich es selber nicht hingekriegt. Wenn jemand vlt. eine erklärung geben könnte was zu beachten ist wäre ich sehr erfreut.
Eine weitere Frage ist ob es möglich ist mehrer Prozeduren auf das OnTimer event ansprechen zu lassen oder ob das nur mit einer procedure möglich ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer auf Proceduren
BeitragVerfasst: Mo Mai 09, 2011 07:51 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Nun, mehrere Methoden ist nur dann möglich, wenn du dir eine Art Proxy baust, der die dann alle nacheinander aufruft. Den würdest du dann an das OnTimer-Event binden.

Für eine normale Klassenmethode ist das aber eigentlich trivial:
Code:
  1. type
  2.   TSomeClass = class(TObject)
  3.   []
  4.     procedure TimerEvent(Sender: TObject);
  5.   end;
  6. []
  7. procedure SomeProcedure;
  8. var
  9.   Timer1: TTimer;
  10.   SomeClassInstance: TSomeClass;
  11. begin
  12.   Timer1.OnTimer := SomeClassInstance.TimerEvent;
  13. end;


Wenn es sich um FreePascal im nicht-Delphi-Modus handelt, muss vor das SomeClassInstance in der vorletzten Zeile noch ein @, um klarzumachen, dass du einen Pointer auf die Methode willst.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer auf Proceduren
BeitragVerfasst: Mo Mai 09, 2011 21:43 
Offline
DGL Member

Registriert: Do Mai 05, 2011 14:43
Beiträge: 17
Ich benutze Delphi, also kein @.

Ist es dabei wichtig dass die Klasse vom typ TObject ist und der parameter der procedure den Sender enthält (auch wenn ich garnicht darauf zugreife)?

Kann ich in einen Stack auch pointer auf proceduren stecken? (es wird ja elementT verlangt) ; und vor allem, kann ich einen stack dann auch 1 zu 1 kopieren oder verweisen in dem fall nur pointer aufeinander wenn ich sage StackA := StackB `?(ich bin in delphi noch nicht ganz hinter die geschichte mit den pointern gestiegen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer auf Proceduren
BeitragVerfasst: Di Mai 10, 2011 07:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

es ist egal von welcher Klasse deine Klasse erbt, am Ende sind alle vom Typ TObjekt.

Es muss keine Methode eines Objekts sein, es gehen auch Methoden, die ganz normal in der Unit deklariert sind.

Die Parameter der Methode kannst du selbst frei bestimmten, ob Sender da mit drin ist oder nicht, ist egal. Die Parameter der Methoden müssen nur übereinstimmen. Aber wenn da was nich hin haut meckert eh der Compiler.

Wenn dein Stack mit Pointern arbeitet, dann ist ihm egal was für Pointer das sind. Also gehen auch Zeiger auf Methoden. Muss dann halt nur entsprechend gecastet werden oder wieder an einen entsprechenden Methoden-Zeiger zugewiesen werden.

Zu der Sache mit dem "kopieren". Sobald man ein Objekt anleget (üblicherweiße mit Create) bekommt man einen Zeiger auf das Objekt. Wenn du jetzt StackA := StackB machst, dann sind das nur 2 unterschiedliche Zeiger, die auf das selbe Objekt zeigen. Hier wird also nichts wirklich kopiert, außer die Referenz (der Zeiger auf das Objekt). Wenn du den Stack wirklich kopieren willst, dann solltest du die Methode Assign benutzen, die sollte normalerweiße bei jeder Delphi-Klasse implementiert sein. Dort werden die Werte des einen Stacks mit den Werten des anderen Stacks überschrieben. Wenn du jetz mit A ein Pop (oder Push oder sonstwas) machst, dann wird an B nix geändert. Die Zeiger die auf dem Stack gespeichert sind werden normalerweiße auch kopiert. ACHTUNG! nur die Zeiger werden kopiert! Sie zeigen trotzdem noch auf die selbe Methode (oder Variable/Objekt/... wenn man es nicht auf dein Problem bezieht). Das heißt wenn du dir von A per Pop den Zeiger holst und dann in der Variable auf die er zeigt etwas änderst, dann gilt das auch für den Zeiger der auf B liegt. Bei Methoden kann man ja nix ändern, aber ich sags lieber gleich, nich das du was falsch vestehst und dann irgendwann mal mächtig tief in der sch*** sitzt ;)

MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer auf Proceduren
BeitragVerfasst: Di Mai 10, 2011 14:15 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
Die Parameter der Methode kannst du selbst frei bestimmten, ob Sender da mit drin ist oder nicht, ist egal.
Stimmt grundsätzlich, aber ich bin mir ziemlich sicher, dass jemand, der sich damit nicht ohnehin schon auskennt, das falsch versteht. Es ist lediglich egal, ob der Parameter Sender heißt, aber der Parameter muss da sein. Auch wenn er nie benutzt wird. Andernfalls würde das mit der Parameterübergabe nicht hinhauen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer auf Proceduren
BeitragVerfasst: Di Mai 10, 2011 16:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Bergmann89 hat geschrieben:
Es muss keine Methode eines Objekts sein, es gehen auch Methoden, die ganz normal in der Unit deklariert sind.

Falsch. Die meisten Events sind als procedure of object deklariert, es muss(*) sich also um Methoden handeln. Deren Pointer bestehen nämlich intern aus zwei Pointern, einer auf den eigentlichen Code, der ausgeführt werden soll, und einer auf das Objekt, zu dem die Methode gehört.

greetings

(*) mit Typecasting und einem zusätzlichen Parameter kann man auch normale Prozeduren verwenden, aber dies ist dann ziemlich „hässlich“ und nicht mehr so ganz typensicher.

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer auf Proceduren
BeitragVerfasst: Di Mai 10, 2011 23:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

@sharkman: Wenn der Typ so angelegt wurde, dann muss der Parameter natürlich auch in der Methode vorhanden sein. Wenn er sich aber seine eigenen Events deklarieren will, dann kann er den Parameter "Sender" auch weg lassen, wenn er ihn nicht benötigt. So hab ich das jetzt aufgefasst.

@Lord Horazont: Die meißten, aber es gibt auch ausnahmen:
Code:
  1. type TListSortCompare = function (Item1, Item2: Pointer): Integer;
. Ich wollte das nicht einfach untern Tisch kehren, aber ich hab vlt etwas zu kurz ausgeholt und es is falsch rüber gekommen.

Kommt halt immer drauf an wie der Typ deklariert ist ;)

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]