| Autor |
Beitrag |
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 04.03.07 19:07
Hallöle,
Das Problem kennt ihr bestimmt alle, und ich kann mich auch erinnern, dass Jemand mal ne Lösung dazu hatte. Ich weiß bloß nicht mehr, wer...
Und zwar habe ich eine Callbackfunktion (nicht WinAPI, sondern SDL, aber egal), die in einer Klasse liegt.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function TGame.glTimer1( interval: UInt32; param: Pointer ): UInt32; begin SDL_WM_SetCaption(pChar( WINDOWS_CAPTION + ' ['+IntToStr(Round(FPSCount * 1000/FPS_INTERVAL))+' FPS]') , nil); FPSCount := 0; Result := interval; end;
procedure TGame.Init_User; begin SDL_AddTimer(1000,@glTimer1,nil); end; |
Das geht logischerweise nicht, weil glTimer1 eine function of object ist, der erwarte Parameter aber eine function.
Irgendeinen Trick gabs da, wie war der noch gleich?
Danke,
Sebastian
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
HelgeLange
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: So 04.03.07 19:14
einfach nicht als Objekt-Funktion deklarieren. Object-Funktionen benutzen 8 byte statt 4, deswegen können sie nicht Zuweisungs-Kompatibel sein. Und die zusätzlichen 4 Byte braucht er für den Offset der Objekt-Daten 
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
Martok 
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 04.03.07 19:22
Stimmt ja, da war ja noch der Self-Pointer mit drin...
HelgeLange hat folgendes geschrieben: | | einfach nicht als Objekt-Funktion deklarieren. |
Ja gut, aber wie soll ich denn OOP ohne O(bjekte) machen?
Das Problem ist ja, dass ich mir einen OOP-Wrapper um das SDL bauen möchte, diese Prozedurale gefällt mir nicht wirklich. Wer mich kennt weiß, bei mir wird alles ein Objekt...
OK, im Prinzip habe ich nur eine Instanz dieser Klasse, sie ist die Game-Klasse. Aber trotzdem würde das alles kaputt machen.
Kann es sein, dass der Trick von Luckie war? Ach nee, Mist. Das war das, wie man einen TTimer in einer KonsolenApp benutzen kann. So mit TMethod und so. Also genau andersrum...
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 04.03.07 19:32
Hallo! Wenn ich das richtig sehe, erhält SDL_AddTimer einen Pointer als dritten Parameter. Damit müsste es doch möglich sein, dass so zu machen (oder so ähnlich, evtl. noch ein bisschen referenzieren und dereferenzieren  ): Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function glTimer1( interval: UInt32; param: Pointer ): UInt32; var selfGame : TGame; begin selfGame := TGame(Param); SDL_WM_SetCaption(pChar( WINDOWS_CAPTION + ' ['+IntToStr(Round(FPSCount * 1000/FPS_INTERVAL))+' FPS]') , nil); FPSCount := 0; Result := interval; end;
procedure TGame.Init_User; begin SDL_AddTimer(1000,@glTimer1,self); end; | Grüße Christian P.S.: Anstatt einer globalen Prozedur kannst Du ab Delphi 2005 auch eine Klassenmethode nehmen, welche als "static" deklariert wird. Die hat dann keinen versteckten self-Parameter und dürfte als Callback-Methode verwendbar sein. //edit: Oh, zumindest in 2005 sind klassenstatische Methoden nur in Delphi .NET drin. Vielleicht gibt's die in Delphi 2006 auch bei Win32?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
HelgeLange
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: So 04.03.07 19:38
ok, dann erkläre ich es mal für Objekt-Bastler, die einfach die Funktionsweise nicht kennen :
Wenn man eine Instanz von einem Objekt in Delphi erzeugt, wird nicht alles vom Objekt kopiert und basta, sondern es wird nur Speicher für die Daten des Objekts und seiner Vorfahren erzeugt und der Objekt-Zeiger ist ein Zeiger auf den Anfang dieser Daten. Funktionen und Proceduren werden nicht innerhalb dieses Speichers zu finden sein, diese liegen nur 1x im Speicher, ruft man sie auf, werden entsprechend neben den "normalen" parametern die objekt-Instanz mitgegeben (also der Zeiger auf den Start der Daten). Dadurch weiss das Objekt, auf welchen Datenbereich er zugreifen muss, damit er die Daten für das augenblickliche Objekt auch lesen/schreiben kann.
Technisch gesehen kannst Du daher folgendes machen in Delphi :
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| type TMyClass = class(TComponent) FHallo: String; public procedure HalloWelt; end;
procedure ZeigeHalloWelt; begin TMyClass.HalloWelt; end;
procedure TMyClass.HalloWelt; begin ShowMessage('Hallo Welt'); end; |
Und das liegt daran, dass Du nicht auf Daten des Objects zugreifst.
Was aber nicht geht :
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| type TMyClass = class(TComponent) FHallo: String; public procedure HalloWelt; end;
procedure ZeigeHalloWelt; begin TMyClass.HalloWelt; end;
procedure TMyClass.HalloWelt; begin FHallo := 'Hallo Welt'; ShowMessage(FHallo); end; |
So, zu Deinem Problem.. entweder findest Du eine Möglichkeit, die Object-Instanz mit zugeben oder Pech gehabt 
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
Martok 
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 04.03.07 19:45
Danke für die Erklärungen, Helge  Dein letzter Satz ist gut ;) @Christian: von Wäldern und Bäumen..... Ganz genau so gehts. Könnte sogar sein, dass dieser Parameter für sowas gedacht ist... Funktioniert jedenfalls 1a mit Übergabe über param. Schon die 2. Community in den Danksagungen...
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
HelgeLange
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: So 04.03.07 19:51
Ich hatte mir kurzzeitig überlegt, ob ich Dir das mit dem parameter verticke, den Du im Ursprung als nil mitgegeben hast, aber ich dachte mir, dass Du nach meiner Erklärung auch selber drauf kommen kannst. über selbst gefundene Sachen freut man sich einfach mehr und vergisst sie ned so schnell 
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
Martok 
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mo 05.03.07 00:07
Also jetzt wo ich weiß, was du damit erreichen wolltest, sehe ich die Hinweise auch...
Selbst nicht gefundene Sachen vergisst man aber auch nicht so schnell, jedenfalls sowas einfaches...
Wo ich doch das sogar vor ein paar Monaten mit irgend einer EnumWindows oder ähnlichem gemacht habe. 
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
|